Ajax. Метод №3
Вкратце о раннее рассказанных методах.
1) Отправляем ajax запрос на туже страницу где мы находимся, а с ответа в нужном html теге вырезаем результат
+ простота
— скорость
— необходимость вырезать из ответа нужное
2) Через index-ajax.php Урок или на прямую на php файл
+ скорость
— необходимость подготовки скриптов их прописыванию
— правка кода через фтп
— необходимо иметь заготовку
3) Тут подробнее. Данный метод у некоторых людей поменяет стиль программирования в МОДх ))))
— создайте плагин AJAX с кодом
— выставите его на событие OnPageNotFound
Все. Заготовка готова. Такой код запоминается на раз-два-три.
Самое интересное как этим пользоваться. Еще не догадались???? ))))
в консоли firebug давайте потестим как оно работает
Ответом сервера будет «1-ОК» )) Все работает…
Для тех кому интересен принцип:
— идёт запрос на сервер по URL: liked
— так как его не существует (здесь вся соль) выполняется событие OnPageNotFound
— наш плагин как раз на данном событии
— .htaccess MODx преобразует frienly url в переменную которую отсылает GET параметром на index.php — потому используем $_GET['q'] для определения action
И что мы емеем. Для разных action мы просто прописуем их в case '':. на эти url шлем запросы.
+ скорость
+ простота (может и не с первого раза, но гарантирую что вы подсядите)
1) Отправляем ajax запрос на туже страницу где мы находимся, а с ответа в нужном html теге вырезаем результат
+ простота
— скорость
— необходимость вырезать из ответа нужное
2) Через index-ajax.php Урок или на прямую на php файл
+ скорость
— необходимость подготовки скриптов их прописыванию
— правка кода через фтп
— необходимо иметь заготовку
3) Тут подробнее. Данный метод у некоторых людей поменяет стиль программирования в МОДх ))))
— создайте плагин AJAX с кодом
switch($_GET['q']){
case 'liked':
echo $_POST['value'].'-OK'; //вот тут код отработки вашего кода
// выведим просто значение $_POST['value']
break;
}
die();
— выставите его на событие OnPageNotFound
Все. Заготовка готова. Такой код запоминается на раз-два-три.
Самое интересное как этим пользоваться. Еще не догадались???? ))))
в консоли firebug давайте потестим как оно работает
$.ajax({
url:'liked',
type:'post',
data:{
value:1
}
})
Ответом сервера будет «1-ОК» )) Все работает…
Для тех кому интересен принцип:
— идёт запрос на сервер по URL: liked
— так как его не существует (здесь вся соль) выполняется событие OnPageNotFound
— наш плагин как раз на данном событии
— .htaccess MODx преобразует frienly url в переменную которую отсылает GET параметром на index.php — потому используем $_GET['q'] для определения action
И что мы емеем. Для разных action мы просто прописуем их в case '':. на эти url шлем запросы.
+ скорость
+ простота (может и не с первого раза, но гарантирую что вы подсядите)
51 комментарий
case 'liked':
echo $_POST['value'].'-OK'; //вот тут код отработки
break;
}
die();
— url и есть action. А в твоём его надо переменной передавать.
— не надо засорять дерево непонятными для клиента ресурсами
— парсер MODx даже пукнуть не успел а мы его в die, тоесть и скорость выше
Я бы сказал: надо настраивать права пользователей.
Всё это выглядит в конечном счёте «грязновато» или, простите, «через жопу». Событие «OnPageNotFound» (страница не найдена) как-то логически не подходит для этих вещей. Это какой-то стиль Netcat, где по человечески сделать просто не возможно. Да и какой смысл? Вместо привычного использования сниппетов каждый раз писать код?
P.S.: ↑ это риторические вопросы.
P.P.S.: без обид только ;-)
— когда есть стандартный механизм. То что предложил я альтернатива стандартному, без левых телодвижений с правами и тд.
P.S.: без обид только ;-)
по сравнению с вариантом через создание документа — работае быстрее.
по сравнению с index-ajax — настраивается легче
Да это похоже на черезжопу, но если все хорошо за документировать то не успеешь подумать как этот вариант станет стандартным :)
Понимаю что все должно быть по правилам но жизнь идет все меняется и правила тоже нужно менять: )
А если параметры принимаются через $_GET, а вызов сниппета в таком случае вообще кэшируемый (в конфиге настроено кэширование с учётом $_GET), что будет быстрее?
Или в одном случае надо делать так, а в другом — по-другому?
А как же вызовы сниппетов VS код руками? Или что, надо в событии «OnPageNotFound» вызывать сниппеты через «$modx->runSnippet»?
Ещё есть множество подобных вопросов и тонких моментов, ибо это не через ту дырку, через какую надо. Если есть нам предназначено ртом, давайте этого правила и будем придерживаться.
быстрее чем [!!]
а кешировать можно и не только стандатрным кешем :)
Вообщем как вариант использования Ajax по новому вам показали а использовать или нет дело ваше:)
но игнорировать такие плюшки и заведомо считать их ошибочными считаю не правильным. Опять же потому что нет фактов что это плохо потому этот метод пускай не совсем по правилам но имеет право на жизнь :)
Да просто если мне придётся копаться в сайте, на котором аякс сделан вот таким вот методом, то сначала я буду копаться продолжительное время, чтобы понять, как это работает, а потом такое же время выражаться нецензурной бранью и переделывать на что-то более стандартное.
blog.agel-nash.ru/2014/2/ide-and-modx-evolution.html
p.s. Не вижу не тандартным использование плагина на pageNotFound тудой к примеру все ЧПУ для своих страниц делается:) и нет в этом проблемы
Теперь о способе предложенном в данном топике. Он хоть и вписывается в так называемые «стандартные средства MODX», но он выбивается из общей идеологии программирования, т.к. код который по логике должны быть в одном месте, по факту находится абсолютно в другом. Если пытаться привести пример, то я бы сравнил это с кодом в стиле:
Ну а че… какая разница gif это или php файл. Стандартные же средства php задействованы.
В общем кому нравится обманываться — пожалуйста, первые 3 способа для вас. Лично я использую метод №4:
— Код ajax методов находится на своем месте и любой кодер без явных познаний modx разберется куда уходят запросы.
— Нет необходимости копипастить кучу символов из других файлов, чтобы корректно подключить ядро modx
— Не плодятся одноразовые сущности, что в конечном счете не приводит к разбуханию глобального кеша, что влияет на производительность (а учитывая, что явный плюс вашего метода это производительность, то получается что овчинка выделки не стоит)
— Есть возможность использовать автозагрузчики классов и элементов
Ну в общем как-то так. А теперь советую задуматься — действительно ли вы правильные методы разработки вы пропогандируете…
Ronef — возми листок бумаги, прорисуй блоксхемно этапы обработки твоего и данного метода через ядро. Ты все поймешь. Даже твоим через ресурс, onpagenotfound гораздо раньше вызывается парсером, как по моему незачем систему дергать если есть возможность сделать производительней. А рассказывать про учеников которые читают эту статью и что она наносит им вред — уж изволь полная чушь. Чем больше понимания работы ЦМС тем лучше специалист
1. Экономия на спичках.
2. Что насчёт примера с кэшируемым вызовом?
А вообще, я не вижу смысла использовать оба метода, логичней остановиться на чём-то одном для однообразия, для понимания, для дебага, для командной работы, etc.
Опять же, я попытался акцентировать внимание на том, что экономия на производительности при помощи «OnPageNotFound» довольно низка и ей можно пренебречь в угоду удобства разработчиков, что есть правильный паттерн, на мой взгляд.
Вон в битриксе вообще напрямую сортировку разделов в инфоблоках задать нельзя, и ничего, живут же как-то и без этого :)
Точно так же создаете плагин на событие OnPageNotFound, но это не обязательно
В классе ActionsHandler создаете новый метод, если вы отправляете запрос на адрес
site.com/hello, то метод должен называться helloAction, метод должен возвращать любой корректный массив:
пишу код (JS):
код плагина:
в консоле ошибка:
* код на PHP проверял отдельно, там окей…
новый вопрос — пагинацию просто вынести за контейнер где обновляется контент (дописать обработку кликов) или её что надо?
ссылки будут иметь примерно такой вид
если это всё работает, далее ставить Аякс запрос на ваши ссылки, и при успехе заменяете блок с выводом ditto.
при листании пагинации на Аяксе Модкс пропускает один шаг
(обычно второй, при этом номера идут по-порядку)
* может это связанно с тем, что в сборке убрали дубли…
и гугл говорит: Начиная с jQuery 1.7, метод .delegate() можно заместить методом .on()
а то, что вынесли за контейнер, значит надо опять обрабатывать, только зачем, если можно всё одним махом получить?
получите содержимое wrapper, получите и дитто и пагинацию
обозначил что в этих местах должно быть, чтобы сократить код
вам нужно всего лишь, три строчки кода на JS и больше ничего