Форум русской поддержки Joomla!® CMS
03.12.2016, 06:30:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Обработка AJAX в компоненте Joomla!3

 (Прочитано 809 раз)
0 Пользователей и 1 Гость смотрят эту тему.
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« : 28.02.2016, 21:09:59 »

Всем доброго времени суток.
Разрабатываю свой компонент на Joomla!3, нужно сделать небольшой AJAX-фильтр. Немного запутался в этой теме.
Получается у меня есть вид - filter - и из лэйаута default я хочу вызывать AJAX функцию с последующей обработкой. Как я понял, в GET запросе нужно передавать параметр raw, а дальше сплошной туман. Не понимаю как отловить этот AJAX запрос, как вернуть его обратно в вид.
Исчерпывающего материала по этой теме пока не нашел, наиболее приближенное к тому что мне нужно было здесь - http://joomla-code.ru/great-component/ajax-for-joomla, но тоже весьма поверхностно. Может кто встречался с внедрением AJAX в свои компоненты, буду благодарен вашим советам, или мануалам по этой теме
Записан
robert
Профи
********

Репутация: +342/-11
Offline Offline

Пол: Мужской
Сообщений: 3566


« Ответ #1 : 28.02.2016, 22:39:15 »

Я тоже не стал разбираться в этом новшестве Joomla. В конце концов это JavaScript, так что когда мне нужен AJAX, я просто пишу несколько строк на jQuery.
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #2 : 28.02.2016, 23:02:57 »

Я тоже не стал разбираться в этом новшестве Joomla. В конце концов это JavaScript, так что когда мне нужен AJAX, я просто пишу несколько строк на jQuery.
хороший вариант, но хотелось бы сделать все в соответствии с задумкой разработчиков cms Azn
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #3 : 29.02.2016, 01:52:15 »

Все намного проще:
index.php?option=com_ваш_компонент&task=controller_name.task_name
Все никаких RAW ненужно!

в вашем компоненте в папке controllers в файле controller_name.php создаете метод
public function task_name(){
тут ваш код какой угодно, возвращаете все что угодно
exit; -самое главное в самом конце метода сделать exit; что бы не пошла дальнейшая обработка и не загрузился шаблон со всеми фигнями...
}

Пример!
Компонент com_test в нем есть контроллер form в папке controllers
пишем в jQuery

Код
<script>jQuery(document).ready(function ($) {
$.getJSON('index.php?option=com_test&task=form.test', function (responce) {
alert(responce.message);
});
});
</script>

В components/com_test/controllers/form.php  в классе
Код
class TestControllerForm extends JControllerLegacy
{
 
public function test()
{
$message = 'Test 111';
echo json_encode( array( 'message' => $message ) );
exit;
}
}
« Последнее редактирование: 29.02.2016, 01:56:57 от Istaan » Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #4 : 29.02.2016, 07:22:38 »

Istaan,
спасибо вам большое, буду разбираться, как это работает

З.Ы.: прочел почти все статьи на вашем сайте, было очень полезно. Думаю статья о применении аякса в плагинах и модулях очень пригодится мне в ближайшем времени.
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +120/-3
Offline Offline

Пол: Мужской
Сообщений: 1434


« Ответ #5 : 29.02.2016, 09:11:32 »

Документация говорит, что в своём компоненте не следует применять com_ajax
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #6 : 29.02.2016, 09:43:56 »

Филипп Сорокин,
насколько я понял, com_ajax следует применять в модулях и плагинах, соответствующая статья имеется на сайте товарища Istaan.
Если вы поделитесь опытом как вы работаете с аяксом в Joomla,  буду вам очень признателен
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +120/-3
Offline Offline

Пол: Мужской
Сообщений: 1434


« Ответ #7 : 29.02.2016, 09:59:34 »

В клиентской части, когда запросы частые и регулярные, я не использую com_ajax, стараюсь не использовать вывод из контроллера также, те это медленно и затратно. Аякс запрос должен быть стремительным, и если есть возможность, то я считаю, что не нужно загружать ядро и накидывать к времени ожидания лишние 150 мсек. Но если ядро нужно, то тут без вариантов, конечно. Хотя мне оно не нужно в AJAX запросах в 90 процентов случаев.
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #8 : 29.02.2016, 11:17:51 »

Может мой вопрос покажется вам глупым, но сейчас для меня самый непонятный момент, это - как вернуть данные в шаблон. Если применить это к моей ситуации: я применяю фильтр, делаю запрос к БД, возвращая JSON и там его разбираю как мне нужно. Вот в этой ситуации я должен использовать модель для выборки данных? Если да, то каким образом мне вернуть данные для вывода в шаблон?
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #9 : 29.02.2016, 11:34:35 »

Привет. Возврат нужно уже видимо в JS писать... пока не понятно что именно и куда ты хочешь вернуть. По части работы контроллера и корректного возврата JSON. В примерах выше забыли про заголовки ответа сервера ну и про фремворк Joomla ))))


Код:
$data = ['json']; //
$document =& JFactory::getDocument();
$document->setMimeEncoding('application/json');
JResponse::setHeader('Content-Disposition','attachment;filename="'.$view->getName().'.json"');
echo json_encode($data);

Еще наверно желательно использовать не просто exit(), а корректно завершить работу приложения, хотя наверно это не настолько критично =)

Код:
JFactory::getApplication()->close();
« Последнее редактирование: 29.02.2016, 11:40:05 от buyanov » Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #10 : 29.02.2016, 12:03:26 »

Используйте класс JResponseJson, тогда очень удобно ответ обрабатывать в JS. Вот дока. При этом сохраняйте контроллер в controller.json.php и вызывайте его через format=json в URL. Тогда и приложение закрывать не надо, и заголовки ответа будут корректные. Всё это описано в доке.
« Последнее редактирование: 29.02.2016, 12:17:14 от b2z » Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #11 : 29.02.2016, 12:22:06 »

buyanov, спасибо за ваш совет, обязательно опробую на практике
b2z, большущее спасибо за отличный, подробный мануал, на первый взгляд это именно то, что мне нужно

тему пока не закрываю, буду пробовать наработки форумчан. возможно еще будут вопросы
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +120/-3
Offline Offline

Пол: Мужской
Сообщений: 1434


« Ответ #12 : 29.02.2016, 12:31:01 »

Жаль не отцепят интерфейс AJAX от ядра Joomla. Почему нельзя загрузить просто Фреймворк и не грузить все остальное? А то что сейчас, получается, нет никакой разницы между AJAX запросом и обычным get запросом страницы.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #13 : 29.02.2016, 13:10:21 »

del
« Последнее редактирование: 29.02.2016, 13:45:39 от Istaan » Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #14 : 29.02.2016, 13:16:32 »

Жаль не отцепят интерфейс AJAX от ядра Joomla. Почему нельзя загрузить просто Фреймворк и не грузить все остальное? А то что сейчас, получается, нет никакой разницы между AJAX запросом и обычным get запросом страницы.
А если я модель хочу вызвать? Или токен формы проверить? В общем и целом, это стоит обсуждать в отдельной теме - а том зафлудим тут...
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #15 : 29.02.2016, 13:20:38 »

Еще наверно желательно использовать не просто exit(), а корректно завершить работу приложения, хотя наверно это не настолько критично =)
Код:
JFactory::getApplication()->close();
познакомтесь с кодом метода close Grin
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #16 : 29.02.2016, 13:24:42 »

Может мой вопрос покажется вам глупым, но сейчас для меня самый непонятный момент, это - как вернуть данные в шаблон. Если применить это к моей ситуации: я применяю фильтр, делаю запрос к БД, возвращая JSON и там его разбираю как мне нужно. Вот в этой ситуации я должен использовать модель для выборки данных? Если да, то каким образом мне вернуть данные для вывода в шаблон?
Я вам уже написал полный пример как делать все с контроллером! И он наиболее верный!
Стучитесь в контроллер, в контроллере вызываете нужную модель! В модели делаете выборку данных, возвращаете в контроллер,  формируете данные в JSON, делаете echo этих данных и exit!
в JS эти данные разбираете и выводите куда вам надо и как вам надо!
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #17 : 29.02.2016, 13:37:03 »

Я вам уже написал полный пример как делать все с контроллером! И он наиболее верный!
Стучитесь в контроллер, в контроллере вызываете нужную модель! В модели делаете выборку данных, возвращаете в контроллер,  формируете данные в JSON, делаете echo этих данных и exit!
в JS эти данные разбираете и выводите куда вам надо и как вам надо!

Вы правильно поняли мой вопрос, спасибо за подробный ответ, он объясняет недопонятый мной момент взаимодействия частей компонента. Полагаю что так происходит потому что я плаваю в некоторых моментах MVC
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #18 : 29.02.2016, 20:20:19 »

Еще раз всех приветствую. Вот что у меня получилось:

Подключаемый JS:
Код:
function testRequest( options ){
    jQuery.ajax({
        type: "POST",
        url: "index.php?option=com_test&task=filter.returnJson",
        cache: false,
        data: { filterOpts: options },
        success: function( response ){
            jQuery('#result').html( makeTemplate( response ) );
            //console.log( response );
        }
    });
}
Передаю параметры фильтра в контроллер.

Контроллер:
Код:
class TestControllerFilter extends JControllerLegacy {
    public function returnJson() {
    $input = JFactory::getApplication()->input;
    $filters = $input->post->get('filterOpts', '', 'RAW');
  $model = $this->getModel('Filter');
  $result = $model->getFilteringData( $filters );
echo $result;
exit;
    }
}

В модели (TestModelFilter), которую я вызывал в моем контроллере, я разбираю фильтр, делаю запрос в БД, загружаю ассоциативный массив, пропускаю его через функцию json_encode и, наконец, возвращаю обратно в контроллер.
Все работает как надо, всем спасибо за советы.

Надеюсь что все выполнил правильно, буду раз замечаниям.
Еще хочу ради интереса опробовать класс JResponseJson, результаты выложу.
Записан
robert
Профи
********

Репутация: +342/-11
Offline Offline

Пол: Мужской
Сообщений: 3566


« Ответ #19 : 29.02.2016, 22:35:07 »

Вот что у меня получилось
Так это то же, что я и делаю. Где тут плюшки от Joomla?
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #20 : 01.03.2016, 07:13:33 »

Так это то же, что я и делаю.
А я и не претендовал на роль первопроходца Azn

Где тут плюшки от Joomla?
В первую очередь я хотел правильно настроить взаимодействие AJAX и MVC Joomla.
Товарищ b2z рекомендовал JResponseJson, чем вам не Joomla плюшка?
Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #21 : 01.03.2016, 11:27:12 »

Код выше безусловно работает.

Но по моему простое echo отдаст неверный заголовок ответа.
Второй момент - если модель вернула ошибку, то как вы её обработаете/покажете пользователю?
И третий момент - я бы не стал привязывать модель к конкретному запросу. Она должна тупо отдать ассоциативный массив и её не должно волновать, что с ним будет дальше.

Это решает JResponseJson в связке с format=json.
« Последнее редактирование: 01.03.2016, 11:41:21 от b2z » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6452



« Ответ #22 : 01.03.2016, 11:29:41 »

если модель вернула ошибку, то как вы её обработаете/покажете пользователю?

Это решает JResponseJson в связке с format=json.
тоже оч. интересен этот момент, а то я как-то все ручками да ручками...
Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #23 : 01.03.2016, 11:37:03 »

тоже оч. интересен этот момент, а то я как-то все ручками да ручками...
Выше я давал ссылку на доку Wink
Записан
robert
Профи
********

Репутация: +342/-11
Offline Offline

Пол: Мужской
Сообщений: 3566


« Ответ #24 : 01.03.2016, 12:28:41 »

Товарищ b2z рекомендовал JResponseJson, чем вам не Joomla плюшка?
Да, именно это и было интересно и из-за лени Azn хотелось бы видеть на конкретном примере. А ваш пример можно написать и без этой темы, и MVC Joomla, IMHO, плевать на то, с каким запросом клиент обращается к ним.

P.S. ПосмотрелIMHO, это довольно удобно. Надо будет использовать.
« Последнее редактирование: 01.03.2016, 12:47:39 от robert » Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #25 : 01.03.2016, 13:50:54 »

Спасибо всем за замечания, учту. Обработчики ошибок обязательно сделаю и для входящих данных и на случай пустого врата модели.

Немного не понял вот это пояснение:
я бы не стал привязывать модель к конкретному запросу. Она должна тупо отдать ассоциативный массив и её не должно волновать, что с ним будет дальше.

Как сейчас модель завязана на запрос? У меня ведь получается что функция модели отрабатывает и возвращает JSON обратно в контроллер. Или я что-то напутал?
Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #26 : 01.03.2016, 14:09:24 »

Немного не понял вот это пояснение:
Как сейчас модель завязана на запрос? У меня ведь получается что функция модели отрабатывает и возвращает JSON обратно в контроллер. Или я что-то напутал?
А так, что Вы json_encode делаете в модели. Я бы это делал в контроллере. Таким образом модель у Вас отвязывается от конкретного запроса и метод можно использовать повторно для других целей.
Записан
balancer
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 34


« Ответ #27 : 01.03.2016, 15:30:36 »

А, понял вас, спасибо, так и сделаю
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet