Я разрабатываю пользовательский компонент для Joomla! 3.x и хотите сделать AJAX-вызов внутри него, чтобы получить некоторые данные. Как правильно это сделать?
component
ajax
development
joomla-3.x
Дмитрий Рекун
источник
источник
Ответы:
Аннотация
Практически нет официального способа справиться с этим, все зависит от сложности и от того, насколько вы хотите полагаться на шаблон MVC для выполнения работы.
Ниже приведены некоторые возможные решения, которые должны работать в Joomla 2.5 и 3.x. Код представлен не для задания копирования-вставки, а в качестве общей идеи.
До Joomla! 3.2 единственное, что вам нужно, чтобы использовать примеры ниже, это
component
. После Joomla 3.2 (для более низких сложных задач) вы можете обрабатывать запросы от модулей и плагинов.Общий ответ HTML (в соответствии с устаревшим MVC)
Ваш URL для задачи должен выглядеть следующим образом:
index.php?option=com_similar&task=abc&format=raw
Abc
Затем вы создаете контроллер, который будет использовать представление, скажем , которое будет содержать файл view.raw.html (идентичный обычному файлу представления).Ниже у вас есть код для генерации необработанного HTML-ответа:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Примечание: это решение я бы использовал, если бы мне пришлось возвращать HTML (он чище и следует логике Joomla). Для возврата простых данных JSON, смотрите ниже, как поместить все в контроллер.
Subcontrollers
Если вы отправите запрос Ajax субконтроллеру , например:
index.php?option=com_similar&controller=abc&format=raw
Чем должно быть ваше имя субконтроллера (для необработанного представления)
abc.raw.php
.Это также означает, что у вас будет / может быть 2 субконтроллера с именем Abc.
Если вы возвращаете JSON, возможно, имеет смысл использовать
format=json
иabc.json.php
. В Joomla 2.5. У меня были некоторые проблемы с получением этой опции (каким-то образом вывод был поврежден), поэтому я использовал raw.Действительный ответ JSON (следующий новый / устаревший MVC)
Если вам необходимо сгенерировать правильный ответ JSON , проверьте страницу документы Генерирование JSON выход
Обычно вы помещаете этот код в контроллер (вы будете вызывать модель, которая будет возвращать закодированные вами данные - очень распространенный сценарий). Если вам нужно продвинуться дальше, вы также можете создать представление JSON (view.json.php), аналогичное необработанному примеру.
Безопасность
Теперь, когда Ajax-запрос работает, пока не закрывайте страницу. Читай ниже.
Не забудьте проверить подделку запроса.
JSession::checkToken()
пригодиться здесь. Прочитайте документацию о том, как добавить антиспуфинг CSRF в формы.Многоязычные сайты
Может случиться так, что если вы не отправите имя языка в запросе, Joomla не переведет нужные вам языковые строки.
Попробуйте добавить параметр lang к вашему запросу (например
&lang=de
).Joomla! Интерфейс Ajax
Новое в Joomla 3.2! - позволил вам обрабатывать запросы без сборки компонента
Joomla! Интерфейс Ajax - Joomla теперь предоставляет облегченный способ обработки запросов Ajax в плагине или модуле. Вы можете использовать Joomla! Ajax-интерфейс, если у вас еще нет компонента или если вам нужно делать запросы от модуля, который у вас уже есть.
источник
JRequest
? Это не рекомендуется, так$this->input
как я использую v3.x?JRequest
. СпасибоValid JSON Response
разделе.Это очень поздний ответ на этот очень хорошо отвеченный вопрос, но я хотел добавить это решение для тех, кому просто нужен простой способ получить данные своих компонентов с помощью вызова AJAX.
Со всеми версиями Joomla, сторонними возможностями и хакерами, которые я нашел за несколько дней поиска в Google, это был самый простой подход, который я мог придумать - и обратная связь ОПРЕДЕЛЕННО приветствуется.
execute
в мой существующий основной контроллерURL для вызова / выполнения задачи:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Модифицированный главный контроллер \ com_example \ controller.php
Новый субконтроллер \ com_example \ controllers \ forajax.php
Визуализированный вывод JSON
источник
Ответ Валентина хороший, но он слишком сложный, если все, что вам нужно сделать, это добавить 1 или 2 вызова ajax к компоненту, который уже построен. Вполне возможно сойти с рук, не делая отдельные
controller.raw.php
илиview.raw.php
файлы.Чтобы сделать этот вызов AJAX
В
job
субконтроллереисточник
Валентин ответил хорошо.
Я предпочитаю контроллер json, который обрабатывает кодирование и обработку ошибок, для этого я создал базовый класс json:
Этот контроллер расширяется классом контроллера, который выполняет работу, что-то вроде этого:
и вы называете запрос так:
Хэш токена генерируется JSession :: getFormToken (). Таким образом, полный завершенный вызов может выглядеть следующим образом:
Второй параметр имеет значение «false», поэтому мы можем использовать его в вызовах javascript без перезаписи xml.
источник
JResponseJson
класс, чтобы справиться с этим?Если вы на 100% уверены, что нет стороннего плагина, добавляющего какой-либо вывод Javascript, чистый json_encode работает нормально.
Но ... например, JomSocial добавляет "" ко всему сайту.
Итак ... удобный трюк, оберните json_encode тегами и обработайте его на стороне Javascript.
источник
Вы можете получить доступ к контроллеру напрямую, используя имя контроллера в задаче:
вызовет: controller.raw.php (возврат необработанный)
вызовет: controller.php (возврат html, если вы не используете
die;
)источник