Как разобраться с экшен и контроллерами Есть решение
Добрый день!
Может кто поможет, пытаюсь разобраться и понять логику как с ними работать в сетуации, к примеру у нас есть плагин в нем есть свои экшены, как можно добавить действия к этому экшен с другого плагина.
Спасибо!
28 ответов
Документацию то не читали? И раздел "классы и объекты" php справочника заодно?
Документация полностью изучена, нет примеров подробной реализации, вопрос про классы объекты ООП - знаю, хуки методы все это знаю, то что переодически здесь вылезает про экшены и контроллеры, не просто так, нет конкретных примеров, меня интересует конкретный момент, к примеру:
Дело касается бекэнда,
Есть плагин "Плагин1", у него есть свои экшены
(plugin= Плагин1&module=модуль&action=действие1)
Нужно добавить действие с "Плагин2" учитывая данную строку.
Вы напрямую обращаетесь к конкретному модулю, поэтому несколько вариантов:
- если на странице есть хуки, то привязываете плагин к ним: напрямую или через JS.
- если плагин вызывает какое-то событие при Действие1, то привязываетесь к нему.
Хуков нету, плагин нам дает только строку plugin= Плагин1&module=модуль&action=действие1
Мне не понятно как Плагину2 это можно использовать и внедрить свои механизмы после исполнения, можно ли это делать через Экшен Контроллер или как то еще?
Если есть возможность пример напиште пожалуйста
Что это значит? Поясните. Вам нужно в Плагине2 выполнить какое-то действие после обработки HTTP-запроса к plugin=Плагин1&module=модуль&action=действие1?
Да Вы правильно меня поняли
тогда в экшене1 в методе execute напишите это:
где:
[app] - идентификатор приложения, например shop.
[plugin] - идентификатор плагина, например test.
[module] - идентификатор модуля, например product.
[action] - идентификатор экшена, например getinfo.
[Action|Controller] - постфикс экшена, имеет два варианта - Action для экшенов и Controller для контроллеров.
Все идентификаторы нужно писать с заглавной буквы, кроме первого - [app].
т.е. для вызова экшена из этого примера пишем:
Синтаксис понятен,
Задача вызов делать в Плагине2, по урл Плагина1 (plugin=Плагин1&module=модуль&action=действие1)
Не совсем верно, WA вызывает экшен через метод run, в execute просто основной код.
Насколько я понимаю, вам нужно отловить AJAX-запрос по какому-то URL и по получении ответа о его завершении выполнить что-то своё.
Наверное, что-то вроде такого:
Это Ajax пригодится и обычная отправка интересует тоже, если есть возможность опишите пожалуйста, я так понял средствами контроллеров, нужен синтаксис.
Простите, ничего не понял... Добавьте знаков препинания для ясности.
этот вариант работает только в сферическом вакууме. т.к. не факт что другие плагины или само приложение не перезаписывают этот метод.
Зачем все путают человека? Напишите, что этого сделать нельзя, если плагин1 не предусмотрел заранее наличие плагина 2 и не взывает к нему сам.
PS Чтобы получить более быстрый и верный ответ, лучше не маскировать задачу, а говорить конкретно к какому плагину идет обращение, что он делает, что, когда и при каких условиях нужно сделать вашему плагину.
Помоему тут ясно что он делает: plugin=Плагин1&module=модуль&action=действие1?
он делает "действие1"
А я хочу чтобы "плагин2" совершил свое действие2, прослушивая действие1.
Пропадает гибкость программирования, если мы это не можем сделать. Получается если кто-то сделал плагин, его не сможет расширить второй товарищ программист, из-за отсутствия интерфейса взаимодействия между плагинами, если такого нет хорошо бы веб-асист сделал эту возможность.
Ну и не понятно зачем тогда контроллер, только чтобы вызывать действие внутри приложения?
Ну что ж. Помоему тут ясно, как это сделать.
?
Вы сами и написали ответ, вернее запрос для получения данных результатов работы экшена в бекенде.
Ок, то есть в такой ситуации лучше просто добавить код Контроллера в Плагин1?
Если есть возможность модифицировать Плагин1 так, что он больше не будет обновляться и тем самым не будет доставлять неудобств пользователю, то добавьте.
Или, если оба плагина ваши, то просто расширьте Плагин1, вообще не создавая Плагин2.
Все понятно, добрались до истины!
Плагины между собой не могут взаимодействовать.
Каждый плагин выполняет свою роль.
Могут в какой-то мере, но не в магазине Webasyst )
Могут. Но это взаимодействие не должно быть обязательным. Т.е. плагин должен работать сам по себе. Но если есть другой плагин, то может учитывать его наличие и использовать его методы. Но, повторюсь, плагин должен работать сам по себе, вне зависимости от отсутствия/наличия других плагинов. И такой подход позволяет плагину занять свое место в магазине WA.
Каким образом можно использовать его методы, экшен нельзя же использовать?
Почему нельзя использовать? создаем новый объект класса экшен:
А потом используем его публичные методы:
Если нужно сначала проверить наличие класса экшена то делаем так: