Smith

Smith

+206
Репутация
674
Рейтинг
#1 Помогите связать js и smarty 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 скрипт основного шаблона
#2 Помогите связать js и smarty 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
#3 Помогите связать js и smarty 16 апреля 2013 в 00:17

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

• Mike •

Сделал чтобы создавался див и в нем ajax'ом подгружался, достаточно не удачная реализация, спасибо за то что заставили еще раз посмотреть подробнее common.js)), думаю попробовать следующий вариант:
в основной шаблон подключить шаблон который будет в всплывающем окне, и затем с помощью json загружать данные в него.
#4 Помогите связать js и smarty 15 апреля 2013 в 21:52
В консоле браузера ничего нет.
Подозреваю, что дело в том, когда мы загружаем шаблон в переменную, у нас там находятся smarty элементы, различные {if} {foreach} и т.д., думаю нужно сделать сначала замену их как происходит в обычном шаблоне, а затем уже присваивать переменной JS.

Но вот что то совсем запутался с этим делом(
#5 Помогите связать js и smarty 15 апреля 2013 в 21:48

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

smb
Такой вариант выбран для того чтобы открыть основной шаблон (со списком фотографий в клубе) и всплывающим окном (с помощью JS создаем новый объект div, с затемнением и прочими плюшками) вывести другой шаблон с отображением самой фотографии (функционал можно понять на примере VK или FB),
т.е. человек открывает список фото, формируется запрос к php файлу, который ajax'ом будет выводить шаблон и если в запросе есть переменная photo, то он должен загрузить еще один файл шаблона и вывести его в всплывающем окне.
#6 Помогите связать js и smarty 15 апреля 2013 в 20:53
Дело в том, что когда таким образом пытаюсь вставить html код, JS вообще перестает работать, может данную подстановку нужно как то экранировать?
#7 Помогите связать js и smarty 15 апреля 2013 в 20:43
Марат, это был мой второй вариант, не работает)
#1 Помогите связать js и smarty 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, выручайте, перепробовал уже все…
#8 Как сделать оповещение о новых статьях 15 апреля 2013 в 19:10
v
#9 Обновление 15 апреля 2013 в 01:50

У меня хаков много. Поэтому и страшно затевать переезд

Александр Корн

Сейчас работаю над сайтом на инстанте, уже более 50 изменений в самом движке, но абсолютно все записано в отдельном файле, что, где, как и для чего было изменено и дописано, думаю такая практика может помочь)
#10 Как сделать оповещение о новых статьях 15 апреля 2013 в 01:42
В frontend.php, есть событие:

cmsCore::callEvent('ADD_ARTICLE_DONE', $article);

Думаю можно на него с помощью плагина завязать, логика следующая:
Публикуется статья, плагин собирает ее параметры (название, дату, кто написал и прочее по усмотрению), затем производим выборку из БД пользователей, которые разрешили присылать им уведомления, и после чего шлем сообщения.

При беглом просмотре функционала, мне это видится примерно так zst
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.