Привет всем!
В параметрах категории существует поле "Альтернативный макет". С точки зрения пользователя при отображении категории на фронте должен отображаться выбранный шаблон, но разработчики с этим не согласны
![Shocked :o](https://joomlaforum.ru/Smileys/default/shocked.gif)
По-мнению разработчиков данный шаблон (альтернативный) должен отображаться только в случаях:
- это не активный пункт меню
- в ссылке нет view=category
- в ссылке нет id=id категории
иначе берется шаблон из параметров п. меню.
Разработчики предлагают создавать свой тип меню, скопировав blog.php, blog.xml (blog_item.php и др.) и переименовать в newblog.php, newblog.xml и т.д.. Но при этом теряется часть функционала того же вида Блог.
Следующий хак таков:
файл components/com_content/views/category/view.html.php строка 131 в ней
if ((!$active) || ((strpos($active->link, 'view=category') === false) || (strpos($active->link, '&id=' . (string) $this->category->id) === false)))
{
// Get the layout from the merged category params
if ($layout = $this->category->params->get('category_layout'))
{
$this->setLayout($layout);
}
}
// At this point, we are in a menu item, so we don't override the layout
elseif (isset($active->query['layout']))
{
// We need to set the layout from the query in case this is an alternative menu item (with an alternative layout)
$this->setLayout($active->query['layout']);
}
Я сделал следующие правки:
if ((!$active) || ((strpos($active->link, 'view=category') === false) || (strpos($active->link, '&id=' . (string) $this->category->id) === false)))
{
// Get the layout from the merged category params
if ($layout = $this->category->params->get('category_layout'))
{
$this->setLayout($layout);
}
}
// At this point, we are in a menu item, so we don't override the layout
elseif (isset($active->query['layout']))
{
/* Fix BelKoD aka Фей */
// Get the layout from the merged category params
if ($layout = $this->category->params->get('category_layout'))
{
$this->setLayout($layout);
}
else
{
// We need to set the layout from the query in case this is an alternative menu item (with an alternative layout)
$this->setLayout($active->query['layout']);
}
}
Теперь, при выборе значения в поле "Альтернативный макет", используется выбранный шаблон. При этом остается весь функционал родительского шаблона (layout).