Основы Ajax
Ajax — это метод асинхронного запроса к серверу. Текущая страница html с помощью скрипта обращается к серверу с определенным вопросом, получает ответ и что-то с ним делает. Обычно — вставляет результат в страницу.
Итак, пишем простейший сниппет для получения запроса:
Тут все очевидно: сниппет ловит ajax запросы (а мы все делаем через jquery, который любезно шлет серверу заголовок HTTP_X_REQUESTED_WITH), проверяет, задано ли действие и пытается дать для него ответ.
Пару слов о прерывании парсера. Этот метод я придумал сам, и мне кажется, он гораздо удобнее, нежели использование отдельного php файла.
Лично мне нравится, что мои сниппеты в зависимости от запроса могут работать и через ajax, и просто при обычной загрузке, не завися ни от кого.
Классический же метод состоит в том, чтобы завести отдельный скрипт на сервере, который будет принимать все ajax запросы, и отвечать на них.
Или создать отдельную страницу, сделать к ней пустой шаблон, запихать туда опять же, один сниппет и прописывать в нем все методы ответов.
В общем, решайте сами, как вам больше нравится, статья моя — пишу как делаю я.
Конечно, мы будем использовать jQuery. Скрипт просто в теле страницы.
Всего несколько строчек кода и вы можете использовать асинхронные запросы.
Дальше нужно набивать новые методы в сниппет (вызов wayfinder, например), расставлять ссылки по страницам и развешивать обработчики событий на них.
Можно добавить к ссылке новый атрибут data-update="" и писать туда имя элемента для обновления. А при получении ответа вставлять его не в #result, как железно забито сейчас, а в указанный элемент. Тогда вы одними ссылками можете сделать сайт полностью на ajax.
Чуть изменить js скрипт и ссылку попробуйте сами.
Надеюсь, теперь, принцип ясен.
Как это сделать?
Итак, пишем простейший сниппет для получения запроса:
<?php
// Откликаться будет ТОЛЬКО на ajax запросы
if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
// Сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
// Если в массиве POST нет действия - выход
if (empty($_POST['action'])) {return;}
// А если есть - работаем
$res = '';
switch ($_POST['action']) {
case 'helloWorld':
$res = 'Hello World!';
break;
// А вот сюда потом добавлять новые методы
}
// Если у нас есть, что отдать на запрос - отдаем и прерываем работу парсера MODX
if (!empty($res)) {
die($res);
}
Тут все очевидно: сниппет ловит ajax запросы (а мы все делаем через jquery, который любезно шлет серверу заголовок HTTP_X_REQUESTED_WITH), проверяет, задано ли действие и пытается дать для него ответ.
Пару слов о прерывании парсера. Этот метод я придумал сам, и мне кажется, он гораздо удобнее, нежели использование отдельного php файла.
Лично мне нравится, что мои сниппеты в зависимости от запроса могут работать и через ajax, и просто при обычной загрузке, не завися ни от кого.
Классический же метод состоит в том, чтобы завести отдельный скрипт на сервере, который будет принимать все ajax запросы, и отвечать на них.
Или создать отдельную страницу, сделать к ней пустой шаблон, запихать туда опять же, один сниппет и прописывать в нем все методы ответов.
В общем, решайте сами, как вам больше нравится, статья моя — пишу как делаю я.
Страница и скрипт
Конечно, мы будем использовать jQuery. Скрипт просто в теле страницы.
<!-- Наш сниппет, при обычной загрузке он ничего не делает -->
[[!Ajax_test]]
<!-- Подключаем jquery с сервера Яндекса -->
<script type="text/javascript" src="http://yandex.st/jquery/1.7.1/jquery.min.js"></script>
<!-- Наш скрипт запроса и обработки -->
<script type="text/javascript">
$(document).ready(function() {
// Вешаем обработчик события "клик" на все ссылки с классом ajax_link
$('a.ajax_link').click(function() {
// Берем действие из атрибута data-action ссылки
var action = $(this).data('action');
// Ajax запрос к текущей страницы (а на ней наш сниппет) методом post
$.post(document.location.href, {action: action}, function(data) {
// Выдаем ответ
alert('Запрос успешно выполнен')
$('#result').html(data);
})
// Не даем ссылке кликнуться - нам же не нужна перезагрузка страницы?
return false;
})
})
</script>
<!-- Ссылка с нужным классом и data - атрибутом, с действием -->
<a href="#" data-action="helloWorld" class="ajax_link">Привет, мир!</a>
<!-- html элемент для вставки ответа от php -->
<div id="result"></div>
Можно копипастить в контент страницы.Итог
Всего несколько строчек кода и вы можете использовать асинхронные запросы.
Дальше нужно набивать новые методы в сниппет (вызов wayfinder, например), расставлять ссылки по страницам и развешивать обработчики событий на них.
Можно добавить к ссылке новый атрибут data-update="" и писать туда имя элемента для обновления. А при получении ответа вставлять его не в #result, как железно забито сейчас, а в указанный элемент. Тогда вы одними ссылками можете сделать сайт полностью на ajax.
Чуть изменить js скрипт и ссылку попробуйте сами.
Надеюсь, теперь, принцип ясен.
Комментарии: 86
Василий, добрый день можете пояснить 1 момент.
// Берем действие из атрибута data-action ссылки
var action = $(this).data('action');
Ведь по идее .data('data-action') надо запрашивать судя по описанию функции
в чем фокус? ))
// Берем действие из атрибута data-action ссылки
var action = $(this).data('action');
Ведь по идее .data('data-action') надо запрашивать судя по описанию функции
в чем фокус? ))
Код более важен, чем комментарии.
Не пойму что тут не понятно! несколько раз перечитывал, все номрально написано. И правильно не .data('data-action'), а .data('action')
Да я и не говорил, что в коде ошибка. Я его прочел и понял просто хочется понять не поверхностно.
Я не профи в программировании и просил пояснить работу функции.
Я первым делом полез посмотрел спецификацию по функции .data('name') в таком случае вернется значения параметра нейм.
А по сути в коде возвращается событие
те action выходит как зарезервированный в функции параметр или что?
Извиняюсь за глупые вопросы
Я не профи в программировании и просил пояснить работу функции.
Я первым делом полез посмотрел спецификацию по функции .data('name') в таком случае вернется значения параметра нейм.
А по сути в коде возвращается событие
те action выходит как зарезервированный в функции параметр или что?
Извиняюсь за глупые вопросы
Вам нужно почитать тут api.jquery.com/data/
Есть такой параметр data, через тире указывается его имя, а через равно — значение.
То есть, data-action=«getList» получается в jQuery как
var action = $('selector').data('action');
Вот и все.
Есть такой параметр data, через тире указывается его имя, а через равно — значение.
То есть, data-action=«getList» получается в jQuery как
var action = $('selector').data('action');
Вот и все.
Добрый день. Спасибо за статью. Подскажите пожалуйста как вызвать wayfinder с помощью ajax? Т.е. со страницы с помощью ajax передаю параметр в обработчик. В обработчике нужно в зависимости от этого параметра вызвать wayfinder с startId(изменяется для различного входного параметра). Как этот вызов wayfinder'a передаётся на начальную страницу.
…
case '5':
$params = array();
$start = 1;
$params[«startId»]=$start;
$res = $modx->runSnippet('Wayfinder', $params);
У меня возвращает пустое значение.
Спасибо.
…
case '5':
$params = array();
$start = 1;
$params[«startId»]=$start;
$res = $modx->runSnippet('Wayfinder', $params);
У меня возвращает пустое значение.
Спасибо.
Вроде все верно. Смотрите логи на ошибки, и пробуйте вызвать так же, только без Ajax.
Вывести результат то не забыли?
echo $res; die;
Вывести результат то не забыли?
echo $res; die;
Всё действительно отлично. Спасибо. Искал ошибку не там. Не было дочерних ресурсов в одном из списков, оттого и на выходе было пустое значение.
Я не силен в программировании, простите за глупый вопрос.
«Ответ сервера» формируется в сниппете с помощью die($res), и, по видимому, подхватывается методом $.post() автоматически.
А как этим способом обратиться к двум разным скриптам на одной странице?
Т.е. как различить ответ сниппета А и сниппета Б?
«Ответ сервера» формируется в сниппете с помощью die($res), и, по видимому, подхватывается методом $.post() автоматически.
А как этим способом обратиться к двум разным скриптам на одной странице?
Т.е. как различить ответ сниппета А и сниппета Б?
После die() другие сниппеты не работают. Это будет единственный ответ.
Ваши 2 разных скрипта должны реагировать на 2 разных action — для того оно и надо.
Ваши 2 разных скрипта должны реагировать на 2 разных action — для того оно и надо.
Добрый день. Василий, спасибо за статью. Пытался сделать функционал по аналогии с Вашим решением. Сервер шлет в ответ браузеру на XMLHttpRequest запрос 200ok, а данные не приходят. Попробовал применить Ваш код без изменений, ситуация аналогичная. То есть перезагрузки не происходит, сообщение: «Запрос успешно выполнен» выводится, а «helloWorld» нет. В чем может быть ошибка? MODx — Evolution.
Сейчас проверил. Если просто создать отдельный файл в корне, то ответ нормально приходит. Если делать через MODx, то в ответ приходит полная html страница. Получается, что сниппет не отрабатывает?
чтобы не приходил весь html — выведи вызов сниппета на отдельную страницу с пустым шаблоном.
Это понятно. Но тогда не получится одной страницей обрабатывать обычные и AJAX запросы, как это было описано в данной статье.
Получится, только нужна проверка на отлов асинхронных запросов, далее (аз). Если сервер не обнаружил в заголовке «аз», то отдать все остальное, а если обнаружил обработать полученный запрос, отдать результат и сделать обрыв.
Где-то Уважаемый Василий об этом писал и пример обрыва парсера тоже присутствовал.
Где-то Уважаемый Василий об этом писал и пример обрыва парсера тоже присутствовал.
Наконец освоил Ваш урок. Низкий поклон.
Хотелось бы привести пример:
Воспользовавшись сниппетом getResourceField вывести данные поля нужного ресурса
Код сниппета ajax:
Я создал отдельно ресурс в корне контекста, под названием ajax и соответствующим псевдонимом, он доступен по адресу mysite.ru/ajax.html, содержащий:
Вероятно чтобы «не путался под ногами» вызов сниппета и централизовать адрес ajax запросов. На всякий случай задал пустой шаблон и, само собой, скрыл для меню.
Код в теге HEAD используемого для примера шаблона:
Код в теге BODY, в любом удобном месте, используемого для примера шаблона:
При загрузке страницы с заданным шаблоном, используемым для примера, в тег div, под идентификатором results, произведётся асинхронная загрузка содержимого поля content ресурса с ID 56.
Хотелось бы привести пример:
Воспользовавшись сниппетом getResourceField вывести данные поля нужного ресурса
Код сниппета ajax:
// Откликаться будет ТОЛЬКО на ajax запросы
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
// сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
$action = $_POST['action'];
// Если в массиве POST нет действия - выход
if (empty($action)) {return;}
//А если есть - работаем
$res = '';
switch ($action) {
case 'field':
$params = array();
$params['id'] = $_POST['id'];
$params['field'] = $_POST['field'];
$res = $modx->runSnippet('getResourceField', $params); break;
// А вот сюда потом добавлять новые методы
}
// Если у нас есть, что отдать на запрос - отдаем и прерываем работу парсера MODX
if (!empty($res)) {
die($res);
}
Я создал отдельно ресурс в корне контекста, под названием ajax и соответствующим псевдонимом, он доступен по адресу mysite.ru/ajax.html, содержащий:
[[!ajax]]
Вероятно чтобы «не путался под ногами» вызов сниппета и централизовать адрес ajax запросов. На всякий случай задал пустой шаблон и, само собой, скрыл для меню.
Код в теге HEAD используемого для примера шаблона:
<script type="text/javascript" language="JavaScript" src="assets/js/jquery/main.js"></script>
<script type="text/javascript" language="JavaScript">
jQuery(function($){
$('#results').load('ajax.html', {action: 'field', id: '56', field: 'content'}, function(){
alert('Запрос успешно выполнен! Данные получены.');
});
});
</script>
Код в теге BODY, в любом удобном месте, используемого для примера шаблона:
<div id="results"></div>
При загрузке страницы с заданным шаблоном, используемым для примера, в тег div, под идентификатором results, произведётся асинхронная загрузка содержимого поля content ресурса с ID 56.
Реализую похожий метод +history.js. Хотелось бы знать, как обращаться к странице чтобы при аякс запросе выдавался пустой шаблон, а при обычном соответственно «непустой»
Если только плагином ловить и проверять HTTP_X_REQUESTED_WITH, а потом пробовать динамически менять шаблон.
Я в последних разработках обращаюсь к специальному файлу, который запускается в MODX_API_MODE, но там есть свои заморочки.
Я в последних разработках обращаюсь к специальному файлу, который запускается в MODX_API_MODE, но там есть свои заморочки.
Вообще у меня мысль сводилась к вставке [[!Ajax_test]] в начало шаблона.
соответственно при аякс-обращении сначала выполнятся будет сниппет и либо переключать переменную шаблона (в этом месте у меня зациклился мозг), либо выдавать [[*content]]
в эту сторону можно как то двигаться?
соответственно при аякс-обращении сначала выполнятся будет сниппет и либо переключать переменную шаблона (в этом месте у меня зациклился мозг), либо выдавать [[*content]]
$modx->resource->_content
и завершать работу парсера, но тут тоже нерабочий быдлокод вышел в итоге =(в эту сторону можно как то двигаться?
1. Старайся отвечать на комментарий, а не создавать новую ветку.
2. При твоём варианте, шаблон уже загружается, значит ты ничего не выигрываешь. Поэтому, либо плагин, либо файл.
Ну, либо делай как в заметке и не парься. Там работа обрывается командой die() — и ничего кроме ответа на Ajax не выводится.
2. При твоём варианте, шаблон уже загружается, значит ты ничего не выигрываешь. Поэтому, либо плагин, либо файл.
Ну, либо делай как в заметке и не парься. Там работа обрывается командой die() — и ничего кроме ответа на Ajax не выводится.
Я вот писал небольшой плугин для смены шаблона ресурса на лету, там есть описание как сделать чтобы при аякс запросе ресурсу назначался пустой шаблон modx.im/blog/triks/391.html
Спасибо, простенько, но именно то что нужно ;)
Уважаемый Василий! Огромное спасибо за статью.
Со всем вроде разобрался, но, как водится, нашел куда упереться — прошу помощи:
При активации функции (ссылка class=«ajax_link»), возвращается список ссылок class=«ajax_link».
А они работать никак не хотят:( То есть все ссылки, которые были в момент первой загрузке страницы — работают, а новые — не хотят.
Не могли бы подсказать, что это может быть за болячка?
Заранее благодарен,
Дмитрий.
Со всем вроде разобрался, но, как водится, нашел куда упереться — прошу помощи:
При активации функции (ссылка class=«ajax_link»), возвращается список ссылок class=«ajax_link».
А они работать никак не хотят:( То есть все ссылки, которые были в момент первой загрузке страницы — работают, а новые — не хотят.
Не могли бы подсказать, что это может быть за болячка?
Заранее благодарен,
Дмитрий.
Заметка написана давно и там не учтены кое-какие вещи. Например то, что функция click() вешается только один раз на все подходящие элементы — при загрузке страницы.
После появления, кажется jQuery 1.7 нужно использовать функцию on():
После появления, кажется jQuery 1.7 нужно использовать функцию on():
$(document).on('click', 'a.ajax_link', function(e) {
var action = $(this).data('action');
$.post(document.location.href, {action: action}, function(data) {
alert('Запрос успешно выполнен');
$('#result').html(data);
})
e.preventDefault();
})
При таком обработчике все ссылки будут проходить через него, независимо от их происхождения.
Кстати по поводу e.preventDefault(); есть такой момент, рекомендуют его в начале функции писать, т.к. если вдруг в скрипте во время выполнения всплывет ошибка, перехода по ссылке не будет, т.к. стандартное поведение мы уже сбросили.
Т.е. вот так
Т.е. вот так
$(document).on('click', 'a.ajax_link', function(e) {
e.preventDefault();
var action = $(this).data('action');
$.post(document.location.href, {action: action}, function(data) {
alert('Запрос успешно выполнен');
$('#result').html(data);
})
})
Но так же можно использовать return false; в конце функции, потому что e.preventDefault(); не во всех браузерах правильно срабатывает
Не, return false это такая коварная штука, которая помимо предотвращения действия по умолчанию, ещё и останавливает «всплытие» события по DOM. А иногда это бывает ой как не хорошо.
Лучше уж сферическое «e.preventDefault(); не во всех браузерах правильно срабатывает», чем долгий и нудный поиск бага на тему — почему же закрывается js-модальное окно или кастомный комбобокс…
Кстати, лично вы встречали какие-либо проблемы при использовании e.preventDefault()? Я лично нет (даже в ишаках, включая 7й), хотя верстаю много и (возможно) профессионально.
Лучше уж сферическое «e.preventDefault(); не во всех браузерах правильно срабатывает», чем долгий и нудный поиск бага на тему — почему же закрывается js-модальное окно или кастомный комбобокс…
Кстати, лично вы встречали какие-либо проблемы при использовании e.preventDefault()? Я лично нет (даже в ишаках, включая 7й), хотя верстаю много и (возможно) профессионально.
Согласен с вами, я не пользуюсь return false.
Вот в этой статье об это подробно рассказано bolsterweb.com/2011/01/javascript-e-preventdefault-is-not-return-false/
Вот в этой статье об это подробно рассказано bolsterweb.com/2011/01/javascript-e-preventdefault-is-not-return-false/
Да об этом много где написано, но сам я это не усвоил, пока не потратил несколько часов на устранение описанных выше багов :-)
Ошибочка вышла в комментарии…
Правильно надо так:
Правильно надо так:
поиск бага на тему — почему же НЕ закрывается js-модальное окно или кастомный комбобокс
Василий, Иван, огромное спасибо за помощь!
Заработало:)
Заработало:)
Всем добрый день!
Василий подскажи, а как можно реализовать в твоем сниппете (в статье), чтобы сработало перенаправление на другую страницу, по типу:
Голову сломал как оборвать работу ajax сниппета и перенаправить пользователя на страницу.
Как такое можно сделать?
Я могу повесить на success методе в ajax window.location на страницу нужную, но хочу серверное решение.
Василий подскажи, а как можно реализовать в твоем сниппете (в статье), чтобы сработало перенаправление на другую страницу, по типу:
case 'sendData':
$res = $component->sendData($param);
$url = $this->modx->makeUrl(104);
return $this->modx->sendRedirect($url);
break;
у меня в итого приходит в страницу через ajax вызов страницы с ID = 1. Голову сломал как оборвать работу ajax сниппета и перенаправить пользователя на страницу.
Как такое можно сделать?
Я могу повесить на success методе в ajax window.location на страницу нужную, но хочу серверное решение.
Прочитай еще раз, что такое Ajax.
Это фоновый запрос от тебя, который возвращает браузеру ответ от сервера. При этом та страница, на которой ты находишься, ничего не делает, просто ждёт.
Отсюда вывод — твоя задача решается только через javascript.
Но не нужно расстраиваться, ведь любое перенаправление юзера — это просто команда браузеру перейти на другу страницу. Что через javascript, что через заголовки от php.
То есть, тут вообще нет «серверного решения», если вдуматься.
Это фоновый запрос от тебя, который возвращает браузеру ответ от сервера. При этом та страница, на которой ты находишься, ничего не делает, просто ждёт.
Отсюда вывод — твоя задача решается только через javascript.
Но не нужно расстраиваться, ведь любое перенаправление юзера — это просто команда браузеру перейти на другу страницу. Что через javascript, что через заголовки от php.
То есть, тут вообще нет «серверного решения», если вдуматься.
Василий спасибо за ответ!
Прочитал, да все верно говоришь. Тогда не буду извращаться больше, сделаю через window.location.
Прочитал, да все верно говоришь. Тогда не буду извращаться больше, сделаю через window.location.
Василий, подскажите, есть 2 вопроса:
1. вызываю Ditto — вывод есть, но в шаблоне есть конструкция с использованием сниппета If и соответственно его вызов не отрабатывается, как это полечить?
2. Фильтрация реализована через сниппет, который обрабатывает url (catalog.html/?f=man) и формирует строку для параметра &filter. Соответственно фильтрация тоже не работает.
есть ли решение данных проблем (особенностей)
заранее спс.
1. вызываю Ditto — вывод есть, но в шаблоне есть конструкция с использованием сниппета If и соответственно его вызов не отрабатывается, как это полечить?
2. Фильтрация реализована через сниппет, который обрабатывает url (catalog.html/?f=man) и формирует строку для параметра &filter. Соответственно фильтрация тоже не работает.
есть ли решение данных проблем (особенностей)
заранее спс.
Я уже слабо помню Evolution, поэтому только в общих чертах:
1. Нужно самостоятельно пропарсить результат, в Revo это делается так:
2. Насколько я понимаю, обрабатывается не url, а параметры в url, переданные в $_GET. Соответственнл, нужно немного изменить сниппет, чтобы он понимал параметры не только оттуда.
Советую задать эти вопросы камрадам с modx.im
1. Нужно самостоятельно пропарсить результат, в Revo это делается так:
$modx->getParser()->processElementTags('', $html, false, false, '[[', ']]', array(), 10);
$modx->getParser()->processElementTags('', $html, true, true, '[[', ']]', array(), 10);
return $html;
2. Насколько я понимаю, обрабатывается не url, а параметры в url, переданные в $_GET. Соответственнл, нужно немного изменить сниппет, чтобы он понимал параметры не только оттуда.
Советую задать эти вопросы камрадам с modx.im
2. Да, фильтрацию сделал, передав параметр в сниппет — сформировал фильтр.
1. Буду смотреть в сторону парсинга…
1. Буду смотреть в сторону парсинга…
В ево это делается с помощью $modx->parseDocumentSource($result);
Т.е как у меня полчилось:
Снипет ajax
А так всё работает) Я счастлив) В принципе теперь у меня почти достаточно знаний что-бы делать полноценные ajax сайты на Evo.
Нарыл кстати это тут www.liveinternet.ru/journalshowcomments.php?jpostid=223127750&journalid=1999074&go=next&categ=0
Т.е как у меня полчилось:
Снипет ajax
if ($_SERVER[HTTP_X_REQUESTED_WITH] == 'XMLHttpRequest')
{
....
$result= $modx->runSnippet('Ditto', $param);
$result = $modx->parseDocumentSource($result);
die($result);
}
Без $result = $modx->parseDocumentSource($result); у меня внутри чанка Ditto (&tpl) выводило неотпрарсенные сниппеты, [+id+] и тд.А так всё работает) Я счастлив) В принципе теперь у меня почти достаточно знаний что-бы делать полноценные ajax сайты на Evo.
Нарыл кстати это тут www.liveinternet.ru/journalshowcomments.php?jpostid=223127750&journalid=1999074&go=next&categ=0
Столкнулся с проблемой что не парсит ссылки т.е выводить таким образом — moisite.com/[~57~], решил проблему добавлением функции $modx->rewriteUrls т.е вышло вместо
$result = $modx->parseDocumentSource($result);
это$result = $modx->rewriteUrls($modx->parseDocumentSource($result));
Блин реально клёвая идея с прерыванием.
Я 3й раз натыкаюсь на эту статью и только сейчас дошла основная идея! Гениально!
Я относительно зёлёный в этих вопросах, тяжко вникать в чужой код, Вы случайно не помните по этому-же принципу работаю ajaxserach в эво и shopkeeper или там сама идея реализации ajax другая?
Я 3й раз натыкаюсь на эту статью и только сейчас дошла основная идея! Гениально!
Я относительно зёлёный в этих вопросах, тяжко вникать в чужой код, Вы случайно не помните по этому-же принципу работаю ajaxserach в эво и shopkeeper или там сама идея реализации ajax другая?
У Эво, вроде специальный файл для ajaxSearch в корне лежит — index-ajax.php
Ну а про shopkeeper ничего не скажу — не знаю.
Ну а про shopkeeper ничего не скажу — не знаю.
Добрый день! Второй день пытаюсь понять как выводить страницы без перезагрузки. Т.е. что бы кликая по меню перезагружался контент??? Подскажите пожалуйста
Доброе утро! Пробую разобраться с ajax подзагрузкой ресурсов.
сама страница с вызовом снипета:
спасибо!
сама страница с вызовом снипета:
<script type="text/javascript" language="JavaScript">
jQuery(function($){
$('#results').load('[[~43]]', {
action: 'field33',
parents: '3',
limit: '3',
offset: '3'
//where: '{"Data.favorite":"1"}'
});
});
</script>
<div id="results"></div>
43 ресурс там вызов снипета, вот его код:<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
$action = $_POST['action'];
if (empty($action)) {return;}
$res = '';
switch ($action) {
case 'field33':
$param = array(
'element' => 'msProducts',
'offset' => (int)$_POST['offset'],
'limit' => (int)$_POST['limit'],
'depth' => $depth,
'parents' => (int)$_POST['parent'],
'includeContent'=> $includeContent,
'tpl'=> $tpl,
'outputSeparator'=> $outputSeparator,
'showUnpublished'=> $showUnpublished,
'showDeleted'=> $showDeleted,
'showHidden'=> $showHidden
);
$documents = $modx->runSnippet('getPageExt',$param);
return $documents;
}
вопрос — при таком вызове у меня не работает параметр offset, как мне сделать смещение для обновления страницы при пагинации?спасибо!
я правильно понимаю что getpage сам отслеживает номер страницы? Мне нужно поймать при нажатии пагинации page=число и передать в снипет?
неа не пашет((( и если задать 'page' => номер страницы — тоже не пашет…
все разобрался — надо просто ловить ссылку с пагинации и передавать в снипет. все пашет!
ну рас разобрался оставил бы решение тут, для потомков))
да пожалуйста, на правильность не претендую — с ajax только знакомиться начал.
$(document).on('click', 'a.pagin', function(e) {
e.preventDefault();
var url = $(this).attr('href').replace("get?page=","");
jQuery(function($){
$('#results').load('[[~43]]', {
action: 'field33',
parents: '3',
page: url,
limit: '10',
});
});
Василий, подскажите пожалуйста, как передать данные на сервер? Желательно через POST, или же любым другим способом… В контексте Ajax, разумеется)
А заметка про что?
Человек наверно хочет узнать как ему передать из
<input type = "test" name = "email" />
Мне было бы тоже интересно узнать…
По данной аналогии все работает и выводится в контейнер. А как сделать что бы вывод делать не в контейнер, а в модальное окно? Например в fancyBox.
Забавный вопрос. Заполняйте контейнер (div), который выводит fancybox и все.
Василий, подскажи, пожалуйста, почему в блоке $.post не переопределяется переменная
$(document).ready(function() {
$('#btnSave').click(function() {
var action = $(this).data('action');
var str='Test' //Определили переменную var
$.post(document.location.href, {action: action}, function(data) {
alert(str) //Выводит "Test"
str='OK' // Переопределили переменную
})
alert(str) //Выводит "Test"
return false;
})
Какая то загадка. Полдня уже мучаюсь.
Потому что запрос асинхронный.
Пока он отправляется на сервер, скрипт работает дальше, и переменная переопределится уже после второго алерта, когда придёт ответ.
Нужно или засунуть весь код, работающий с переменной в каллбэк, или делать синхронный запрос (не советую).
Пока он отправляется на сервер, скрипт работает дальше, и переменная переопределится уже после второго алерта, когда придёт ответ.
Нужно или засунуть весь код, работающий с переменной в каллбэк, или делать синхронный запрос (не советую).
Ясно. А как правильно проверить возвращаемые данные? Такая конструкция
(data != "")
работает криво. Я проверяю форму на ошибки. Если они есть, то возвращаю ошибку и вывожу в div #Error. $.post(document.location.href, {action: action}, function(data) {
if (data != "") {
$("#Error").html(data);
})
Если ошибки нет, то возвращаю пустую строку ($res=''). И вот тут _опа. В контейнер <div id="Error"></div>
почему-то пишется вся страница:<html>
<head>
...
</head>
и т.д.
Подскажи, как правильно вернуть пустое значение.
Понял почему. Перед die('') делал редирект. Вот дурень. Правда теперь обновление страницы пришлось делать javascript'ом, ибо не соображу как сделать серверный refresh при закрытии модального окна.
Василий, подскажи, как поменять $_SESSION переменную через post запрос? Я делаю так:
Инициализирую переменную:
Если в сниппете поставить
Видимо есть какое-то кодовое слово, чтобы заставить $_SESSION['var'] измениться.
Инициализирую переменную:
$_SESSION['var'] = 1;
При клике на ссылку посылаю ajax$.post(document.location.href, {action: 'changevar', id: 5})
В сниппете меняю переменную$_SESSION['var'] = $_POST['id']; // $_POST['id']=5
Проверяю, $_SESSION['var'] — все равно равна 1. Не понимаю, это же глобальный массив. Если в сниппете поставить
$_SESSION['var'] = $_POST['id']; // $_POST['id']=5
die($_SESSION['var'])
Ajax post возвращает 5. Но $_SESSION['var'] не меняется.Видимо есть какое-то кодовое слово, чтобы заставить $_SESSION['var'] измениться.
нет такого слова. Проверяйте код. Должно все работать.
И я так понимаю, что должно. Но увы… Вот код для проверки:
<?php
define('MODX_API_MODE', true);
require 'index.php';
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
?>
<!DOCTYPE html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$('a').click(function() {
$.post(document.location.href, {action: 'change', val: '5'},function(data) {
$('#res').html(data);
})
return false;
})
})
</script>
</head>
<body>
<?php
//')
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
if ($_POST['action'] == 'change') {
$_SESSION['testvar'] = $_POST['val'];
die('
Новое значение $_SESSION["testvar"]: '.$_SESSION["testvar"].'. (А теперь нажимаем F5 и видим старое значение.)');
}
}
if (!isset($_SESSION['testvar'])) {$_SESSION['testvar'] = 1;}
echo "<a id=\"test\" href=\"#1\">Изменить значение</a>";
echo "<div id=\"res\">
\$_SESSION[\"testvar\"]: {$_SESSION['testvar']}</div>";
?>
</body>
Видимо, есть какая-то тонкость, которая ускользает от моего неопытного взгляда.
Скопипастил твой код в файл, положил его в корень сайта, открыл — работает.
Ругается только на
У тебя, может, какой-то php-apc работать не дает? Попробуй добавить перед die
Ругается только на
PHP notice: Undefined index: HTTP_X_REQUESTED_WITH
У тебя, может, какой-то php-apc работать не дает? Попробуй добавить перед die
@session_write_close();
С session_write_close() работает. Супер. Грасиас мерси.
П.С. Я на Timeweb разрабатываю, значит у них чего-то перекручено.
П.П.С. Еще вопросик по безопасности сессий — злоумышленник может подменить значение $_SESSION переменной?
П.С. Я на Timeweb разрабатываю, значит у них чего-то перекручено.
П.П.С. Еще вопросик по безопасности сессий — злоумышленник может подменить значение $_SESSION переменной?
Если только залезет в базу данных MODX — все сессии хранятся там. В случае других CMS они в файлах на сервере.
Насколько я знаю, сессии абсолютно безопасны, но их можно увести, узнав идентификатор, например через XSS на сайте.
Тут уже лучше Евгения расспрашивать.
Насколько я знаю, сессии абсолютно безопасны, но их можно увести, узнав идентификатор, например через XSS на сайте.
Тут уже лучше Евгения расспрашивать.
Добрый день, Василий.
Очень удобное решение, работает отлично!
Решил организовать загрузку ресурсов (целиком) в целевой #content следующим образом:
ajax.php (перехватывает id запрашиваемого документа из атрибута ссылки «data-rid»):
Очень удобное решение, работает отлично!
Решил организовать загрузку ресурсов (целиком) в целевой #content следующим образом:
ajax.php (перехватывает id запрашиваемого документа из атрибута ссылки «data-rid»):
<?php
if (!defined('MODX_API_MODE')) {
define('MODX_API_MODE', true);
}
@include(dirname(__FILE__) . '/config.core.php');
if (!defined('MODX_CORE_PATH')) define('MODX_CORE_PATH', dirname(__FILE__) . '/core/');
@include_once (MODX_CORE_PATH . "model/modx/modx.class.php");
$modx= new modX();
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
$action = filter_input(INPUT_POST,'action');
$output = '';
if (empty($action)) {return;}
switch ($action) {
case 'getResources':
$id= filter_input(INPUT_POST,'rid');
$resource = $modx->getObject('modResource',array('id' => $id));
$pagetitle = $resource->get('pagetitle');
$content = $resource->get('content');
echo "<h1>$pagetitle</h1>";
echo "$content";
break;
}
if (!empty($output)) {
die($output);
}
?>
JS-обработчик:$('a.ajax').click(function() {
var data = $(this).data();
var urlPath = $(this).attr('href');
var title = $(this).text();
var rid = $(this).data('rid');
$.ajax({
type: "POST",
url: "/ajax.php",
data: data,
success: function(data) {
document.title = title;
history.pushState('', document.title, urlPath);
showContent(data);
}
})
function showContent(data) {
$('#content').html(data);
}
return false;
})
Но возник вопрос с работой кнопки истории Назад. Не подскажите в каком направлении разумнее всего копать? (пробовал history.js, не до конца понял как связать все в одиное целое)
Не знаю, не делал так.
Дальше нужно набивать новые методы в сниппет (вызов wayfinder, например), расставлять ссылки по страницам и развешивать обработчики событий на них.А можно пример для Wayfinder'a? Хочется сделать сайт с переходами по ссылкам через AJAX.
Василий, доброе утро. Прошу подсказать.
Пытаюсь вывести через ajax сниппет (т.е изначально сниппета на странице нет, он выводится по срабатыванию события). Сниппет выводится, но текстом, парсер видимо его не обрабатывает.
Если меняю в коде
1. Если я правильно понял, то парсер заново обрабатывает всю страницу, поэтому и получается страница в странице?
2. Возможно ли сделать так, чтобы парсер обрабатывал только вновь вставленный сниппет?
Пытаюсь вывести через ajax сниппет (т.е изначально сниппета на странице нет, он выводится по срабатыванию события). Сниппет выводится, но текстом, парсер видимо его не обрабатывает.
Если меняю в коде
die($res); на echo($res)
то выводится целая страница в странице, вместе с обработанным сниппетом.1. Если я правильно понял, то парсер заново обрабатывает всю страницу, поэтому и получается страница в странице?
2. Возможно ли сделать так, чтобы парсер обрабатывал только вновь вставленный сниппет?
У вас, видимо, включен fenom? Тогда скорее всего, причина в этом.
Для решения вы можете вынести код сниппета в отдельный файл (ajax/name.php):
И при помощи jQuery на срабатывания нужного события запрашивать/возвращать результат:
Для решения вы можете вынести код сниппета в отдельный файл (ajax/name.php):
<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_POST['action'])) {
return;
}
define('MODX_API_MODE', true);
require '/путь_до_index.php';
// Запускает нужные службы MODX
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
//ваш код сниппета который, в итоге, формирует $result
if (!empty($result)) {
die(json_encode($result));
}
И при помощи jQuery на срабатывания нужного события запрашивать/возвращать результат:
$.ajax({
type: "POST",
url: 'ajax/name.php',
data: {отправляемые данные},
success: function(response) {
var data = eval(response);
//вставляете в нужную область результат работы сниппета
}
});
Fenom, не использую. Пытаюсь вывести сниппет TicketForm с разными parent в зависимости от выбранного события
Код сниgпета Ajax1
[[!Ajax1]]
[[$ajaxscr?]]
<?php
// Откликаться будет ТОЛЬКО на ajax запросы
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
// Сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
// Если в массиве POST нет действия - выход
if (empty($_POST['action'])) {return;}
$action1= $_POST['action'];
$res = "[[!TicketForm? &requiredFields=`longtitle,model,introtext` &allowedFields=`longtitle,fullname,model,introtext,avtor,video,yaobzor` &redirectUnpublished=`63` &parents=`$action1` &tplFormCreate=`tpl.Tickets.form.create1` ]]";
// Если у нас есть, что отдать на запрос - отдаем и прерываем работу парсера MODX
if (!empty($res)) {
echo($res);
}
И скрипт с частью страницы, помещен в чанк ajaxscr, на странице выводится через чанк<div class="well create">
<form name="ticketFormcat" action="" id="ticketFormcat" method="post" >
<div class="form-group">
<label for="ticket-sections">Бытовая техника <span style="color: #F00;font-size: 12px;}">(выберите в первую очередь)</span></label>
<select name="parentcat" class="form-control" id="parentcat" onchange="viborid(this.value);">
<option disabled="disabled" value="" ></option>
[[pdoMenu?
&parents=`0`
&level=`1`
&firstClass=``
&lastClass=``
&hereClass=``
&outerClass=``
&tplOuter=`@INLINE [[+wrapper]]`
&tpl=`@INLINE <option value="[[+id]]">[[+menutitle]]</option>`
]]
</select>
</div>
</form>
<script type="text/javascript">
function viborid(action) {
// Ajax запрос к текущей страницы (а на ней наш сниппет) методом post
$.post(document.location.href, {action: action}, function(data) {
// Выдаем ответ
alert('Запрос успешно выполнен')
$('#result').html(data);
})
}
</script>
<!-- html элемент для вставки ответа от php -->
<div id="result"></div>
</div>
Вывод на странице [[!Ajax1]]
[[$ajaxscr?]]
$res = "[[!TicketForm? &requiredFields=`longtitle,model,introtext` &allowedFields=`longtitle,fullname,model,introtext,avtor,video,yaobzor` &redirectUnpublished=`63` &parents=`$action1` &tplFormCreate=`tpl.Tickets.form.create1` ]]";
— это определенно лучше переписать:$params = array();
$params['requiredFields'] = 'longtitle,model,introtext';
$params['parents'] = $action1;
//...
$res = $modx->runSnippet('TicketForm', $params);
if (!empty($res)) {
die($res);
}
Вызов стал таким
Форма TicketForm не работает, ничего не отправляет, не добавляет фото (при клике ничего не происходит), рядом с «Выберите файл» появились «0/0 0%», при нажатии кнопки «на проверку» (даже с пустой формой) просто перезагружается страница
$params = array();
$params['requiredFields'] = 'longtitle,model,introtext';
$params['parents'] = $action1;
$params['allowedFields'] = 'longtitle,fullname,model,introtext,avtor,video,yaobzor';
$params['redirectUnpublished'] = '63';
$params['tplFormCreate'] = 'tpl.Tickets.form.create1';
$res = $modx->runSnippet('TicketForm', $params);
Спасибо страница перестала дублироваться, но обратил внимание на другую проблему.Форма TicketForm не работает, ничего не отправляет, не добавляет фото (при клике ничего не происходит), рядом с «Выберите файл» появились «0/0 0%», при нажатии кнопки «на проверку» (даже с пустой формой) просто перезагружается страница
При этом если на этой же странице вывести форму обычно
Форма выведенная через ajax не работает
[[!TicketForm?
&requiredFields=`longtitle,model,introtext`
&allowedFields=`longtitle,fullname,model,introtext,avtor,video,yaobzor`
&redirectUnpublished=`63`
&parents=`0`
&tplFormCreate=`tpl.Tickets.form.create1` ]]
то данная форма работает. Форма выведенная через ajax не работает
Это потому что TicketForm при инициализации подключает свои скрипты на страницу.
В случае же с аякс-загрузкой их подключение не происходит.
В случае же с аякс-загрузкой их подключение не происходит.
Попробовал подключить вручную, ситуация не изменилась.
Подумал, что что-то пропустил и вывел на эту же страницу [[!TicketForm?]] для подключения скриптов, ситуация не изменилась. Стандартная форма работает, форма через ajax нет. Еще обратил внимание, что у формы через ajax нет (не выведены) элементов форматирования текста: B,I…
Подумал, что что-то пропустил и вывел на эту же страницу [[!TicketForm?]] для подключения скриптов, ситуация не изменилась. Стандартная форма работает, форма через ajax нет. Еще обратил внимание, что у формы через ajax нет (не выведены) элементов форматирования текста: B,I…
Далеко не все динамически добавленные на страницу элементы корректно обрабатываются скриптами на js. Это особенность самого js.
Все переделал еще раз и часть функций, при наличии стандартного сниппета [[!TicketForm?]] на странице, заработало, а вот добавление файлов нет и элементы форматирования текста: B,I… не появились.
Где то еще подключаются скрипты.
Формы отличаются
1. Форма «Содержимое» через ajax
Я защел в тупик, куда копать дальше
Формы отличаются
1. Форма «Содержимое» через ajax
<div class="form-group">
<textarea class="form-control" placeholder="Содержимое" name="content" id="ticket-editor" rows="10"></textarea>
<span class="error"></span>
</div>
2. «Форма Содержимое» стандартное<div class="form-group">
<div><div id="markItUpTicket-editor" class="markItUp"><div class="markItUpContainer"><div class="markItUpHeader"><ul><li class="markItUpButton markItUpButton1 btn-bold"><a href="" accesskey="B" title="Выделить жирным [Ctrl+B]">Выделить жирным</a></li><li class="markItUpButton markItUpButton2 btn-italic"><a href="" accesskey="I" title="Курсив [Ctrl+I]">Курсив</a></li><li class="markItUpButton markItUpButton3 btn-underline"><a href="" accesskey="U" title="Подчеркивание [Ctrl+U]">Подчеркивание</a></li><li class="markItUpButton markItUpButton4 btn-stroke"><a href="" accesskey="H" title="Выделение подзаголовков [Ctrl+H]">Выделение подзаголовков</a></li><li class="markItUpSeparator">---------------</li><li class="markItUpButton markItUpButton5 btn-bulleted"><a href="" title="Ненумерованный список">Ненумерованный список</a></li><li class="markItUpButton markItUpButton6 btn-numeric"><a href="" title="Нумерованный список">Нумерованный список</a></li><li class="markItUpSeparator">---------------</li><li class="markItUpButton markItUpButton7 btn-quote"><a href="" title="Цитата">Цитата</a></li><li class="markItUpButton markItUpButton8 btn-link"><a href="" title="Link">Link</a></li><li class="markItUpButton markItUpButton9 btn-picture"><a href="" title="Картинка">Картинка</a></li></ul></div><textarea class="form-control markItUpEditor" placeholder="Содержимое" name="content" id="ticket-editor" rows="10"></textarea><div class="markItUpFooter"><div class="markItUpResizeHandle"></div></div></div></div></div>
<span class="error"></span>
</div>
Но даже если все это добавить в форму выводимую через ajax, кнопки появляются, но не работают. Где-то внутри еще есть подключение скриптов.Я защел в тупик, куда копать дальше
Конкретно TicketForm подключают следующие скрипты:
+ (опционально) скрипты редактора MarkitUp.
Вы можете попробовать подгружать их самостоятельно и запускать их внутренние элементы инициализации через $(document).ajaxStop. Плюс формировать конфигурационный массив самостоятельно.
UPD: Но я вас заверяю — без глубоких знаний php+js оно того вообще не стоит и грозит очень серьезно переписать исходный сниппет.
/assets/components/tickets/js/web/default.js
/assets/components/tickets/js/web/lib/plupload/plupload.full.min.js
/assets/components/tickets/js/web/files.js
+ формируют массив TicketsConfig.+ (опционально) скрипты редактора MarkitUp.
Вы можете попробовать подгружать их самостоятельно и запускать их внутренние элементы инициализации через $(document).ajaxStop. Плюс формировать конфигурационный массив самостоятельно.
UPD: Но я вас заверяю — без глубоких знаний php+js оно того вообще не стоит и грозит очень серьезно переписать исходный сниппет.
Спасибо за помощь, буду понемногу вникать в php+js
Не проще вызвать сниппет на странице, который в свою очередь подключит все необходимые скрипты, а форму если она не нужна скрыть. Потом при необходимости показывать ее через js
Так пробовал делать, часть функций все равно не работает, как писал выше
Здравствуйте! Такой вопрос. У меня есть проект. Где данные должны обновлять каждые 5-15 секунд.
Как сделать чтобы сниппет подгружал данные каждые 5-15 сек. (Любые данные из JSON)
Пример кода сниппета:
Как сделать чтобы сниппет подгружал данные каждые 5-15 сек. (Любые данные из JSON)
Пример кода сниппета:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://ru.investing.com/currencies/eur-usd-technical");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // Таймаут после 4 секунд
curl_setopt($ch, CURLOPT_POST, true); // Устанавливаем метод POST
curl_setopt($ch, CURLOPT_POSTFIELDS, "pairID=1&period=300&viewType=normal"); // посылаемые значения
$content = curl_exec($ch);
curl_close($ch);
$domDocument = new DOMDocument();
@$domDocument->loadHTML($content);
$xPath = new DOMXPath($domDocument);
$rsis = $xPath->query("//div[contains(@class,'halfSizeColumn') and contains(@class,'float_lang_base_1')]/table[@id='curr_table']/tbody/tr/td[contains(@class,'first') and contains(@class,'left') and contains(@class,'symbol')]");
foreach ($rsis as $rsi) { $rsires[] = $rsi->nodeValue."\n";}
$rsinumbs = $xPath->query("//div[contains(@class,'halfSizeColumn') and contains(@class,'float_lang_base_1')]/table[@id='curr_table']/tbody/tr/td[@class='right']");
foreach ($rsinumbs as $rsinumb) { $rsinumbsres[] = $rsinumb->nodeValue."\n";}
$rsivals = $xPath->query("//table[@id='curr_table']/tbody/tr/td[contains(@class,'left') and contains(@class,'textNum') and contains(@class,'bold')]/span[contains(@class,'redFont') and contains(@class,'bold')]");
foreach ($rsivals as $rsival) { $rsivalsres[] = $rsival->nodeValue."\n";}
echo json_encode($rsi14=array(
'rsi'=>$rsires[0],
'rsinumb'=>$rsinumbsres[0],
'rsival'=>$rsivalsres[0]
));
Самое очевидное это использовать setInterval обращаясь к сниппету…
Подскажите почему не работает вывод mFilter таким образом?
$res = '';
switch ($_POST['action']) {
case 'addMfilter2':
$param = array(
'element' => 'msProducts',
'parents' => $_POST['parents'],
'limit' => 20,
'includeContent' => 0,
'suggestions' => 0,
'showUnpublished' => 0,
'ajaxMode' => 'scroll',
'tpl' => '@FILE chunks/catalog/product_item.tpl',
'filters' =>'tv|ap_category',
'aliases' => 'tv|ap_category==category',
'tplFilter.outer.category' => 'tpl.mFilter2.filter.select',
'tplFilter.row.category' => '@FILE chunks/category/filter_option.tpl',
);
$res = $modx->runSnippet('mFilter2',$param);
break;
}
if (!empty($res)) {
die($res);
}
Точнее так, выводится фильтр со значениями для фильтрации, а товаров нет.Всего результатов: 0
[[!+page.nav]]
У меня есть мой сниппет HistoryMod (один из елементов самописного дополнения), который отлично работает с Fenom.
Решил добавить фильтр через выпадающий список по годам.
Обрабатываю акцию вот так:
В настройках pdoTools все включено.
Шаблон с моими феном тегами tpl.full:
Выходит что вызывать свой сниппет в сниппете нельзя?
Или что еще нужно сделать чтобы
$modx->runSnippet('HistoryMod', $params);
начал работать с тегами Fenom?
Решил добавить фильтр через выпадающий список по годам.
Обрабатываю акцию вот так:
if(!empty($_POST['selYear'])){
$params = array();
$params['type'] = $_POST['type'];
$params['year'] = $_POST['selYear'];
$params['tpl'] = 'tpl.full';
$res = $modx->runSnippet('HistoryMod', $params);
}
результат приходит правильно, но в шаблоне не обрабатываются феном теги, а модикса обрабатываются ({dt_item} — не работает, [[+dt_item]] — работает). В настройках pdoTools все включено.
Шаблон с моими феном тегами tpl.full:
<div class="month">{$dt_item | date : 'F'}</div>
Напомню: изначально феном теги обрабатываются. Страница загрузилась, все хорошо. Выбираю из выпадающего списка год, запрос уходит куда нужно, скрипт обрабатывается, но феном теги перестают работать.Выходит что вызывать свой сниппет в сниппете нельзя?
Или что еще нужно сделать чтобы
$modx->runSnippet('HistoryMod', $params);
начал работать с тегами Fenom?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.