Блог лаборанта

Переопределение и приоритет параметров

Типичная ситуация

Разработчик хочет, чтобы параметры пункта меню были доступны в представлении, но он пытается переопределить параметры компонента var (this-> params) вместе с этим параметром / классом. В этом случае пишет ненужный код делая сложный компонент. Другие параметры помещаются в файл (intheview.html.php), который включает в себя информацию о том, как использовать эту информацию.

Логично использовать


$params = JFactory::getApplication()->getMenu()->getActive()->getParams(); 

в default.php представления. Что позволяет:


$params->get('page_heading'); 

(ЕСЛИ это представление вызвано через пункт меню.)

Получить параметры пункта меню:


    $app = JFactory::getApplication();
    $menu = $app->getMenu() -> getActive ();
    $params = $menu->getParams();

Получить параметры компонента:


 $this->params = $this->state->get('params');

Объедините их в view.html.php -> функции отображения (взятой из view.html.php в представлении статьи):


$this->params = $this->state->get('params');
$active = $app->getMenu()->getActive();
$temp = clone $this->params;

if ( $active)
     { $currentLink = $active->link;
        // If the current view is the active item and an article view for this article, then the menu item params take priority
        // Если текущее представление является активным пунктом (меню) представления для этой статьи, то параметры пункта меню имеют приоритет

        if (strpos( $currentLink, 'view=article') && strpos( $currentLink, '&id=' . (string) $item->id))
        {
          // Load layout from active query (in case it is an alternative menu item)
          // Загрузить макет из активного запроса (в случае, если он является альтернативным пунктом меню)

          if (isset( $active->query['layout']))
         { $this->setLayout( $active->query['layout']);
          }
          // Check for alternative layout of article
          // Проверяем альтернативный макет статьи

          elseif ( $layout = $item->params->get('article_layout'))
         { $this->setLayout( $layout);
          }
          // $item->params are the article params, $temp are the menu item params
          // $item->params - это параметры статьи, $temp - параметры меню
          // Merge so that the menu item params take priority $item->params->merge( $temp);
          // Миграция, чтобы параметры этого меню имели приоритет $item->params->merge( $temp);
        }
        else
       {
          // Current view is not a single article, so the article params take priority here
          // Текущее представление - это не удинственная статья, поэтому параметры статьи имеют приоритет здесь
          // Merge the menu item params with the article params so that the article params take priority $temp->merge( $item->params); $item->params = $temp;
          // Слияние параметров пункта меню с параметрами статьи, чтобы параметры статьи принимали приоритет $temp->merge( $item->params); $item->params = $temp;

          // Check for alternative layouts (since we are not in a single-article menu item)
          // Проверяем альтернативные макеты (поскольку мы не находимся в одном элементе меню)
          // Single-article menu item layout takes priority over alt layout for an article
          // Макет элемента с одним элементом имеет приоритет над макетом для статьи
          
          if ( $layout = $item->params->get('article_layout'))
         { $this->setLayout( $layout);
          }
        }
      }
      else
     {
        // Merge so that article params take priority $temp->merge( $item->params); $item->params = $temp;
        // Миграция параметров этой статьи для приоритета $temp->merge( $item->params); $item->params = $temp;

        // Check for alternative layouts (since we are not in a single-article menu item)
        // Проверяем альтернативные макеты (поскольку мы не находимся в одном элементе меню)
        // Single-article menu item layout takes priority over alt layout for an article
        // Макет элемента с одним элементом имеет приоритет над макетом для статьи

        if ( $layout = $item->params->get('article_layout'))
       { $this->setLayout($layout);
        }
      }

Навигация