Вернуть блок html по AJAX из плагина

Toha Cvetaev

Здравствуйте коллеги.

Возник вопрос, как на AJAX запрос к плагину вернуть не JSON, а блок html кода?

Есть ли класс, который возвращает не JSON, а HTML.

Понятно дело, можно реализовать это создав экшен в котором будут наколбашены куски HTML и их мы возвращаем, но это жуть и так делать совсем не хочется. Может кто-то подскажет адекватное решение?

30 ноября 2017
  • Алексей Webasyst 30 ноября 2017 14:40

    Плагин возвращает то что вы укажете в его коде - html, xml, json и даже файлы.
    https://developers.webasyst.ru/cookbook/basics/classes/waViewActions/
    https://developers.webasyst.ru/cookbook/basics/cla...

  • Toha Cvetaev 30 ноября 2017 15:26

    Алексей, благодарю за ответ.

    Похоже можно так:

    - наследую класс waActions

    - обращаюсь к его методу (...Action) по AJAX (по правилам роутинга)

    - в этом методе цепляю одноименный шаблон в который передаю нужные мне данные

    - вызываю display()

  • Михаил Ушенин Webasyst 30 ноября 2017 18:48

    waActions удобен, только если вы планируете организовать в одном файле несколько экшенов с похожим поведением. Но в этом случае удобнее использовать waViewActions — HTML-шаблон каждого экшена, объявленного в экземпляре класса, и сформирует содержимое HTML-ответа в браузер. Класс waViewActions сам получит это содержимое из HTML-шаблона и отдаст его в браузер. Если использовать waActions, то вам всё это придётся делать вручную.

    А если нужно создать обработчик только для одного URL, то достаточно использовать экземпляр класса waViewAction. "Ручной" аналог waActions для одного экшенаwaController.

  • info@ravencode.ru 30 ноября 2017 21:38

    В случае ajax запросов лучше наследовать от waController т.к. waViewAction(s) используют слой-обертку (<code>waLayout</code>) .

    class shopMyPluginNameController extends waController
    {
        public function execute()
        {
    		// проверка прав доступа если нужна
    		if (!$this->getUser()->getRights('shop', 'orders')) {
    			throw new waException(_w('Access denied'));
    		}
    		
    		$view = clone wa()->getView();
    		$view->assign($array);
    		// Можно передать шаблон и строкой
    		// return $view->fetch('string:' . $template_str);
    		// А можно файлом
    		return $view->fetch($template);
        }
    }
  • Toha Cvetaev 1 декабря 2017 13:12

    Ребята, спасибо за мощнейшие ответы. Буду пробовать.

  • Toha Cvetaev 6 декабря 2017 12:45

    Так, всё здорово. waViewAction работает, но предполагается, что класс будет отдавать разные шаблоны. Думаю использовать waViewActions. Курю документацию, но не пойму, как вызвать мне необходимый метод action со своим шаблоном?

  • info@ravencode.ru 6 декабря 2017 14:35
  • Toha Cvetaev 6 декабря 2017 14:54

    Хорошо ))

    Дергаю из бэкенда по AJAX и передаю параметры до модуля и экшена:

    var params = {
                plugin: 'imagery',
                module: 'backend'
            };

    пробовал вставлять туда параметр action: 'foo'.


    var params = {
                plugin: 'imagery',
                module: 'backend',
                action: 'foo'
            };

    Создавал папку в templates/actions/foo + файл Foo.html. В самом классе создавал метод


    fooAction()
    {
        $this->setTemplate('Foo');
    }

    Соответственно переименовывал файл ...action.php - actions.php и имя класса.

    Не работает...

    Может параметры как-то надо именовать по другому?

  • Toha Cvetaev 6 декабря 2017 15:49

    Спасибо )) понял.



Чтобы добавить комментарий, зарегистрируйтесь или войдите