Использование smarty функций с json

317
23 июня 2017, 08:37

Пытаюсь сделать infinite scroll, с php, smarty и jquery ajax. Как я понял, для того, чтоб не нагружать сильно сервер идеально осуществлять весь процесс на клиентской части и получать ответ в формате json. Проблема в том, что мне необходимо использовать функции движка smarty. Немного кода, чтоб вы поняли, что я имею в виду:

$.each(data.content, function(key, value ){
if(value.comment !=''){
//Что касается даты, то smarty здесь работает и можно использовать date_format
html += '<div class="timeline-date"><i class="fa fa-calendar"></i> 
{'+value.date+'|date_format:"%B %d, %Y %I:%M %p"}</div>';
html += '</div>';
//Но вот с функциями, беда
html += '<p>{'+value.comment+'|smarty_modifier_autolink|nl2br|mention}</p>';
}
}

В браузере, все, что я получаю - +value.comment+ вместо самого комментария. Я не дружу с json или javascript-ом может есть еще, какой нибудь способ рендерить json, чтоб можно было использовать smarty функции? Буду рад любому совету или подсказке! Всем большое спасибо!

Answer 1

Не знаю какой движок вы используете, если испольузете, и как именно вы используете smarty. Но вот такой пример, возможно он будет несколько в виде "псевдокода".

Допустим, вы на странице прокручиваете комментарии. и в какой то момент, вам нужно запросить у сервера новую порцию данных. Сервер вам возвращает некоторый объект data (судя по вашему коду). В этом объекте есть data.content - сведения комментах (ну или еще чем-нибудь). Видимо помимо данного поля, там имеются и другие поля, может быть data.count с количеством комментариев, и т.п.

вариант, как это можно устроить следующий: у вас имеется скрипт ajax_comments.php (либо это метод контроллера, или еще что-нибудь, в зависимости от архитектуры). Данный скрипт генерирует этот объект $data.

$comments = Comments->find()   // условное получение части комментов из БД
                    ->where(['published' => 1])
                    ->toArray(); 
// ваши данные
$data = [
           'content' => null, 
           'count' => count($comments),
           .... // еще какие-то поля
        ]; 

$smarty = new Smarty();
// передали данные в шаблон 
$smarty->assign('comments', $comments);
// получили вывод шаблона в переменную
$data['content'] = $smarty->fetch('comments.tpl');
// упаковали все в JSON. вывод шаблона в виде строки
echo json_encode($data);
exit;

ваш шаблон для комментариев comments.tpl, будет примерно следующий (не очень ясна структура):

{foreach $comments as $c}
    <div class="timeline-date">
        <i class="fa fa-calendar"></i> 
        {$c.date|date_format:"%B %d, %Y %I:%M %p"} 
    </div>
    <div>
       <p>{$c.comment|nl2br}</p>
    </div> 
{/foreach}

Ваш ajax-запрос к серверу для получения новой порции комментариев, должен быть примерно такой:

$.post("ajax_comments.php", { ... параметры ...}, function(data){
   // делаете что-то с дополнительными данными
   alert(data.count);
   // добавляете комментарии к странице
   $("#comments").append(data.content);
});
READ ALSO
Как выронить меню по центру блока?

Как выронить меню по центру блока?

Перечитал варианты, но почему-то они не работают на конкретном сайтеКак сделать меню по центру страницы корректно? Имеется ввиду margin 0 auto

289
Как стилизовать капчу от Google - reCAPTCHA V2

Как стилизовать капчу от Google - reCAPTCHA V2

Стили подтягиваются через скрипт во фрейм, динамически

930
mysql view to simple query

mysql view to simple query

Для примера есть такая схема таблиц и view:

171
Определить что прошло не больше 5 минут mysql

Определить что прошло не больше 5 минут mysql

Подскажите как сделать запрос на определение что прошло время не больше 5 минут?

291