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

#1 15 апреля 2013 в 20:27
Приветствую всех.

Логика доработки:
В вайле который отдает данные через ajax, есть такая строка:
  1.  
  2. $html = $smarty->fetch('com_clubs_view_photo.tpl');
  3. $smarty->assign('html', $html);
  4.  
Затем в самом шаблоне есть JS скрипт, где он создает div, и должен помещать в него переменную {$html}
с помощью:
  1.  
  2. $('#pop').html({$html});
  3.  
На последнем этапе все стопорится, в новый созданный объект не передается переменная из smarty, выручайте, перепробовал уже все…
#2 15 апреля 2013 в 20:35
  1.  
  2. {literal}
  3. ...
  4. $('#pop').html({/literal}{$html}{literal});
  5. ...
  6. {/literal}
  7. Внутри тегов {literal}{/literal} smarty не подставляет значения переменных.
  8.  
#3 15 апреля 2013 в 20:43
Марат, это был мой второй вариант, не работает)
#4 15 апреля 2013 в 20:53
Дело в том, что когда таким образом пытаюсь вставить html код, JS вообще перестает работать, может данную подстановку нужно как то экранировать?
#5 15 апреля 2013 в 21:39
почему такой вариант? не проще выдать html код без смарти? echo в файле с кодом и реализуйте там же шаблон.

Посмотрите что пишет в консоле браузера.
#6 15 апреля 2013 в 21:48

echo в файле с кодом и реализуйте там же шаблон.

smb
Такой вариант выбран для того чтобы открыть основной шаблон (со списком фотографий в клубе) и всплывающим окном (с помощью JS создаем новый объект div, с затемнением и прочими плюшками) вывести другой шаблон с отображением самой фотографии (функционал можно понять на примере VK или FB),
т.е. человек открывает список фото, формируется запрос к php файлу, который ajax'ом будет выводить шаблон и если в запросе есть переменная photo, то он должен загрузить еще один файл шаблона и вывести его в всплывающем окне.
#7 15 апреля 2013 в 21:52
В консоле браузера ничего нет.
Подозреваю, что дело в том, когда мы загружаем шаблон в переменную, у нас там находятся smarty элементы, различные {if} {foreach} и т.д., думаю нужно сделать сначала замену их как происходит в обычном шаблоне, а затем уже присваивать переменной JS.

Но вот что то совсем запутался с этим делом(
#8 15 апреля 2013 в 23:27
Всё правильно подозреваете…
JS работает с «чистым» html…
В самой системе множество примеров, реализации всплывающих окон на ajax ( nyromodal.js, common.js и в js-файлах компонентов)…
#9 16 апреля 2013 в 00:16
Smith, по документации fetch() и display() подобны, за исключением того, что fetch() может присваивать вывод переменной, как в вашем случае. Можете попробовать ещё вот так(в системе обычно так используют):
  1.  
  2. $smarty = $inCore->initSmarty('components', 'com_clubs_view_photo.tpl');
  3. $smarty->assign('club', $club);
  4. $smarty->assign('photo', $photo);
  5. $smarty->assign('is_admin', $is_admin);
  6. $smarty->assign('is_moder', $is_moder);
  7. $smarty->assign('is_author', $is_author);
  8. $smarty->display('com_clubs_view_photo.tpl');
  9. $html = ob_get_clean();
  10.  
И затем уже передаете $html в другой шаблон. Предварительно не забудьте все переменные в первом шаблоне проинициализировать нужными значениями.
Да ещё, пропустил в первом чтении, разве не так должно быть?
  1.  
  2. $('#pop').html('{/literal}{$html}{literal}');
  3.  
$html обернут в кавычки.
Надеюсь, я правильно понял задачу? smile
#10 16 апреля 2013 в 00:17

Всё правильно подозреваете…
JS работает с «чистым» html…
В самой системе множество примеров, реализации всплывающих окон на ajax ( nyromodal.js, common.js и в js-файлах компонентов)…

• Mike •

Сделал чтобы создавался див и в нем ajax'ом подгружался, достаточно не удачная реализация, спасибо за то что заставили еще раз посмотреть подробнее common.js)), думаю попробовать следующий вариант:
в основной шаблон подключить шаблон который будет в всплывающем окне, и затем с помощью json загружать данные в него.
#11 16 апреля 2013 в 00:22


Smith, по документации fetch() и display() подобны, за исключением того, что fetch() может присваивать вывод переменной, как в вашем случае. Можете попробовать ещё вот так(в системе обычно так используют):

  1.  
  2. $smarty = $inCore->initSmarty('components', 'com_clubs_view_photo.tpl');
  3. $smarty->assign('club', $club);
  4. $smarty->assign('photo', $photo);
  5. $smarty->assign('is_admin', $is_admin);
  6. $smarty->assign('is_moder', $is_moder);
  7. $smarty->assign('is_author', $is_author);
  8. $smarty->display('com_clubs_view_photo.tpl');
  9. $html = ob_get_clean();
  10.  
И затем уже передаете $html в другой шаблон. Предварительно не забудьте все переменные в первом шаблоне проинициализировать нужными значениями.
Да ещё, пропустил в первом чтении, разве не так должно быть?
  1.  
  2. $('#pop').html('{/literal}{$html}{literal}');
  3.  
$html обернут в кавычки.
Надеюсь, я правильно понял задачу? smile

Марат

А вот это я упустил, нужно изучить что такое ob_start(); и ob_get_clean();, возможно Ваш вариант будет еще лучше чем те костыли на которых остановился.
Попробую обязательно оба варианта, и отпишу что заработало и если заработаю оба варианта, то поделюсь, что лучше, думаю кому-нибудь да пригодится))

Спасибо, товарищи за полезные наводки! smile
#12 16 апреля 2013 в 03:31
Проблема —> Задача —> Логика —> Реализация —>…
По обрывкам кода который вы приводите сложно понять чего вы пытаетесь достичь…
Возможно, простейший способ — скопировать участок кода из компонента ( типа do == 'view_photo' ) в php файл вызываемый через ajax и обойтись вообще без Smarty сгенерировав нужный html в этом же файле, если вы не собираетесь распространять свой шаблон в массы…
Но это только предположение, для конкретики не хватает информации…
#13 16 апреля 2013 в 07:57
• Mike • прав. Чем точнее донесена задача, тем более вероятен правильный ответ.
Ещё хотелось сказать про то, как будет выглядеть ваш код. Конечный html-код страницы, который отдается браузеру.
  1. $('#pop').html('тут_очень_длинный_html_код');
Поэтому гораздо правильнее будет, наверно, сделать вот так
В файле шаблона
  1.  
  2. <div id="pop" style="display:none;">
  3. {include file="com_clubs_view_photo.tpl"}
  4. </div>
  5.  
Возможно придется подставлять полный путь PATH.'/путь/файл'
А в js сделать так:
  1.  
  2. $('#pop').show();
  3.  
Так будет красивее.
Но я всё же сторонник аяксовых решений. Лучше вообще этот popup подгружать аяксом.
#14 16 апреля 2013 в 14:45
Пока висит опять VPS решил отписаться)

По обрывкам кода который вы приводите сложно понять чего вы пытаетесь достичь…

• Mike •
Согласен, сложно судить когда мало информации.
Дело в том, что очень много изменений, которые вышли бы за рамки этой темы.

Сейчас у меня реализовано:
Навигация по хэш ссылке, например человек переходит по ссылке:

мой_сервер/clubs/16#clubs_ajax_getphotos/data_club/album_id:1058

1. Движок выдает основной клуб с ID номером 16
2. После загрузки срабатывает парсер хэш ссылки:
Извлекает из адреса строку: #clubs_ajax_getphotos/data_club/album_id:1058,

3. разбивает ее на переменные, и аяксом грузит в определенный объект ответ от требуемого файла, пример:
#clubs_ajax_getphotos/data_club/album_id:1058 =>
file: components/clubs/ajax/getphotos.php
ответ будет вставлен в объект с ID: data_club
album_id:1058 — это параметры, которые будут переданы getphotos.php (их может быть любое количество)
4. После успешного выполнения ajax запроса помещаем данные в указанный див.

Таким образом мне это позволяет не перегружая всей страницы, грузить определенный контент в определенную часть сайта с сохранением навигации в браузере (в зависимости от того какой блок был указан в ссылке)

После этой загрузки, становится доступен список фото альбома 1058.
Следующая задача, над которой я сейчас работаю, это при клике на фото, чтобы она загружалась в всплывающем окне.
т.е. ссылка на фото будет уже: #clubs_ajax_getphotos/data_club/album_id:1058/photo:id
теперь getphotos.php проверяет не было и ему передано ID фото, и если да, то формирует попутно шаблон.

Вчера с помощью ob_start() ob_get_clean() получилось сформировать шаблон в буфере и затем записать его в переменную $html

После чего эту переменную отдаем основному шаблону, в котором есть код:

  1.  
  2. {if $html}
  3. ............
  4. ............
  5. $('#pop').html('{literal}{$html}{/literal}');
  6. $('#pop').fade........
  7. ............
  8. ............
  9. {/if}
  10.  
Вот здесь и все и стопориться. Если просто вывести {$html} в шаблоне, то все отлично, а вот если передавать в JS скрипт то последний перестает работать.

Анализируя все варианты возможной реализации, пока самый лучший тот на котором остановился, за исключением проблем с добавлением переменной в JS
Также обратил внимание, что JS ругается на спец символы в переменной {$html}, например "{" — эти скобки от других скриптов находящихся в переменной, вчера пол ночи пытался экранировать их, но экранируются все, кроме { }, может еще что-то.

т.е. основная проблема сейчас это вставить переменную smarty, в которой могут быть также дугие скрипты в JS скрипт основного шаблона
#15 16 апреля 2013 в 15:13
  1. {if $html}
  2. хтмл
  3. {literal}
  4. яваскрипт
  5. ............
  6. ............
  7. $('#pop').html('{/literal}{$html}{literal}');
  8. $('#pop').fade........
  9. ............
  10. ............
  11. яваскрипт
  12. {/literal}
  13. хтмл
  14. {/if}
Не?
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.