Joomla: Как изменить шаблон для конкретной статьи

Есть ли способ изменить шаблон только для конкретной статьи? Обратите внимание, что это должно работать без привязки статьи к какому-либо меню.


person Kratz    schedule 17.07.2010    source источник


Ответы (4)


Если вы хотите, чтобы переопределение шаблона не зависело от позиции меню, то стандартный способ joomla назначения другого шаблона меню не будет работать. Вам нужно будет запачкать руки и написать собственный код. Вам нужно будет использовать article_id в качестве триггера для переключения шаблона.

Я делал что-то подобное на работе, но сейчас не помню, как именно это достигается. Я опубликую свой код здесь, как только найду его.

EDIT: код найден :)

Вам нужно отредактировать файл /includes/application.php, особенно метод getTemplate(). В конце этого метода, непосредственно перед:

// Fallback template
if (!file_exists(JPATH_THEMES.DS.$template.DS.'index.php')) {
  $template = 'rhuk_milkyway';
}

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

//CUSTOM TEMPLATE FOR THE ARTICLE 13
if (JRequest::getVar('id')=='13' && JRequest::getVar('option')=='com_content') {
  $template = $custom_template_name;
}

Это применит пользовательский шаблон, имя которого находится внутри $custom_template_name, к статье с id=13. Вы также можете использовать его для применения другого шаблона к компонентам, как я сделал с simplecaddy:

//TEMPLATE FOR SIMPLECADDY
if (JRequest::getVar('option')=='com_caddy'){
  $template = 'shop';
}
person silvo    schedule 18.07.2010

Вы действительно должны стараться держаться подальше от жесткого кодирования чего-либо в шаблоне, если этого можно избежать. Не уверен, почему вы указали, что статья не должна быть связана с меню. Самый простой способ сделать это без написания кода и написания кода — создать новое меню, а затем добавить пункт меню со ссылкой на статью, для которой вы хотите указать шаблон. Вам не нужно помещать меню в какой-либо модуль, чтобы оно никогда не отображалось на сайте, но оно будет отображаться в назначении меню в менеджере шаблонов.

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

person Brent Friar    schedule 07.09.2010

Как сказал Брент, избегайте искушения изменить основной код Joomla! Это, скорее всего, остановит вас от обновления Joomla, потому что вы знаете, что это нарушит основные изменения, которые вы сделали.

Помимо метода «скрытый пункт меню» (который полезен, но в некоторых ситуациях может нарушить URL-адреса SEF), полезным инструментом является Хамелеон. Это позволяет вам выбирать определенные статьи/категории/разделы (плюс такие вещи, как тип браузера, группа пользователей, компонент и т. д.) и использовать их для запуска определенного шаблона.

person buzzki    schedule 28.10.2011

Хотя это старый пост, я решил поделиться своими мыслями: вы можете легко изменить шаблон для одной статьи, реализовав функцию onAfterInitialize() в системном плагине. Нет необходимости модифицировать ядро ​​Joomla.

Это работает для Joomla 1.5, но должно работать и в 2.5:

function onAfterInitialise(){
  if(true){ // f.ex. test for article ID or whatever
    JRequest::setVar('template', 'beez'); // change template
  }
}

В версиях joomla 3.x url-параметры обрабатываются иначе. В joomla 3.4.8 было протестировано следующее:

public function onAfterInitialise()
{
  $app=JFactory::getApplication();
  if(true){ // f.ex. test for article ID or whatever
    $app->input->set('template', 'beez3');
  }
}

Подробнее о написании плагинов для Joomla здесь

person jonasfh    schedule 02.02.2016
comment
Я создал плагин с вашим кодом, но когда я пытаюсь проверить текущий компонент, подобный этому, $app->input->get('option') == "com_content" ничего не происходит, не могли бы вы мне помочь? - person ivayloc; 19.03.2016
comment
Попробуйте проверить, действительно ли функция плагина запущена, например. с помощью print_r($app-›input); умри(); Здесь вы также увидите, какие параметры определены в объекте $app-›input... - person jonasfh; 22.03.2016