Форум русской поддержки Joomla!® CMS
03.12.2016, 23:46:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Переопределение шаблона блога категории и дальнейшее наследование в материалах

 (Прочитано 12192 раз)
0 Пользователей и 1 Гость смотрят эту тему.
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« : 12.06.2013, 12:42:19 »

Туплю неимоверно.
Задача - сделать альтернативный шаблон вывода блога материалов и альтернативный шаблон для страниц полного материала после перехода в "подробнее" из этого альтернативного шаблона блога

1 часть проблем не вызывает, создал в html\com_content\category\ дубликаты файлов для blog_.php и изменил XML, в админке новый пункт меню прекрасно отображается и работает.
2-я часть и туплю. если в html\com_content\article\ создать файлы дубликат шаблона материала под названием catalog.php - то его можно выбирать в настройках материала как альтернативный шаблон.
Но, если в настройках материала оставить все по умолчанию, то при переходе из моего нового блога отображается дефолтный default.php
Если там же добавить дубликат catalog.xml для материала  - в настройках материала выбор шаблона пропадает, но можно выбрать альтернативный шаблон материала как ссылку меню.

Но ни в одном случае новый шаблон материала не подхватывается при переходе из альтернативного шаблона блога.
Пробовал в подробнее руками добавить параметр layout=catalog (index.php?option=com_content&view=article&id=5:laminat-1&catid=9&Itemid=107&layout=catalog) все равно работает стандартный default.php материала

Перелопатил кучу доков, не нашел решения, одни подобные вопросы висят.
Это вообще возможно?
Записан
 
SDKiller
Dev Team
******

Репутация: +325/-5
Offline Offline

Пол: Мужской
Сообщений: 2749


...ergo sum


« Ответ #1 : 12.06.2013, 12:57:30 »

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

\components\com_content\views\article\view.html.php - display()
Показать текстовый блок

Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #2 : 12.06.2013, 13:00:29 »

Я так понял, нужно всем материалам из определённой категории назначить альтернативный макет. Это можно сделать двумя вышеописанными способами:
1. Для КАЖДОГО материала указывать вручную этот макет в опциях
2. Для КАЖДОГО материала назначить пункт меню (для этого собсно и нужен альтернативный xml). Тогда выбор шаблона в опциях материала недоступна.
Я решал эту задачу несколько иначе: в шаблоне материала ставлю проверку на имя, альяс или id категории и вывожу разную разметку.
Например:
Код
if (preg_match('/catalog/', $this->item->category_alias)) {
//шаблон «статьи» каталога
} else {
//статья обыкновенная
}
Записан
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« Ответ #3 : 12.06.2013, 13:11:01 »

т.е. проверять параметр лэйаут референса. Ну это опять велосипед.
да какая разница, я от категории пляшу
Код
//Получим родителькую категорию, если 9  отдадим другой HTML
jimport( 'joomla.application.categories' );
$categories = JCategories::getInstance('Content');
$cat = $categories->get($this->item->catid);
if ($cat->parent_id == 9) {
// альтернативный шаблон материала
} else {
// стандартный шаблон материала
}
 

Но хочется получить нормальное решение, в 3.хх понимаю аналогичная проблема
Записан
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« Ответ #4 : 12.06.2013, 13:23:53 »

beliyadm, для примера может быть структура, когда каталогов несколько, и в каждом есть вложенные категории, тогда лучше layout использовать, т.к. id дает слишком жесткую привязку.
согласен, вариации разные.
Но это не отменяет главного - хардкодное условие, вот что плохо
Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #5 : 12.06.2013, 13:41:44 »

Юр, внимательно. Я то на полигоне щас параллельно смотрю. Ты проверь сперва. А правильное решение будет такое:
Код
jimport( 'joomla.application.categories' );
$categories = JCategories::getInstance('Content');
 
$cat_layout = explode(':',json_decode($categories->get($this->item->catid)->params)->category_layout)[1];
Выглядит ацки конечно, зато реальный лэйаут родительской категории выводит.
--------------
Кстати реальное решение-то получилось. Далее проверяем, если лэйаут отличный от дефолтного, то подключаем подшаблон с этим же именем, иначе обычную статью. И всё.
« Последнее редактирование: 12.06.2013, 13:47:07 от Shustry » Записан
SDKiller
Dev Team
******

Репутация: +325/-5
Offline Offline

Пол: Мужской
Сообщений: 2749


...ergo sum


« Ответ #6 : 12.06.2013, 14:52:26 »

Альтернативное решение

Структура шаблонов:

1) с шаблонами категорий и назначением альтернативного макета для пунктов меню категорий оставляем как в первом посте

2) шаблон материалов:



Где item - переименованный дефолтный, catalog - требуемый альтернативный.

Содержимое файла default.php в данном случае:

Код
<?php
defined('_JEXEC') or die;
 
$active = JFactory::getApplication()->getMenu()->getActive();
 
if ($active->query['option'] == 'com_content' AND $active->query['view'] == 'category'
   AND (!empty($active->query['layout']) AND $active->query['layout'] != 'blog'))
{
   $tmp = explode(':', $active->query['layout']);      //e.g 'atomic:catalog'
   $layout = $tmp[1];                                     //'0'-index is current template, '1'-index is category layout
 
} else {
   $layout = 'item';           //renamed 'default' layout
}
 
$this->setLayout($layout);
 
echo $this->loadTemplate();
 

То есть мы берём назначенный пункту меню шаблон категории и в зависимости от него переопределяем шаблон материалу.

Результат:

Показать текстовый блок

UPD: Могут быть непредсказуемые результаты если одной и той же категории будут назначены несколько пунктов меню (либо будет назначен пункт меню для категории и ещё пункт - отдельному материалу) -  getActive() может выбрать не тот пункт, который хотелось бы )
« Последнее редактирование: 12.06.2013, 15:40:07 от SDKiller » Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #7 : 12.06.2013, 14:54:00 »

SDKiller, да-да! Я про меню тоже ведь подумал сперва. Хорошее решение.
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #8 : 12.06.2013, 18:31:34 »

Берем номер категории выводим шаблон. Нет шаблона выводим по умолчанию
Решение аналогичное данной ситуации
Другой шаблон для пункта меню
Добавил пример default.php
Код
<?php
defined('_JEXEC') or die;
//х.з php
$dir = dirname(__FILE__);
include $dir.'/template'.(( !JFile::exists($dir.'/template'.$this->item->catid.'.php')? '': $this->item->catid).'.php';
теперь для создания шаблона категории 10 стоит создать файл template10.php. Шаблон по умолчанию template.php (в смысле грузится будет, выбор автоматически от категории)
« Последнее редактирование: 13.06.2013, 00:12:04 от Fedor Vlasenko » Записан
Taatshi
Support Team
*****

Репутация: +430/-3
Offline Offline

Пол: Женский
Сообщений: 4712

Мама, я снова верстал во сне...


« Ответ #9 : 14.08.2014, 17:02:37 »

К нынешнему моменту что-нибудь вменяемое для переопределения полного материала из категории появилось или по-прежнему бьем в бубен?
Записан
dieman
Осваиваюсь на форуме
***

Репутация: +9/-0
Offline Offline

Сообщений: 153


« Ответ #10 : 01.09.2014, 11:59:27 »

А как быть, если главная — это "блог категории", при этом есть модуль, который нужно показывать только на главной, а он показывается соответственно на всех страницах "подробнее"?
Публиковать все материалы из этой категории в меню конечно не вариант.
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #11 : 01.09.2014, 12:08:26 »

А как быть, если главная — это "блог категории", при этом есть модуль, который нужно показывать только на главной, а он показывается соответственно на всех страницах "подробнее"?
Публиковать все материалы из этой категории в меню конечно не вариант.
Joomla 2.5 - проверка на главную страницу
Записан
dieman
Осваиваюсь на форуме
***

Репутация: +9/-0
Offline Offline

Сообщений: 153


« Ответ #12 : 01.09.2014, 12:55:23 »


    <?php if(JURI::current()== JURI::base()){ ?>
123
    <?php } ?>
Тупанул, вот так все заработало. Спасибо.
« Последнее редактирование: 01.09.2014, 13:24:42 от dieman » Записан
bandanu
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Сообщений: 156


« Ответ #13 : 04.04.2015, 12:55:55 »

Вывожу через пункты меню категории, соответственно создаю файлы bloggal.php и blogmas.php в шаблоне папка category. Категории выводятся как надо одна и другаю. Проблема с выводом материала, для обеих категорий используется один default.php. Решение SDKiller не доходит до меня, как заставить для
категории bloggal.php грузить свой шаблон материала, допустим тоже gal.php, а для категории blogmas.php грузить свой шаблон материала, допустим тоже mas.php. Подскажите
« Последнее редактирование: 04.04.2015, 13:16:10 от bandanu » Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #14 : 06.04.2015, 15:59:02 »

Я в пятом ответе давал универсальное решение.
Записан
bandanu
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Сообщений: 156


« Ответ #15 : 11.04.2015, 09:49:59 »

 Я понимаю, что такие как я вас достали, но напишите в какой файл вставлять код, как он выбирает нужный шаблон  и как надо назвать альтернативный шаблон категории и материала, чтобы все работало? Спасибо.
Записан
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« Ответ #16 : 18.04.2015, 23:37:34 »

Я в пятом ответе давал универсальное решение.
Ну не знаю, у меня это не работает, первый уровень еще просто проверить, а кучу вложенных уже сложно.
Да и непонятно, почему уровню меню "блог" можно сделать свой шаблон, а материалу по умолчанию нет
Приходится в дефолт.пхп писать проверку на родительскую категорию (обычно у меня "все товары") и от нее плясать в одном файле
Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #17 : 24.04.2015, 16:49:15 »

Везде всё должно работать. По просьбам, мануал:

1. Копируем файл components\com_content\views\article\tmpl\default.php в templates\шаблон\html\com_content\article\
2. После запрета доступа (defined('_JEXEC') or die;) вставляем:

Код
jimport( 'joomla.application.categories' );
$categories = JCategories::getInstance('Content');
$cat_layout = explode(':',json_decode($categories->get($this->item->catid)->params)->category_layout)[1];

3. Теперь всё, что ниже выносим в подшаблон (сразу пару сделайте). Файлы назовите например: default_all.php и default_tovar.php.

4. В default.php вместо вынесенного вывода контента пишем условие подключения подшаблонов:

Код
if ($cat_layout) {
echo $this->loadTemplate('all');
} else {
echo $this->loadTemplate($cat_layout);
}

Всё. Теперь, если у категории указан в админке шаблон вывода tovar, то будет грузиться подшаблон default_tovar.php. От уровня категории не зависит. Материал в ком_контенте всегда принадлежит одной категории.
Записан
Taatshi
Support Team
*****

Репутация: +430/-3
Offline Offline

Пол: Женский
Сообщений: 4712

Мама, я снова верстал во сне...


« Ответ #18 : 22.05.2015, 22:46:59 »

В Joomla 3 не работает. Если альтернативный макет стоит "по умолчанию" - страница материала не грузится.

UPD

У меня заработало так

Код
jimport( 'joomla.application.categories' );
$categories = JCategories::getInstance('Content');
$cat_layout = explode(':',json_decode($categories->get($this->item->catid)->params)->category_layout)[1];
 
if ($cat_layout == 'blog' or $cat_layout == 'default' or !$cat_layout ) {
echo $this->loadTemplate('all');
}
else  {
echo $this->loadTemplate($cat_layout);
};

Только раздражает notice при отсутствии переменной при установке макета "По умолчанию"

Цитировать
Notice: Undefined offset: 1 in W:\domains\site.ru\templates\mytemplate\html\com_content\article\default.php on line 13

Понятно, что появляется ввиду отсутствия второго элемента в массиве. Надо проверку проводить на наличие перед присваиванием.
« Последнее редактирование: 25.05.2015, 13:36:58 от Taatshi » Записан
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« Ответ #19 : 25.05.2015, 02:53:14 »

Всё. Теперь, если у категории указан в админке шаблон вывода tovar, то будет грузиться подшаблон default_tovar.php.
То есть указать для категории новый шаблон без переопределения шаблона вывода в меню (альтернативного шаблона блога меню)?
Завтра попробую, вроде пытался так делать, какой-то затык был
Записан
yiuryumtsev
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 1


« Ответ #20 : 27.10.2015, 11:03:04 »

Код
if ($cat_layout) {
echo $this->loadTemplate('all');
} else {
echo $this->loadTemplate($cat_layout);
}
Вот тут местами поменять условия и все заработает

Код
defined('_JEXEC') or die;
jimport( 'joomla.application.categories' );
$categories = JCategories::getInstance('Content');
$cat_layout = explode(':',json_decode($categories->get($this->item->catid)->params)->category_layout)[1];
 
 
if ($cat_layout) {
 
echo $this->loadTemplate($cat_layout);
} else {
 
echo $this->loadTemplate('all');
 
}
 
Тем же способом в файле category\blog_item.php переопределяем вывод анонсов материала в блоге категорий с дефолтным пунктом меню "Блог категории"
« Последнее редактирование: 27.10.2015, 11:25:03 от yiuryumtsev » Записан
liberator
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 190



« Ответ #21 : 09.02.2016, 23:33:08 »

Ребят, спасибо за тему и за разбор полётов) читал много, не нашел нужной задачи: для одной категории мне нужен один шаблон, для другой категории - другой шаблон.
Как это реализуется? вижу в меню есть default собственно у меня в папке уже есть и он оттуда и берется http://prntscr.com/a14nqm и http://prntscr.com/a14o3k
не могу понять как помимо переопределённого дефолтного еще один (альтернативный добавить?) и как система поймет, что это именно для категории (блог категории) шаблон?
Спасибо, если непонятно - дополню.
Записан
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« Ответ #22 : 09.02.2016, 23:54:33 »

liberator - если вы умеете переоформлять один шаблон, значит умеете все
в папку \templates\шаб\html\com_content\category
кладете копии файлов из \components\com_content\views\category\tmpl
К примеру, вы хотите получить новый шаблон блога материалов категории, значит файлы что вам нужны blog.php blog.xml blog_item.php (это минимальные три файла, есть еще чилдрен и линкс)
Эти файлы переименовать в blog1.php blog1.xml blog1_item.php
В файле blog1.xml изменить строку 3
Код
<layout title="COM_CONTENT_CATEGORY_VIEW_BLOG_TITLE" option="COM_CONTENT_CATEGORY_VIEW_BLOG_OPTION">
параметр title (не забыть сохранить файл в УТФ8)
все, у вас в списке типов пунктов меню появится ваш новый ТИТЛ, как вы его назвали
И так до бесконечности, хоть сотню шаблонов блога создавайте

Вообще в Google статей на тему шаблонизации полно, данная же тема немного глубже и таких базовых вопросов не касается
Записан
liberator
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 190



« Ответ #23 : 10.02.2016, 19:24:32 »

liberator - если вы умеете переоформлять один шаблон, значит умеете все
в папку \templates\шаб\html\com_content\category
кладете копии файлов из \components\com_content\views\category\tmpl
К примеру, вы хотите получить новый шаблон блога материалов категории, значит файлы что вам нужны blog.php blog.xml blog_item.php (это минимальные три файла, есть еще чилдрен и линкс)
Эти файлы переименовать в blog1.php blog1.xml blog1_item.php
В файле blog1.xml изменить строку 3
Код
<layout title="COM_CONTENT_CATEGORY_VIEW_BLOG_TITLE" option="COM_CONTENT_CATEGORY_VIEW_BLOG_OPTION">
параметр title (не забыть сохранить файл в УТФ8)
все, у вас в списке типов пунктов меню появится ваш новый ТИТЛ, как вы его назвали
И так до бесконечности, хоть сотню шаблонов блога создавайте

Вообще в Google статей на тему шаблонизации полно, данная же тема немного глубже и таких базовых вопросов не касается
Спасибо, но не работает, сделал копию файлов (до этого уже так делал и шаблонизацию понимаю - сам процесс, но как НЕСКОЛЬКО шаблонов той же категории сделать - не совсем понимаю)
http://prntscr.com/a1gp50 = 3 файла скопировал, поменял параметр title не высвечиваетя в списке выбора шаблонов новый шаблон, только старые http://prntscr.com/a1gpw7
Записан
liberator
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Пол: Мужской
Сообщений: 190



« Ответ #24 : 10.02.2016, 21:00:32 »

Шаблон для раздела категорий - не базовый вопрос, в любом случае за попытку помочь спасибо. Почему то с джумлофорумом всегда происходит ситуация самопомощи, сам задал вопрос, сам на него же и ответил... Итоговый ответ нашел в хорошей статье по шаблонизации категорий http://zaurmag.ru/joomla/pereopredelenie-shablonov-v-joomla.html и не только категорий но и статей.
Вопрос этот глубже, чем хотелось бы и чем казалось бы Azn реализовал с помощью вышеуказанной статьи.
Записан
Mitriy-Bug
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 93


Верстка сайтов на Joomla


« Ответ #25 : 05.04.2016, 12:57:29 »

liberator - если вы умеете переоформлять один шаблон, значит умеете все
в папку \templates\шаб\html\com_content\category
кладете копии файлов из \components\com_content\views\category\tmpl
К примеру, вы хотите получить новый шаблон блога материалов категории, значит файлы что вам нужны blog.php blog.xml blog_item.php (это минимальные три файла, есть еще чилдрен и линкс)
Эти файлы переименовать в blog1.php blog1.xml blog1_item.php
В файле blog1.xml изменить строку 3
Код
<layout title="COM_CONTENT_CATEGORY_VIEW_BLOG_TITLE" option="COM_CONTENT_CATEGORY_VIEW_BLOG_OPTION">
параметр title (не забыть сохранить файл в УТФ8)
все, у вас в списке типов пунктов меню появится ваш новый ТИТЛ, как вы его назвали
И так до бесконечности, хоть сотню шаблонов блога создавайте

Вообще в Google статей на тему шаблонизации полно, данная же тема немного глубже и таких базовых вопросов не касается
Спасибо, работает. На Joomla 3.5 тоже
Записан
DK-Scorp
Давно я тут
****

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 200


Всегда готов! К чему только....? ХЗ.....


« Ответ #26 : 27.08.2016, 05:48:06 »

Всегда думал почему то что тут все просто, однажды просто вынеся шаблон из компонента в папку шаблона, но вот встала задача выдать свои шаблоны блогу категорий (каждому свой) и соответственно материалам в них.
С категориями более менее разобрался, решение beliyadm работает, добиться вывода своего шаблона в настройках категории у меня так и не получилось, только через меню, но вот с материалами все оказалось куда сложней,
не добился ни вывода своего шаблона в настройках материалов, ни в настройках категорий (т.е. в настройке "Альтернативный макет" категории и материала - ничего не появилось).
Вариант Shustry не сработал на денвере и J3.6.2, точнее вот это:
Код
$cat_layout = explode(':',json_decode($categories->get($this->item->catid)->params)->category_layout)[1];
Выдает 500 ошибку и все, поступил следующим образом - создал файл шаблона статьи с id категории, при выводе проверяю его наличие и подключаю (в моем случае-примере это default_cat9.php), т.е. если я например вывожу статью из категории 9, проверяю наличие шаблона и подключаю его если он есть.
Вот код default.php возможно пригодится кому-то еще:
Код
$app = JFactory::getApplication();
$template = $app->getTemplate();
$templateparams = $app->getTemplate(true)->params;
 
$file = '/templates/' . $template . '/html/com_content/article/default_cat'.$this->item->catid.'.php';
if (JFile::exists(JPATH_ROOT.$file)) {
echo $this->loadTemplate('cat'.$this->item->catid);
} else { Здесь все остальное содержимое default.php }
Вставляем после проверки на прямое обращение или до вывода разметки.

Теперь вопрос к знатокам:
как вывести путь к шаблону из массива $this?


P.S. Идея отличная (не моя, а общая :-) ), но реализация - через опу.... + какая-то нелогичность настроек и запутанность - ну сделали бы тупо в настройках категории выбор шаблона и подрубался бы он и в блогах и статьях, без лишней настройки в меню
« Последнее редактирование: 27.08.2016, 08:50:25 от AlekVolsk » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet