Как разобраться с экшен и контроллерами Есть решение

Добрый день!

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

Спасибо!

3 ответа

  • 2
    Евгений Леман 24 января 2018 13:49 # Решение

    Зачем все путают человека? Напишите, что этого сделать нельзя, если плагин1 не предусмотрел заранее наличие плагина 2 и не взывает к нему сам.

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

    • +1
      Ram Ram 24 января 2018 14:11 #

      Помоему тут ясно что он делает: plugin=Плагин1&module=модуль&action=действие1?
      он делает "действие1"

      А я хочу чтобы "плагин2" совершил свое действие2, прослушивая действие1.
      Пропадает гибкость программирования, если мы это не можем сделать. Получается если кто-то сделал плагин, его не сможет расширить второй товарищ программист, из-за отсутствия интерфейса взаимодействия между плагинами, если такого нет хорошо бы веб-асист сделал эту возможность.

      Ну и не понятно зачем тогда контроллер, только чтобы вызывать действие внутри приложения?






      • +1
        Евгений Леман Евгений Леман 24 января 2018 14:16 #

        Ну что ж. Помоему тут ясно, как это сделать.

        • +1
          Ram Ram 24 января 2018 14:18 #

          ?

          • +1
            info@ravencode.ru info@ravencode.ru 24 января 2018 15:09 #

            Вы сами и написали ответ, вернее запрос для получения данных результатов работы экшена в бекенде.

      • +2
        Михаил Ушенин Михаил Ушенин Webasyst 24 января 2018 14:18 #
        В магазине Webasyst не публикуются плагины, требующие для своей работы другие плагины. Каждый плагин должен уметь работать сам по себе. На случай, если вы хотите опубликовать свой плагин в магазине Webasyst.
        • +1
          Ram Ram 24 января 2018 14:21 #

          Ок, то есть в такой ситуации лучше просто добавить код Контроллера в Плагин1?

          • +2
            Михаил Ушенин Михаил Ушенин Webasyst 24 января 2018 14:33 #

            Если есть возможность модифицировать Плагин1 так, что он больше не будет обновляться и тем самым не будет доставлять неудобств пользователю, то добавьте.

            • +2
              Михаил Ушенин Михаил Ушенин Webasyst 24 января 2018 14:34 #

              Или, если оба плагина ваши, то просто расширьте Плагин1, вообще не создавая Плагин2.

              • +1
                Ram Ram 24 января 2018 14:39 #

                Все понятно, добрались до истины!
                Плагины между собой не могут взаимодействовать.
                Каждый плагин выполняет свою роль.

                • +1
                  Михаил Ушенин Михаил Ушенин Webasyst 24 января 2018 14:42 #

                  Могут в какой-то мере, но не в магазине Webasyst )

                • +1
                  Павел Трофимов Павел Трофимов 24 января 2018 15:09 #

                  Могут. Но это взаимодействие не должно быть обязательным. Т.е. плагин должен работать сам по себе. Но если есть другой плагин, то может учитывать его наличие и использовать его методы. Но, повторюсь, плагин должен работать сам по себе, вне зависимости от отсутствия/наличия других плагинов. И такой подход позволяет плагину занять свое место в магазине WA.

                  • +1
                    Ram Ram 24 января 2018 15:50 #

                    Каким образом можно использовать его методы, экшен нельзя же использовать?

                    • +2
                      Dragomaster Dragomaster 24 января 2018 17:37 #

                      Почему нельзя использовать? создаем новый объект класса экшен:

                      $action = new shopTestPluginProductGetinfoAction();

                      А потом используем его публичные методы:

                      $action->execute();
                      $action->write('65rf78utffi8y');
                      $action->getProductById(5);

                      Если нужно сначала проверить наличие класса экшена то делаем так:

                      if(in_array('shopTestPluginProductGetinfoAction', get_declared_classes()))
                      {
                      // проверка прошла успешно можно работать с экшеном
                      }


  • 1
    Dragomaster 23 января 2018 20:35 #

    Документацию то не читали? И раздел "классы и объекты" php справочника заодно?

  • 1
    Ram 24 января 2018 00:06 #

    Документация полностью изучена, нет примеров подробной реализации, вопрос про классы объекты ООП - знаю, хуки методы все это знаю, то что переодически здесь вылезает про экшены и контроллеры, не просто так, нет конкретных примеров, меня интересует конкретный момент, к примеру:

    Дело касается бекэнда,
    Есть плагин "Плагин1", у него есть свои экшены
    (plugin= Плагин1&module=модуль&action=действие1)
    Нужно добавить действие с "Плагин2" учитывая данную строку.


    • +2
      Алексей Алексей Webasyst 24 января 2018 00:37 #

      Вы напрямую обращаетесь к конкретному модулю, поэтому несколько вариантов:
      - если на странице есть хуки, то привязываете плагин к ним: напрямую или через JS.
      - если плагин вызывает какое-то событие при Действие1, то привязываетесь к нему.

      • +1
        Ram Ram 24 января 2018 00:48 #

        Хуков нету, плагин нам дает только строку plugin= Плагин1&module=модуль&action=действие1

        Мне не понятно как Плагину2 это можно использовать и внедрить свои механизмы после исполнения, можно ли это делать через Экшен Контроллер или как то еще?

        • +1
          Ram Ram 24 января 2018 00:59 #

          Если есть возможность пример напиште пожалуйста

    • +1
      Михаил Ушенин Михаил Ушенин Webasyst 24 января 2018 09:30 #
      Нужно добавить действие с "Плагин2" учитывая данную строку.

      Что это значит? Поясните. Вам нужно в Плагине2 выполнить какое-то действие после обработки HTTP-запроса к plugin=Плагин1&module=модуль&action=действие1?

      • +1
        Ram Ram 24 января 2018 11:16 #

        Да Вы правильно меня поняли

        • +2
          Dragomaster Dragomaster 24 января 2018 12:31 #

          тогда в экшене1 в методе execute напишите это:

          $action = new [app][plugin]Plugin[module][action][Action|Controller]();
          $action->execute();

          где:

          [app] - идентификатор приложения, например shop.

          [plugin] - идентификатор плагина, например test.

          [module] - идентификатор модуля, например product.

          [action] - идентификатор экшена, например getinfo.

          [Action|Controller] - постфикс экшена, имеет два варианта - Action для экшенов и Controller для контроллеров.

          Все идентификаторы нужно писать с заглавной буквы, кроме первого - [app].

          т.е. для вызова экшена из этого примера пишем:


          $action = new shopTestPluginProductGetinfoAction();
          $action->execute();
          • +1
            Ram Ram 24 января 2018 12:53 #

            Синтаксис понятен,
            Задача вызов делать в Плагине2, по урл Плагина1 (plugin=Плагин1&module=модуль&action=действие1)

          • +1
            info@ravencode.ru info@ravencode.ru 24 января 2018 16:13 #
            $action->execute();

            Не совсем верно, WA вызывает экшен через метод run, в execute просто основной код.

        • +2
          Михаил Ушенин Михаил Ушенин Webasyst 24 января 2018 12:47 #

          Насколько я понимаю, вам нужно отловить AJAX-запрос по какому-то URL и по получении ответа о его завершении выполнить что-то своё.

          Наверное, что-то вроде такого:

          $.ajaxSetup({
              complete: function () {
                  if (this.url === undefined) {
                      return true;
                  }
                  
                  if (this.url == '...') {    //1. отловить запрос к чужому контроллеру
                      //2. отправить запрос к моему контроллеру
          $.post('...', {...}, function () {
          ...
          }); } } });
          • +1
            Ram Ram 24 января 2018 12:57 #

            Это Ajax пригодится и обычная отправка интересует тоже, если есть возможность опишите пожалуйста, я так понял средствами контроллеров, нужен синтаксис.

          • +1
            info@ravencode.ru info@ravencode.ru 24 января 2018 16:23 #

            этот вариант работает только в сферическом вакууме. т.к. не факт что другие плагины или само приложение не перезаписывают этот метод.

Добавить ответ

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