Как создать страницу на фронтенде в плагине Есть решение

Доброго времени суток, не могу понять как создать страницу на фронтенде в плагине. Пошёл по следующему пути. 

Создал роут 

'myplugin' => array(
                'url' => 'test/',
                'app' => 'shop',
                'plugin' => 'myplugin',
                'module' => 'frontend',
                'action' => 'test'
        ),

И соответственно action (shopPluginPluginFrontendTestAction), котором передаю в шаблон нужные данные, 

И сам шаблон FrontendTest.html

Если перейти по созданному пути, то шаблон применяется переменные выводятся. Но как подключить скрипты и стили приложения shop что.

И вообще это верный путь или страницы создаются по другому.

3 ответа

  • 0
    FPM 20 ноября 2018 10:12 # Решение

    Разобрался не от того класса наследовал, нужно было наследовать от

    shopFrontendAction

    Я же использовал от

     waViewAction

    • +2
      enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 00:57 #

      без разницы от какого класса наследовать.

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

      return array(
          $this->id.'-def' => array(
              'url'    => $this->id.'/',
              'app'    => $this->app_id,
              'plugin' => $this->id,
              'module' => $this->id,
              'action' => 'default',
          ),
          $this->id => array(
              'url'    => $this->id.'/<action:(add|saveAll)>/',
              'app'    => $this->app_id,
              'plugin' => $this->id,
              'module' => $this->id,
          ),
      );

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

      class shopMyPluginMyActions extends waViewActions
      {
          public function defaultAction()
          {
              // действие по умолчанию
          }
          public function addAction()
          {
          }
          public function saveAllAction()
          {
              // если у экшена не подразумевается наличие шаблона
              $this->action = false;
          }
      }
      

      можно реализовать и отдельными классами:

      class shopMyPluginMyAddAction extends waViewAction
      {
          public function execute()
          {
          }
      }
      class shopMyPluginMySaveAllAction extends waJsonController
      {
          public function execute()
          {
              try {
                  $result = array();
                  // ...
                  $this->response = $result;
              } catch (Exception $e) {
                  $this->setError(strip_tags($e->getMessage()));
              }
          }
      }

  • 1
    Михаил Ушенин Webasyst 19 ноября 2018 10:14 #

    не могу понять как создать страницу на фронтенде в плагине

    Хотя:

    шаблон применяется переменные выводятся

    Кажется, вы всё-таки поняли, как это делать.

    как подключить скрипты и стили приложения shop что

    Уточните ваш вопрос.

    это верный путь

    Да.

    Совет: не пренебрегайте вопросительными знаками при формулировке вопросов. Они помогают.

  • 0
    FPM 19 ноября 2018 11:16 #

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

    • +1
      Михаил Ушенин Михаил Ушенин Webasyst 20 ноября 2018 09:41 #

      С помощью тегов <script> и <link>. Посмотреть пример можно в исходнике этой страницы форума.

    • +2
      enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 01:01 #

      Вариантов масса, можно например создать методы в классе плагина и вызывать в нем методы waPlugin:

          /**
           * Adds a JavaScript file URL to the array returned by {$wa->js()}.
           * @param string $url JavaScript file URL, relative or absolute, depending on $is_plugin parameter value.
           * @param bool $is_plugin Whether a relative or absolute file URL must be conitained in $url parameter.
           * @return null
           */
          protected function addJs($url, $is_plugin = true)
          {
              if (false === strpos($url, '?')) {
                  $url .= '?'.$this->getVersion();
                  if (waSystemConfig::isDebug()) {
                      $url .= '.'.time();
                  }
              }
              waSystem::getInstance()->getResponse()->addJs($this->getUrl($url, $is_plugin), $this->app_id);
          }
      
          /**
           * Adds a CSS file URL to the array returned by {$wa->css()}.
           * @param string $url CSS file URL, relative or absolute, depending on $is_plugin parameter value.
           * @param bool $is_plugin Whether a relative or absolute file URL must be conitained in $url parameter.
           * @return null
           */
          protected function addCss($url, $is_plugin = true)
          {
              if (false === strpos($url, '?')) {
                  $url .= '?'.$this->getVersion();
                  if (waSystemConfig::isDebug()) {
                      $url .= '.'.time();
                  }
              }
              waSystem::getInstance()->getResponse()->addCss($this->getUrl($url, $is_plugin), $this->app_id);
          }

      • 0
        FPM FPM 23 ноября 2018 14:26 #

        Большое спасибо, возьму на вооружение. 

        Возможно сможете ещё подсказать как реализовать следующий функционал.

        1. Нужно на странице которую выводт созданный роут, вывести список товаров по категории, который выводится шаблоном list-thumbs.

        2. И к каждому товару добавить дополнительные данные в форму добавления в корзину.

        Хука который бы решал эту задачу не нешёл.

        Нашёл вариант который решает 1 задачу

         $c = new shopProductsCollection();
         $c = new shopProductsCollection('category/3');		 
         $this->setCollection($c);
         $this->view->assign('frontend_search', wa()->event('frontend_search'));
         $this->setThemeTemplate('search.html');

        Насколько я понимаю из описания экшина он отправляет в шаблон объект 

        shopProductsCollection

        Подума, что возможно получить все товары через метод 

        getProducts
        

        А потом пройтись в цикле, но как добавить html и на выходе получить объект класса 

        shopProductsCollection

        Непойму. 

        Вопрос. Каким образом можно добавить в форму дополнительный html(по типу кнопки добавить в сравнения) и вообще это верно направление?

        • +1
          enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 18:26 #

          class shopMyPluginMyListAction extends waViewAction
          {
              public function execute()
              {
                  // ...
                 $this->view->assign('cart_items', $cart->items());
                  $this->view->assign('products', $collection->getProducts());
              }
          }

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

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