Помогите связать js и smarty

#16 16 апреля 2013 в 15:20
Еще раз повторю JS не будет обрабатывать код и переменные Smarty без парсера
Вы можете передать ему только готовую DOM-структуру или очередную ссылку на ajax запрос который её предварительно сформирует…
#17 16 апреля 2013 в 15:23
А вообще очень перемудрёное решение — упрощайте на сколько возможно…
Начиная со ссылки с хешем
_http://мой_сервер/clubs/16#clubs_ajax_getphotos/data_club/album_id:1058 — >
_http://мой_сервер/clubs/16#album_id:1058… остальные параметры явно лишние…
#18 16 апреля 2013 в 15:31

Не?

lokanaft
не) если в переменной встречаются такие символы как { }, то скрипт перестает работать если применяем {literal}
#19 16 апреля 2013 в 15:39

А вообще очень перемудрёное решение — упрощайте на сколько возможно…
Начиная со ссылки с хешем

• Mike •
это решение рабочее и гибкое, позволяет его использовать в разных разделах сайта, достаточно вынести логику для ajax запроса в отдельный файл и прописать у ссылки хэш строку, скрипт отрабатывает на ура.
Да и дело то не в этом скрипте smile

Немного продвинулся в своей проблеме.
Во-первых чтобы вставить smarty переменную в JS
мы используем {/literal}{literal}, где между ними и вставляется переменная, но вот соль оказалась в том, что
если в переменной есть фигурные скобки { }, то похоже ругается уже сам смарти! и они должны быть заключены обратно в {literal}, сейчас думаю как на этапе формирования $html сделать замену и экранирование, но проблема именно в этом.
#20 16 апреля 2013 в 15:46
lokanaft же верно всё подсказал. У вас там ошибка. Вы неправильно применили {literal}.

не) если в переменной встречаются такие символы как { }, то скрипт перестает работать если применяем {literal}

Smith
Ну что вы говорите? Сотни раз применяли, работало. У вас не работает. smileДело в том, что {literal}{/literal} это для смарти. Смарти обработает, внутри этих тегов не отреагирует на символ переменной $, который, например применяется для jquery. В конце смарти отдаст html код, в котором уже нет этих тегов {}. И только после этого в браузере клиента начнет работать js. Так откуда же у вас встречаются символ {} в js коде. Только оттого, что вы сначала пишете закрывающий тег {/literal}, а затем открывающий {literal}.
#21 16 апреля 2013 в 15:51

Ну что вы говорите? Сотни раз применяли, работало. У вас не работает. Дело в том, что {literal}{/literal} это для смарти. Смарти обработает, внутри этих тегов не отреагирует на символ переменной $, который, например применяется для jquery. В конце смарти отдаст html код, в котором уже нет этих тегов {}. И только после этого в браузере клиента начнет работать js. Так откуда же у вас встречаются символ {} в js коде. Только оттого, что вы сначала пишете закрывающий тег {/literal}, а затем открывающий {literal}.

Марат

проверьте следующий код:
на этапе формирования шаблона в php сформируйте переменную:
$test = "{";
и затем в шаблоне выведите ее в следующем виде:
{if $test}
{literal}
<script>
alert('{/literal}{$test}{literal}');
</script>
{/literal}
{/if}

И вы увидите, что ничего работать у вас не будет

На этапе формирования переменной в php нужно сделать замены { — на {ldelim}, а } — на {rdelim}
Это уже результат моих мучений с выводом smile
#22 16 апреля 2013 в 16:01

проверьте следующий код:

Smith
б-р-р-р, что-то мы с вами совсем запутались. Откуда же в переменной $test у вас символ "{"? Ну, в вашем случае, это переменнная $html. Мы же с вами туда записали html код, взятый из буфера. Или вы хотите чтобы js исполнял код smarty?
Со знаком "{" конечно не заработает. И то можно обойти так $test = htmlspecialchars("{");
#23 16 апреля 2013 в 16:05

б-р-р-р, что-то мы с вами совсем запутались. Откуда же в переменной $test у вас символ "{"? Ну, в вашем случае, это переменнная $html. Мы же с вами туда записали html код, взятый из буфера. Или вы хотите чтобы js исполнял код smarty?
Со знаком "{" конечно не заработает. И то можно обойти так $test = htmlspecialchars("{");

Марат

Вот и я про тоже)
Дело в том, что эти знаки появляются когда формируется второстепенный шаблон и в нем тоже есть js код, вот на него и начинает ругаться.

Насчет предыдущего поста и примера, беру слова обратно, с altrt'ом все отрабатывает.
Сам запутался, сейчас еще раз все буду перепроверять, чтобы точно уже установить в каких ситуациях рушится выполнение скриптов JS а также smarty
#24 16 апреля 2013 в 16:12
Smith, усложняете себе задачу. Я же вам подсказывал решение с инклудом второго шаблона в основной шаблон. Просто прячете в display:none и затем покываете js-скриптом.
Ладно. Успокойтесь, сходите попейте чаю, отдохните и всё получится ) Главное, вникнуть.
#25 16 апреля 2013 в 16:16

Ладно. Успокойтесь, сходите попейте чаю, отдохните и всё получится ) Главное, вникнуть.

Марат
Это точно, наверное сказывается отсутствие кофе с самого утра laugh
#26 16 апреля 2013 в 16:28
в начале кода js присвойте свою переменную до всяких литералов
var html_out = {html}; и в js коде используйте уже её, с литералами или без неважно…

$().html( html_out );
#27 16 апреля 2013 в 20:34
c выводом шаблона разобрался:

php файл который формирует основной и второстепенный шаблон:

  1.  
  2. ..........
  3. ..........
  4. ..........
  5. ..........
  6. $smarty = $inCore->initSmarty('components', 'com_clubs_view_photo.tpl');
  7. $smarty->assign('club', $club);
  8. $smarty->assign('photo', $photo);
  9. $smarty->assign('is_admin', $is_admin);
  10. $smarty->assign('is_moder', $is_moder);
  11. $smarty->assign('is_author', $is_author);
  12. $smarty->display('com_clubs_view_photo.tpl');
  13.  
  14. [b]Если нам необходимо переменную, которой присвоили буфер, добавлять в JS скрипт, то обязательно нужно зачистить эту переменную следующим образом:[/b]
  15.  
  16. $html = str_replace("\"","'",ob_get_clean());
  17. $order = array("\r\n", "\n", "\r");
  18. $replace = " ";
  19. $html = str_replace($order, $replace, $html);
  20. ............
  21. [i]далее в продолжаем формировать основной шаблон[/i]
  22. ............
  23. ............
  24.  
Сам шаблон:
  1.  
  2. {if $photo}
  3. <script>
  4. var html_out = "{$html}";
  5.  
  6. {literal}
  7. $(function(){
  8. ...........
  9. ...........
  10. $('#popup_content').html(html_out);
  11. $('#popup').fadeIn('slow');
  12. ...........
  13. ...........
  14. });
  15. {/literal}
  16. </script>
  17. {/if}
  18.  
Проблема решена на 50%, так как если во второстепенном шаблоне есть JS код, то все рушится, сейчас размышляю на тему, как их подгрузить на страницу и выполнить.
В моем случаи это скрипт:
  1.  
  2. <script language='JavaScript' type='text/javascript' src='/components/comments/js/comments.js'></script>
  3. <script type='text/javascript'>
  4. var anc = '';
  5. if (window.location.hash){
  6. var anc = window.location.hash;
  7. }
  8. loadComments('club_photo', 250, anc);
  9. addComment('club_photo', '250', 0);
  10. </script>
  11.  
который отвечает за комментарии фотографии.
#28 16 апреля 2013 в 21:06
в шаблоне com_clubs_view_photo.tpl пропишите в начале {strip}… и в хвосте {/strip}
тогда вот этого:
  1.  
  2. $html = str_replace("\"","'",ob_get_clean());
  3. $order = array("\r\n", "\n", "\r");
  4. $replace = " ";
  5. $html = str_replace($order, $replace, $html);
  6.  
можно не делать а убрать только слеши
  1.  
  2.  
#29 16 апреля 2013 в 21:16

в шаблоне com_clubs_view_photo.tpl пропишите в начале {strip}… и в хвосте {/strip}

• Mike •
Действительно, спасибо! Единственное нужно не удалять слэши, а наоборот добавить их, так как вставляем в JS

#30 16 апреля 2013 в 23:12
• Mike •, Марат, Спасибо за помощь и мысли на которые наталкивали, все получилось! В карму поблагодарил v

Осталось подправить мелкие баги и натянуть дизайн, результат следующий:
Открываем сообщество:

Далее выбираем альбом, где без перезагрузки загружаются фото в правую колонку:

И затем при выборе фото, также ajax'ом грузится шаблон ее отображения в всплывающем окне:


Все работает достаточно быстро, но нужно еще доработать код. Получилось по логике также, как реализовано в VK и FB
Если кому будет интересна реализация, могу помочь smileВерсия 1.10.1
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.