Возможно ли в смарти шабонах прервать отрабтку оног, как в сниппете die($res)? Объясню, что я хочу. Тем более, что пишу на половину, чтобы рассказать о удобном методе работы с ajax, пусть и не идеальном. Хотя все решаетцо наверняка очень просто и меня щас будут стыдить, что мало читал доки по смарти и т.д. )))
Есть старый добрый метод аджаксоделанья, когда на верх шаблона вставляешь сниппет
// если в заголовке XMLHttpRequest, как при ajax-запросах методом jquery, то работаем, нет - сниппет вырубаетцо.
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
// что-нибудь возвращаешь
$res = 'Hello World!';
// прерываешь работу шаблона
die($res);
Там в сниппете мы должны были отдать какой-то контент. А как мы получаем и отдаем контент в смарти-шаблонах? Ну получаем через $smarty.request/$smarty.post/$smarty.get соответствующим образом переданные параметры (или не принимаем), набиваем их в массив через assign, передаем в процессор и отображаем результат. И все это можно вынести в отдельный темплейт и отображать в шаблоне страницы как-то так {include file=«inc/shop/product.tpl»}
Ну и как можно модернизировать сниппет выше в смарти-виде?
{if $smarty.server.HTTP_X_REQUESTED_WITH == 'XMLHttpRequest'}
{include file="inc/shop/product.tpl"}
{else}
содержание шаблона.
{/if}
Теперь отправляем нужные параметры на страницу $.ajax — и понеслось. И заменяем полученный результат на тот, что в нашем (это метод $.ajax)
success: function (data) {
$('.ajax-block').replaceWith(data);
}
Собственно прелесть в том, что за отображение на сайте и возвращения аджаксом отвечает один шаблон и любые изменения в первом автоматически же отражаются и во-втором. Конечно, кто-то возразит, что дергать конечный html это не тру и трафика много тратится. Но это просто ооочень удобный метод, который с шаблонами смарти становится намного удобнее. Конечно, в сниппете это тоже можно было имитировать, но выводом аджакса и отображением на сайте нужно было заниматься отдельно.
Собственно в чем вопрос. В сниппете мы могли написать die($res); и отработка шаблона прекратилась, а нам бы вернулось то, что есть. В смарте же такое не канает? Шабоны в смарти наследуются, но такой блок, чтобы вверху было
{if $smarty.server.HTTP_X_REQUESTED_WITH == 'XMLHttpRequest'}
{include file="inc/shop/product.tpl"}
// от здесь бы прерывать отрисовку шаблона
{else}
содержание шаблона.
{/if}
неудобно. Может быть можно как-то похожем образом прервать выполнение шабона, чтобы он остановился? А то приходится в главном layout.tpl писать if-else конструкцию. А это не очень хорошо и не очень удобно.
UPD
Если для кому неудобно обертывать весь родительский лейаут в if, то можно сделать плагин на OnWebPageInit и условиями
if ($modx->event->name == 'OnWebPageInit' AND $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
// Получаем ресурс
if (!is_object($modx->resource)) {
$modx->resource = $modx->request->getResource($modx->resourceMethod, $modx->resourceIdentifier);
}
..........
Ну, и конечно + определяем id и прочие ваши проверки. Но это не так удобно т.к. невозможно переопрделить отдаваемое содержимое в зависимости от шаблона. Зато понимаш, без обертки if :)