Каждому разделу - свой com_content_read.tpl

+23
1.54K
Каждому разделу — свой com_content_read.tpl
Сам вопрос задал: instantcms.ru/forum/thread4681.html
Сам и отвечу.
В общем суть проблемы ясна, иногда очень нужно, чтобы оформление статей в разделах отличалось. В моем случае, раздел видео, и не нужно чтобы изображение видео выводилось при подробном просмотре видео.

Первым делом делаем бэкап базы и сайта smileмало ли
Идем в базу данных в phpmyAdmin и выполняем запрос:

  1.  
  2. ALTER TABLE `cms_category` ADD `tpl` VARCHAR( 30 ) DEFAULT 'com_content_read.tpl' NOT NULL AFTER `is_public` ;
  3.  
В созданном поле tpl будем хранить шаблон оформления страницы, по умолчанию com_content_read.tpl

Править будем следующие файлы:
1) admin/applets/cats.php — тут добавим в админке поле для выбора шаблона
2) components/content/frontend.php — тут поправим формирование страницы статьи, а именно ее обработку в smarty
3) components/content/model.php — тут нужно поправить запрос к бд, чтобы данные из нашего поля tpl подтягивались
4) core/classes/page.class.php — тут нужно добавить функцию, которая будет искать в папке components наши шаблоны оформления статей, имеющие вид com_content_read......tpl

Копируем файл com_content_read.tpl из дефолтного шаблона в наш, в папку components ( если нет, то создать ее), создадим его копию и переименуем, например com_content_read_novosti.tpl С помощью этого шаблона в дальнейшем будем оформлять видео новости

Итак, правим файлы по шагам

1) Добавляем в admin/applets/cats.php после кода (примерно 474 строка)

  1.  
  2. <div style="margin-top:20px"><strong>Число колонок для вывода статей</strong></div>
  3. <div>
  4. <?php if (!isset($mod['maxcols'])) { $mod['maxcols'] = 1; } ?>
  5. <input name="maxcols" type="text" id="maxcols" style="width:99%" value="<?php echo @$mod['maxcols'];?>" />
  6. </div>
  7.  
следующий код

  1.  
  2. <div style="margin-top:15px">
  3. <strong>Шаблон раздела</strong> <span class="hinttext">— Файлы из папки <b>components/</b> вашего шаблона, названия которых начинаются на com_content_read</span>
  4. </div>
  5. <div>
  6. <?php
  7. $tpls = cmsPage::getModuleTemplates2();
  8. ?>
  9. <select name="tpl" id="tpl" style="width:100%">
  10. <?php
  11. foreach($tpls as $tpl){
  12. $selected = ($mod['tpl']==$tpl || (!$mod['tpl'] && $tpl=='com_content_read.tpl' )) ? 'selected' : '';
  13. echo '<option value="'.$tpl.'" '.$selected.'>'.$tpl.'</option>';
  14. }
  15. ?>
  16. </select>
  17. </div>
  18.  
2) Заменим в components/content/frontend.php строку (примерно 262 строка)

  1. $smarty = $inCore->initSmarty('components', 'com_content_read.tpl');
на

  1. $smarty = $inCore->initSmarty('components', $article['tpl']);
а строку (примерно 296)

  1. $smarty->display('com_content_read.tpl');
на

  1. $smarty->display($article['tpl']);
3) Правим файл components/content/model.php (ищем строку 290)
Там два запроса к базе

  1. /* ==================================================================================================== */
  2. /* ==================================================================================================== */
  3.  
  4. public function getArticle($article_id) {
  5. $today = date("Y-m-d H:i:s");
  6. $sql = "SELECT con.*, DATE_FORMAT(con.pubdate, '%d-%m-%Y (%H:%i)') pubdate,
  7. DATE_FORMAT(con.pubdate, '%d-%m-%Y') shortdate,
  8. cat.title cat_title, cat.id cat_id, cat.NSLeft as leftkey, cat.NSRight as rightkey, cat.showtags as showtags,
  9. u.nickname as author, con.user_id as user_id, u.login as user_login
  10. FROM cms_content con, cms_category cat, cms_users u
  11. WHERE con.id = $article_id AND con.category_id = cat.id AND con.user_id = u.id AND con.published = 1
  12. AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '$today' AND con.pubdate <= '$today'))";
  13.  
  14. $result = $this->inDB->query($sql);
  15.  
  16. if (!$this->inDB->num_rows($result)) { return false; }
  17.  
  18. $article = $this->inDB->fetch_assoc($result);
  19.  
  20. $article = cmsCore::callEvent('GET_ARTICLE', $article);
  21.  
  22. return $article;
  23.  
  24. }
  25.  
  26. /* ==================================================================================================== */
  27. /* ==================================================================================================== */
  28.  
  29. public function getArticleByLink($seolink) {
  30.  
  31. $sql = "SELECT con.*, con.pubdate as pubdate,
  32. DATE_FORMAT(con.pubdate, '%d-%m-%Y') shortdate,
  33. cat.title cat_title, cat.id cat_id, cat.NSLeft as leftkey, cat.NSRight as rightkey, cat.showtags as showtags,
  34. u.nickname as author, con.user_id as user_id, u.login as user_login
  35. FROM cms_content con, cms_category cat, cms_users u
  36. WHERE con.seolink = '$seolink' AND con.category_id = cat.id AND con.user_id = u.id AND con.published = 1";
  37.  
  38. $result = $this->inDB->query($sql);
  39.  
  40. if (!$this->inDB->num_rows($result)) { return false; }
  41.  
  42. $article = $this->inDB->fetch_assoc($result);
  43.  
  44. $article = cmsCore::callEvent('GET_ARTICLE', $article);
  45.  
  46. return $article;
  47.  
  48. }
  49.  
Пишем вместо них

  1. /* ==================================================================================================== */
  2. /* ==================================================================================================== */
  3.  
  4. public function getArticle($article_id) {
  5. $today = date("Y-m-d H:i:s");
  6. $sql = "SELECT con.*, DATE_FORMAT(con.pubdate, '%d-%m-%Y (%H:%i)') pubdate,
  7. DATE_FORMAT(con.pubdate, '%d-%m-%Y') shortdate,
  8. cat.title cat_title, cat.id cat_id, cat.NSLeft as leftkey, cat.NSRight as rightkey, cat.showtags as showtags, cat.tpl as tpl,
  9. u.nickname as author, con.user_id as user_id, u.login as user_login
  10. FROM cms_content con, cms_category cat, cms_users u
  11. WHERE con.id = $article_id AND con.category_id = cat.id AND con.user_id = u.id AND con.published = 1
  12. AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '$today' AND con.pubdate <= '$today'))";
  13.  
  14. $result = $this->inDB->query($sql);
  15.  
  16. if (!$this->inDB->num_rows($result)) { return false; }
  17.  
  18. $article = $this->inDB->fetch_assoc($result);
  19.  
  20. $article = cmsCore::callEvent('GET_ARTICLE', $article);
  21.  
  22. return $article;
  23.  
  24. }
  25.  
  26. /* ==================================================================================================== */
  27. /* ==================================================================================================== */
  28.  
  29. public function getArticleByLink($seolink) {
  30.  
  31. $sql = "SELECT con.*, con.pubdate as pubdate,
  32. DATE_FORMAT(con.pubdate, '%d-%m-%Y') shortdate,
  33. cat.title cat_title, cat.id cat_id, cat.NSLeft as leftkey, cat.NSRight as rightkey, cat.showtags as showtags, cat.tpl as tpl,
  34. u.nickname as author, con.user_id as user_id, u.login as user_login
  35. FROM cms_content con, cms_category cat, cms_users u
  36. WHERE con.seolink = '$seolink' AND con.category_id = cat.id AND con.user_id = u.id AND con.published = 1";
  37.  
  38. $result = $this->inDB->query($sql);
  39.  
  40. if (!$this->inDB->num_rows($result)) { return false; }
  41.  
  42. $article = $this->inDB->fetch_assoc($result);
  43.  
  44. $article = cmsCore::callEvent('GET_ARTICLE', $article);
  45.  
  46. return $article;
  47.  
  48. }
  49.  
т.е. новый запрос (cat.tpl as tpl,) кроме старых полей цепляет также значение нового созданного поля tpl

4) В файле core/classes/page.class.php ищем строку 1100
Там есть функция, которая ищет в папке modules шаблона все tplки оформления модуля. С помощью модифицированой копии этой функции будем искать в папке components файлы, начинающиеся с com_content_read

После кода
  1.  
  2. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. public static function getModuleTemplates() {
  5.  
  6. $tpl_dir = is_dir(TEMPLATE_DIR.'modules') ? TEMPLATE_DIR.'modules' : PATH.'/templates/_default_/modules';
  7. $pdir = opendir($tpl_dir);
  8.  
  9. $templates = array();
  10.  
  11. while ($nextfile = readdir($pdir)){
  12. if (
  13. ($nextfile != '.') &&
  14. ($nextfile != '..') &&
  15. !is_dir($tpl_dir.'/'.$nextfile) &&
  16. ($nextfile!='.svn') &&
  17. (substr($nextfile, 0, 6)=='module')
  18. ) {
  19. $templates[$nextfile] = $nextfile;
  20. }
  21. }
  22.  
  23. if (!sizeof($templates)){ return false; }
  24.  
  25. return $templates;
  26. }
  27.  
добавим наш код
  1.  
  2. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. public static function getModuleTemplates2() {
  5.  
  6. $tpl_dir = is_dir(TEMPLATE_DIR.'components') ? TEMPLATE_DIR.'components' : PATH.'/templates/_default_/components';
  7. $pdir = opendir($tpl_dir);
  8.  
  9. $templates = array();
  10.  
  11. while ($nextfile = readdir($pdir)){
  12. if (
  13. ($nextfile != '.') &&
  14. ($nextfile != '..') &&
  15. !is_dir($tpl_dir.'/'.$nextfile) &&
  16. ($nextfile!='.svn') &&
  17. (substr($nextfile, 0, 16)=='com_content_read')
  18. ) {
  19. $templates[$nextfile] = $nextfile;
  20. }
  21. }
  22.  
  23. if (!sizeof($templates)){ return false; }
  24.  
  25. return $templates;
  26. }
  27.  
Вуаля :)
Все изменения проведены. В созданном ранее com_content_read_novosti.tpl уберем, например, вывод изображения в подробном выводе новости, а именно удалим строки
  1.  
  2. {if $article_image}
  3. <div class="con_image" style="float:left;margin-top:10px;margin-right:20px;margin-bottom:20px">
  4. <img src="/images/photos/medium/{$article_image}" alt="{$article_image}"/>
  5. </div>
  6. {/if}
  7.  
Идем в админку, в список разделов, открываем интересующий и в правой колонке видим

Иллюстрация

выбираем com_content_read_novosti.tpl
Идем на сайт в тот самый раздел, открываем новость для которой задано изображение и в подробно видим, что картинка не выводится. То есть статья оформляется нашим com_content_read_novosti.tpl Кроме вывода изображения можно в файле com_content_read_novosti.tpl поменять все, что заблагоросудится :)

Все, теперь разделы не будут безлико одинаковы .dance.
По аналогии можно подобное сделать для разделов универсального каталога
НЕ СТАВЬТЕ СРАЗУ НА ЖИВОЙ САЙТ, ПОЭКСПЕРИМЕНТИРУЙТЕ НА ЛОКАЛКЕ
Наверно должно быть в офсборке

UPD. Нельзя писать посты в блог на ночь глядя, пропустил одну правку...
в файле admin/applets/cats.php нужно вместо кода
  1. if ($category['id']){
  2. $sql = "UPDATE cms_category
  3. SET parent_id={$category['parent_id']},
  4. title='{$category['title']}',
  5. description='{$category['description']}',
  6. published={$category['published']},
  7. showdate={$category['showdate']},
  8. showcomm={$category['showcomm']},
  9. orderby='{$category['orderby']}',
  10. orderto='{$category['orderto']}',
  11. modgrp_id='{$category['modgrp_id']}',
  12. maxcols='{$category['maxcols']}',
  13. showtags={$category['showtags']},
  14. showrss={$category['showrss']},
  15. showdesc={$category['showdesc']},
  16. is_public={$category['is_public']},
  17. photoalbum='$photoalbum',
  18. seolink='$seolink',
  19. url='{$category['url']}'
  20. WHERE id = {$category['id']}
  21. LIMIT 1";
  22.  
  23. dbQuery($sql) ;
  24. }
написать
  1. if ($category['id']){
  2. $sql = "UPDATE cms_category
  3. SET parent_id={$category['parent_id']},
  4. title='{$category['title']}',
  5. description='{$category['description']}',
  6. published={$category['published']},
  7. showdate={$category['showdate']},
  8. showcomm={$category['showcomm']},
  9. orderby='{$category['orderby']}',
  10. orderto='{$category['orderto']}',
  11. modgrp_id='{$category['modgrp_id']}',
  12. maxcols='{$category['maxcols']}',
  13. showtags={$category['showtags']},
  14. showrss={$category['showrss']},
  15. showdesc={$category['showdesc']},
  16. is_public={$category['is_public']},
  17. tpl='{$category['tpl']}',
  18. photoalbum='$photoalbum',
  19. seolink='$seolink',
  20. url='{$category['url']}'
  21. WHERE id = {$category['id']}
  22. LIMIT 1";
  23.  
  24. dbQuery($sql) ;
  25. }
иначе категория не будет ни создаваться, ни обновляться. Звиняйте. Теперь точно будет робить zst
0
14 лет назад #
отличное решение +1
0
Zau4man Zau4man 14 лет назад #
Надо еще для вывода статей в разделах (там где список), com_content_view.tpl чтобы для каждой был свой...
и также для УК.
А то иногда УК исользуется и как справка, и как интернет-магазин, и плохо, что они оформляются одинаково.
0
lezginka.ru lezginka.ru 14 лет назад #
для полного счастиья нужна версия для чайников( типа - поменять файлы)
0
Zau4man Zau4man 14 лет назад #
Не не... будет версия 1.6.3 и вам придется вносить изменения снова.
поэтому лучше сразу ручками.
0
14 лет назад #
А по запросу в базе можно рассказать подробнее?
Я его никогда не делал, а там много полей, флажков, кнопок и т.д.
С кодом же все ясно
0
14 лет назад #
запрос сделал, я в запрос по примеру влез в начале
0
bondar bondar 13 лет назад #
очень нужно именно это, но кто-то пробовал на 1.7 ставить*?
0
bondar bondar 13 лет назад #
поверил, не работает((
0
bondar bondar 13 лет назад #
так что никто не знает как под 1.7 подправить. явно же пару строк, или хоть за разумную цену, очень надо)
0
NIKITA NIKITA 10 лет назад #
На последнюю версию актуально?
0
NIKITA NIKITA 10 лет назад #
На 1.10.3 будет?

Еще от автора

Шаблон вывода категорий
Делюсь небольшим компонентом, который выводит на списком записей список категорий со своим шаблоном.
Виджет "Меню добавить"
Небольшой виджет, предназначенный исключительно для вывода меню добавления контента.
ZПоиск. Другой взгляд на поиск
В рамках более глубокого знакомства с Vue в частности с появившимся недавно Composition Api сделал на Vue небольшой компонент, который по функционалу
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.