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

+23
1.51K
Каждому разделу — свой 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 будет?

Еще от автора

Элемент Вопросы/Ответы для конструктора блоков Zbuilder
В приложении к посту архив, при установке которого в компонент Zbuilder будет добавлен элемент Вопросы/ответы, который используется на демо
Конструктор блоков Zbuilder
Я уже делал и использовал на нескольких проектах шорткоды. Мне не понравилось. Потом были просто блоки. Собрал из них несколько проектов.
Про дочерние шаблоны в 2.17.0
В ближайшее время состоится релиз InstantCMS 2.17.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.