0 Пользователей и 1 Гость просматривают эту тему.
  • 33 Ответов
  • 10316 Просмотров
*

balancer

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #1 : 28.02.2016, 21:39:15 »
Я тоже не стал разбираться в этом новшестве Joomla. В конце концов это JavaScript, так что когда мне нужен AJAX, я просто пишу несколько строк на jQuery.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #2 : 28.02.2016, 22:02:57 »
Я тоже не стал разбираться в этом новшестве Joomla. В конце концов это JavaScript, так что когда мне нужен AJAX, я просто пишу несколько строк на jQuery.
хороший вариант, но хотелось бы сделать все в соответствии с задумкой разработчиков cms :)
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #3 : 29.02.2016, 00: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

Код: javascript
<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  в классе
Код: php
class TestControllerForm extends JControllerLegacy
{

public function test()
{
$message = 'Test 111';
echo json_encode( array( 'message' => $message ) );
exit;
}
}
« Последнее редактирование: 29.02.2016, 00:56:57 от Istaan »
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #4 : 29.02.2016, 06:22:38 »
Istaan,
спасибо вам большое, буду разбираться, как это работает

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

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #5 : 29.02.2016, 08:11:32 »
Документация говорит, что в своём компоненте не следует применять com_ajax
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #6 : 29.02.2016, 08:43:56 »
Филипп Сорокин,
насколько я понял, com_ajax следует применять в модулях и плагинах, соответствующая статья имеется на сайте товарища Istaan.
Если вы поделитесь опытом как вы работаете с аяксом в Joomla,  буду вам очень признателен
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #7 : 29.02.2016, 08:59:34 »
В клиентской части, когда запросы частые и регулярные, я не использую com_ajax, стараюсь не использовать вывод из контроллера также, те это медленно и затратно. Аякс запрос должен быть стремительным, и если есть возможность, то я считаю, что не нужно загружать ядро и накидывать к времени ожидания лишние 150 мсек. Но если ядро нужно, то тут без вариантов, конечно. Хотя мне оно не нужно в AJAX запросах в 90 процентов случаев.
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #8 : 29.02.2016, 10:17:51 »
Может мой вопрос покажется вам глупым, но сейчас для меня самый непонятный момент, это - как вернуть данные в шаблон. Если применить это к моей ситуации: я применяю фильтр, делаю запрос к БД, возвращая JSON и там его разбираю как мне нужно. Вот в этой ситуации я должен использовать модель для выборки данных? Если да, то каким образом мне вернуть данные для вывода в шаблон?
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #9 : 29.02.2016, 10: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, 10:40:05 от buyanov »
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #10 : 29.02.2016, 11:03:26 »
Используйте класс JResponseJson, тогда очень удобно ответ обрабатывать в JS. Вот дока. При этом сохраняйте контроллер в controller.json.php и вызывайте его через format=json в URL. Тогда и приложение закрывать не надо, и заголовки ответа будут корректные. Всё это описано в доке.
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #11 : 29.02.2016, 11:22:06 »
buyanov, спасибо за ваш совет, обязательно опробую на практике
b2z, большущее спасибо за отличный, подробный мануал, на первый взгляд это именно то, что мне нужно

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

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #12 : 29.02.2016, 11:31:01 »
Жаль не отцепят интерфейс AJAX от ядра Joomla. Почему нельзя загрузить просто Фреймворк и не грузить все остальное? А то что сейчас, получается, нет никакой разницы между AJAX запросом и обычным get запросом страницы.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #13 : 29.02.2016, 12:10:21 »
del
« Последнее редактирование: 29.02.2016, 12:45:39 от Istaan »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #14 : 29.02.2016, 12:16:32 »
Жаль не отцепят интерфейс AJAX от ядра Joomla. Почему нельзя загрузить просто Фреймворк и не грузить все остальное? А то что сейчас, получается, нет никакой разницы между AJAX запросом и обычным get запросом страницы.
А если я модель хочу вызвать? Или токен формы проверить? В общем и целом, это стоит обсуждать в отдельной теме - а том зафлудим тут...
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #15 : 29.02.2016, 12:20:38 »
Еще наверно желательно использовать не просто exit(), а корректно завершить работу приложения, хотя наверно это не настолько критично =)
Код
JFactory::getApplication()->close();
познакомтесь с кодом метода close ;D
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #16 : 29.02.2016, 12:24:42 »
Может мой вопрос покажется вам глупым, но сейчас для меня самый непонятный момент, это - как вернуть данные в шаблон. Если применить это к моей ситуации: я применяю фильтр, делаю запрос к БД, возвращая JSON и там его разбираю как мне нужно. Вот в этой ситуации я должен использовать модель для выборки данных? Если да, то каким образом мне вернуть данные для вывода в шаблон?
Я вам уже написал полный пример как делать все с контроллером! И он наиболее верный!
Стучитесь в контроллер, в контроллере вызываете нужную модель! В модели делаете выборку данных, возвращаете в контроллер,  формируете данные в JSON, делаете echo этих данных и exit!
в JS эти данные разбираете и выводите куда вам надо и как вам надо!
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #17 : 29.02.2016, 12:37:03 »
Я вам уже написал полный пример как делать все с контроллером! И он наиболее верный!
Стучитесь в контроллер, в контроллере вызываете нужную модель! В модели делаете выборку данных, возвращаете в контроллер,  формируете данные в JSON, делаете echo этих данных и exit!
в JS эти данные разбираете и выводите куда вам надо и как вам надо!

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

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #18 : 29.02.2016, 19: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

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #19 : 29.02.2016, 21:35:07 »
Вот что у меня получилось
Так это то же, что я и делаю. Где тут плюшки от Joomla?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #20 : 01.03.2016, 06:13:33 »
Так это то же, что я и делаю.
А я и не претендовал на роль первопроходца :)

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

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #21 : 01.03.2016, 10:27:12 »
Код выше безусловно работает.

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

Это решает JResponseJson в связке с format=json.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #22 : 01.03.2016, 10:29:41 »
если модель вернула ошибку, то как вы её обработаете/покажете пользователю?

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

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #23 : 01.03.2016, 10:37:03 »
тоже оч. интересен этот момент, а то я как-то все ручками да ручками...
Выше я давал ссылку на доку ;)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #24 : 01.03.2016, 11:28:41 »
Товарищ b2z рекомендовал JResponseJson, чем вам не Joomla плюшка?
Да, именно это и было интересно и из-за лени :) хотелось бы видеть на конкретном примере. А ваш пример можно написать и без этой темы, и MVC Joomla, IMHO, плевать на то, с каким запросом клиент обращается к ним.

P.S. Посмотрел
дока
IMHO, это довольно удобно. Надо будет использовать.
« Последнее редактирование: 01.03.2016, 11:47:39 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #25 : 01.03.2016, 12:50:54 »
Спасибо всем за замечания, учту. Обработчики ошибок обязательно сделаю и для входящих данных и на случай пустого врата модели.

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

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

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #26 : 01.03.2016, 13:09:24 »
Немного не понял вот это пояснение:
Как сейчас модель завязана на запрос? У меня ведь получается что функция модели отрабатывает и возвращает JSON обратно в контроллер. Или я что-то напутал?
А так, что Вы json_encode делаете в модели. Я бы это делал в контроллере. Таким образом модель у Вас отвязывается от конкретного запроса и метод можно использовать повторно для других целей.
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #27 : 01.03.2016, 14:30:36 »
А, понял вас, спасибо, так и сделаю
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #28 : 15.01.2017, 14:58:21 »
Подскажите пожалуйста как добавить параметр в XML файл, который формируется модулем в режиме AJAX http://joomlaforum.ru/index.php/topic,334424.0.html
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Re: Обработка AJAX в компоненте Joomla!3
« Ответ #29 : 07.02.2017, 15:36:47 »
Используйте класс JResponseJson, тогда очень удобно ответ обрабатывать в JS. Вот дока. При этом сохраняйте контроллер в controller.json.php и вызывайте его через format=json в URL. Тогда и приложение закрывать не надо, и заголовки ответа будут корректные. Всё это описано в доке.
Смотрю класс JResponseJson. Простой, как палка. Заголовков и закрытия нет. Попытался поискать по коду, не нашел.
Ткните, пожалуйста, интересно посмотреть.

Зато нашел несколько файлов, в которых при использовании JResponseJson устанавливаются заголовки и закрывается приложение:
Спойлер
[свернуть]

Также у меня заголовки неправильные отдавало, пока в методе json-контроллера не добавил:
Код: php
$app    = JFactory::getApplication();
// Send json mime type.
$app->mimeType = 'application/json';
$app->setHeader('Content-Type', $app->mimeType . '; charset=' . $app->charSet);
$app->sendHeaders();
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Отправка файлов через ajax в модуль Joomla

Автор hemicide

Ответов: 19
Просмотров: 1053
Последний ответ 11.04.2022, 08:44:33
от sivers
Документация по разработки компонента для Joomla 3.x

Автор Aspik

Ответов: 9
Просмотров: 2896
Последний ответ 23.01.2021, 07:55:56
от hmr
Применение ajax (Аякс) в модуле Joomla

Автор tm2010

Ответов: 34
Просмотров: 3947
Последний ответ 26.09.2020, 09:38:35
от b2z
ajax проверку на вход. В стандартном модуле входа?

Автор Dolphin4ik_1

Ответов: 4
Просмотров: 468
Последний ответ 23.07.2020, 15:03:57
от sivers
Модуль обратной связи. Как использовать свойство context в ajax запросе

Автор ushangi

Ответов: 0
Просмотров: 480
Последний ответ 15.02.2020, 22:08:12
от ushangi