0 Пользователей и 1 Гость просматривают эту тему.
  • 17 Ответов
  • 3692 Просмотров
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Задача:
Есть дизайн в котором шапка, меню и подвал — одинаковые на всех страницах, а вот лейаут этих страниц сильно отличается друг от друга.

Имеется
Joomla 1.5.9

Из фака
"Как сделать разный дизайн для ценра страницы для каждого пункта меню?" — ведет в никуда, поиск по форуму ничего не дал, то что видел при поиске неподходит, т.к. должна быть возможность из админки для страницы поставить шаблон отображения, а не привязываться к ID страницы.

Первые попытки:
Сделал шаблон _global в котором определил базовый лейаут страницы (который одинаков для всех страниц).
Внутри этого шаблона в двух местах включаются такие конструкции:
Код: php
<?php insert("template.php", $this) ?>
<?php insert("title.php", $this) ?>

Функция insert вынесена в файл helper.php (файл подключается: include dirname(__FILE__).DIRECTORY_SEPARATOR.'helper.php'; ):
Код: php
  function insert($filename, $parent)
  {
    $inherit = dirname(__FILE__)."/../".$parent->template.'/'.$filename;
    $global = dirname(__FILE__).DIRECTORY_SEPARATOR.'/'.$filename;

    if(file_exists($inherit)){
      include $inherit;
    } else {
      include $global;
    }
  }
Как видно функция смотрит, есть ли в текущем шаблоне файл $filename и подключает его, если нет, то берет его из шаблона _global.

Что я в итоге получил?
Я создал другой шаблон (назовем его inherited), в котором в index.php написал следующее:
Код: php
include dirname(__FILE__).DIRECTORY_SEPARATOR.'../_global/index.php';

И соответсвенно если я создам в этом inherited шаблоне файл template.php например, то получу страницу с оформлением из _global шаблона куда вставлено все что написано в template.php inherited шаблона.

Т.е. я могу создать кучу шаблонов, которы будут наследовать глобальный шаблон и иметь свой собственный лейаут. Что и было моей задачей.
Все бы хорошо, Но!

Возникла задача перекрыть mod_mainmenu.
В доках было найдено, что в директории шаблона создать файл html/mod_mainmenu/default.php, в котором соответственно и перекрывать этот модуль.
Надежда что все заработает если я сделаю такое в _global шаблоне, но страница будет показываться через inherited шаблон, не увенчалась успехом.
Естественно перекрытие не подхватилось.

Положил тоже самое в inherited шаблон и все заработало, но такое решение не подходит, т.к. копировать одно и тоже во все новые шаблоны — неправильно и в дальнейшем могут возникнуть серьезные проблемы (если понадобиться что-то изменить), тем более перекрытие mod_mainmenu связано непосредственно с отображением общего меню.

Долго копал различные доки, гугл и тп, но найти хотя бы что-то близкое к этому не получается.

Соответсвенно возникло несколько вопросов, которые я хочу задать.
1. Может быть это все делается куда проще чем я тут нагородил?
2. Как можно правильно отнаследовать шаблон (я предполагаю, что есть какая-то функция, которая позволит вытащить глобальный шаблон по имени и отрендерить его подхватив файлы из текущего шаблона)
3. Можно как-то правильнее написать то, что я написал?

Это вобщем-то мое первое знакомство с Joomla, и можно сказать что второе знакомство с PHP.

Заранее благодарю всех кто сможет хоть чем-то помочь.
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Ответов не поступило, что очень странно.
Перерыл кучу файлов, классов и т.п. и сделал-таки решение, которое на данный момент меня устраивает.

Вносим правки
в файл helper.php (вместо функции import, т.к. она нам уже ненужна):
Код: php
  function global_render()
  {
    global $mainframe;
   
    // Base instances
  $document =& JFactory::getDocument();
  $user     =& JFactory::getUser();

  // Define global template
  $_template = "_global";
  $_template_dir = JPATH_THEMES.DS.$_template;

    // example includes/application.php "render" function
  $file = JRequest::getCmd('tmpl', 'index');
  if (JSite::getCfg('offline') && $user->get('gid') < '23' ) {
  $file = 'offline';
  }
  if (!is_dir( $_template_dir ) && !JSite::getCfg('offline')) {
  $file = 'component';
  }

  $params = array(
  'template' => $_template,
  'file' => $file.'.php',
  'directory' => JPATH_THEMES
  );

    // Catch current template
    $template = $mainframe->getTemplate();
    $template_dir = JPATH_THEMES.DS.$template;

    // Set global template as current and render document
    $mainframe->setTemplate('_global');
  $data = $document->render( JSite::getCfg('caching'), $params );

    // Set back current template
    $mainframe->setTemplate($template);


  $replace = array();
  $matches = array();

    // Catch own construction for include files
    // (example /libraties/joomla/document/html/html.php "_parseTemplate" function)
  if(preg_match_all('#<jdoc:file\ name="([^"]+)".*\/>#iU', $data, $matches)){
  $matches[0] = array_reverse($matches[0]);
  $matches[1] = array_reverse($matches[1]);

  $count = count($matches[1]);

  for($i = 0; $i < $count; $i++){
    $inc = $matches[1][$i];
    $tpl_dir = $template_dir;

    // if file does not exist in current template,
    // looking for it in "_global" teamplate dir
    if(!file_exists($template_dir.DS.$inc)){
      $tpl_dir = $_template_dir;
  }

    $tpl = $document->_loadTemplate($tpl_dir, $inc);
    $tpl = $document->_parseTemplate($tpl);

      $replace[$i] = $tpl;

  }

    $data = str_replace($matches[0], $replace, $data);

  }

    return $data;
  }

В глобальном шаблоне
теперь можно использовать следующую инструкцию:
Код: html
<jdoc:file name="template.php" />

Отнаследованный шаблон
index.php теперь имеет следующий вид:
Код: php
<?php
  defined('_JEXEC') or die('Restricted access');
  include JPATH_THEMES.DS.'_global/helper.php';
  echo global_render();
?>

Что все это дало
1. Глобальный шаблон рендерится из наследуемого в контексте глобального, что дает нам возможность перекрывать модули непосредственно в глобальном шаблоне.
2. Файлы из новой конструкции теперь рендерятся в контексте наследуемого шаблона

Написал за тем, что может кому-нть пригодится.

PS Был бы признателен если кто-нибудь привел бы написанное в порядок.

Столкнулся с подобной проблемой.

Что могу сказать по существу:
1. Ответов не густо из-за того, что версию 1.5.x осваивают новички,
    а бывалые, создавшие что-то в 1.0.x, пока не пересаживаются
    из-за отсутствия нужных версий плагинов.

2. В версии 1.5.x изменился механизм использования шаблонов.
    о том как он изменился я прочёл в книге. Суть сводится к тому,
    что появилось понятие "view" - представление, для разных компонентов
    и шаблонов. Файлы, отвечающие за представления лежат в папках
    \components\com_content\views - это ядерная часть и в папке \html
    каждого шаблона, то что предусмотрено в шаблоне (по ходу этим
    шаблон 1.5 от 1.0 и отличается.)

3. Я реально начинающий "Joomler", поэтому не понял как этим пользоваться...

вот текст:

Преобразование с помощью шаблонов

Пожалуй, самая впечатляющая особенность шаблонов, появившаяся
в Joomla 1.5, - это способность преобразовывать страницу, получаемую
от ядра системы. Она реализована с помощью новых выходных файлов,
которые называются файлами шаблона и содержат макет представления
компонентов и модулей. Всякий раз, выводя страницу, Joomla
проверяет наличие этих файлов в каталоге шаблона и с их помощью
преобразует ее.
Схема преобразования
Все файлы с макетами представления и шаблоны располагаются в
каталоге /tmpl/. Для компонентов и модулей местонахождение этого
каталога может несколько отличаться, так как модули имеют
единственное представление. Например:
modules/mod_newsflash/tmpl/
modules/mod_poll/tmpl/
components/com_login/views/login/tmpl/
components/com_content/views/section/tmpl/
Типичная схема преобразования для всех компонентов и модулей
выглядит так: Представление -> Макет -> Шаблоны.

Преобразование в модулях


Для каждого модуля в дереве каталогов появилась новая папка с именем
tmpl, в которой содержатся шаблоны этого модуля. Внутри папки
находятся PHP-файлы, которые генерируют код разметки модуля, например:
/modules/mod_newsflash/tmpl/default.php
/modules/mod_newsf lash/ tmpl/horiz. php
/modules/mod_newsflash/tmpl/vert.php
/modules/mod_newsflash/tmpl/_item.php

Преобразование в компонентах

Компоненты работают практически так же, за исключением того что
с каждым компонентом может быть связано несколько
представлений.
Если заглянуть в папку com_content, можно увидеть папку с именем
views.
/components/com_content/views/
/components/com_content/views/archive
/components/com_content/views/article
/components/com_content/views/category
/components/com_content/views/section
Отсюда несложно догадаться, что эти папки соответствуют четырем
возможным представлениям содержимого архива, статьи, категории
и раздела.
Внутри представления можно обнаружить папку с именем tmpl, а в ней -
различные макеты.
Если заглянуть в папку category, мы увидим
/components/com_content/views/category/blog.php
/components/com_con tent/ views/category /blog_item.php
/components/com_content/views/category/blog_links.php
/components/com_content/views/category/default.php
/components/com_content/views/category/default_items.php
Обратите внимание, что в этом случае макет default.php компонента
com_content соответствует стандартному макету, в котором статьи
представлены в виде списка ссылок.
311
Открыв файл blog_item.php, можно заметить, что в настоящее время
в нем используются таблицы. Если потребуется выполнить
преобразование выходной разметки, необходимо поместить в папку template/
html/ соответствующий файл, например:
templates/templatetutorial15bold/html/com_content/category/blog_item.php
Этот относительно несложный процесс заключается в простом
копировании файлов из папок /components/ и /modules/ в templates/yourtemplate/
html.
Возможность преобразования с помощью шаблона обеспечивает мощный
механизм настройки сайта, построенного на базе Joomla. Вы можете
создавать шаблоны, оптимизированные для поисковых систем,
обладающие повышенной доступностью или учитывающие специфические
потребности ваших клиентов.
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Рад что хоть у кого-то возникла похожая проблема :)
Я тоже самый-самый начинающий joomler, т.к. познакомился и начал крутить/изучать ее дней 5 назад...

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

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

gdX

  • Глобальный модератор
  • 995
  • 128 / 0
  • Открыт к заказам по дизайну
Вобще сделано вроде как довольно масштабируемо, но иногда надо очень глубоко в недры лезть, чтобы понять как это работает и как это правильно перекрыть, к тому же сохранив возможность обновления версии самой joomla.
Вы, случаем, не об этом?
Шаблонизация компонентов в Joomla1.5. Первый взгляд.
Шаблонизация модулей
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Да про это, пояснил k128 что это как раз все просто, вот и говорю что довольно масштабируемо. Но описанное мной решение было о другом :)

     Да, действительно, hmelyoff, хоть и говорит, что начинающий Jooml'ер, а ведь молодец!
Дело в том, что я свой движок совершенствовал долго (до тех пор пока мог потребности
удовлетворять), а сейчас на Joomla перехожу...
     А проблема-то похоже в том, что изначально Joomla не предназначена для некоторых
вещей. Например - первая страница СИЛЬНО отличается по логике и навигации от всех
остальных. Как быть? FRONTPAGE не помогает т.к. работает в рамках того-же шаблона.
Мы лепим кучу условий типа
Код: php
if ($option == 'com_content' && $view == 'frontpage') : 
и потом... что мы имеем? Шаблон? Кому он нужен, кроме нас? Да и не шаблон это - монстр!
Честно говоря не проверил пока предложенное решение (helper.php), но что-то меня в сторону Drupal
потянуло, там говорят не нужно кораблик в бутылке делать...
     Хотя, наверное я чего-то не понимаю... может и правда сделать отдельные шаблоны на
первую и остальные, а потом если что и ещё... но тогда дубляжа много...

     ПРИ ВАШЕМ СОГЛАСИИ, ПРОШУ ОБЪЯСНИТЬ!
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Я это решение уже проверил в действии, щас как раз собираю сайт на joomla. Пока проблем не выявилось, попробуйте, если какие проблемы возникнут, пишите. Как раз мое предложенное решение избавляет от дубляжа, т.к. новый шаблон вставляет куски в главный шаблон (меню, шапка, и т.п. вещи как раз описываются в главном шаблоне).
У меня в блоге рабочий пример есть.

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

А друпал я всегда считал блоговой платформой, вернее заточенной под блоги и комьюнити различные.
« Последнее редактирование: 20.05.2009, 01:53:46 от hmelyoff »
*

gdX

  • Глобальный модератор
  • 995
  • 128 / 0
  • Открыт к заказам по дизайну
Думаю, что тут надо следовать от обратного.
Сначала представить требования проекта, который Вам предстоит реализовать, потом немного представить во что может вылиться этот проект в будущем (6-12 месяцев вперед [см. каждый проект в отдельности]), потом прикинуть систему, которая может это реализовать, потом найти разработчика или своими силами участвовать, или совместно со сторонним разработчиком выполнить задание и получить свой гонорар…

p.s.
Joomla не такой уж и «деревянный» инструмент, что может показаться с первого взгляда.
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
конечно же эта схема самая лучшая, если гонорар сколько нибудь существенный, или в проекте программисты могут иметь свой интерес :)
но к сожалению есть и другие случаи.
*

gdX

  • Глобальный модератор
  • 995
  • 128 / 0
  • Открыт к заказам по дизайну
А друпал я всегда считал блоговой платформой, вернее заточенной под блоги и комьюнити различные.
Думаю, что не стоит так утверждать, если не смотрели в сторону Movable Type.
*

gdX

  • Глобальный модератор
  • 995
  • 128 / 0
  • Открыт к заказам по дизайну
конечно же эта схема самая лучшая, если гонорар сколько нибудь существенный…
Или соответствующий реализованному результату.
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Думаю, что не стоит так утверждать, если не смотрели в сторону Movable Type.

Я не утверждал, а сказал что считал всегда... CMS это как продукт, что про него говорят и делают (или какая реклама), с тем и ассоциируется, я всегда сталкивался с Друпалом именно когда кто-то делал какие-либо комьюнити, от туда и пошла моя точка зрения.
*

gdX

  • Глобальный модератор
  • 995
  • 128 / 0
  • Открыт к заказам по дизайну
Не в обвинениях дело, а в подходе к реализации того или иного продукта (в данном случае интернет-ресурса).
Если разработчик сможет реализовать заказанный результат, то не важно как он это реализует, если это не оговорено заказчиком.
Поэтому каждому из нас «флаг в руки» и духу побольше, да терпения, ну и куда же без знания…
;)
*

hmelyoff

  • Новичок
  • 9
  • 0 / 0
Вобщем-то все верно :)
Стараюсь себя от программирования держать подальше, благо знакомых программистов хватает, но иногда приходится.

В версии 1.5.x изменился механизм использования шаблонов. о том как он изменился я прочёл в книге.

А ссылку на книгу или хотя бы название не подскажешь???

Очень надо! Заранее спасибо )
*

Святослав

  • Новичок
  • 5
  • 1 / 0
"Как сделать разный дизайн для ценра страницы для каждого пункта меню?"
Я решаю эту задачу так: Каждый пункт меню имеет свой Itemid, вичисляю его
Код: php
<?php $Itemid = JRequest::getVar('Itemid'); ?>
Этой переменной можно менять класс для блоков, например
Код: html4strict
<div id="content<?php echo $Itemid; ?>">
. Дальше в стилях прописываем для каждого класса свойства.
Или проверять Itemid и вставлять свою верстку для каждого пункта меню.
*

Boom_nsk

  • Новичок
  • 8
  • 0 / 0
Ребят.не по теме но может кто подскажет.поставил шаблон на денвер перед устанокой на сайт,потестил все ок,перенес на сайт а там шарифт отображается прописными буквами,как испарвить? версии Joomla разные на денвере 15,на хосте 22.шаблон - it_prestige 1.0
За метил еще кое что
При переходе в меню,стиль постоянно меняется шрифта,то больше то меньше то прописной то обычный
« Последнее редактирование: 05.03.2011, 12:58:18 от Boom_nsk »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как вывести путь до шаблона с помощью API Joomla?

Автор elche

Ответов: 13
Просмотров: 10986
Последний ответ 11.09.2018, 23:48:50
от DK-Scorp
как правильно устанавливать Quick start?

Автор nicksem

Ответов: 21
Просмотров: 41131
Последний ответ 30.01.2018, 14:54:08
от SeBun
шаблон IT Newsy - By IceTheme проблема со списком.

Автор wolf34

Ответов: 4
Просмотров: 2669
Последний ответ 30.05.2017, 11:52:27
от darkghost
Стили шаблона

Автор karkan25

Ответов: 12
Просмотров: 1250
Последний ответ 21.05.2017, 16:40:32
от karkan25
Проблема с изменением логотипа штатного шаблона rhuk_milkyway Joomla_1.5

Автор Porohok

Ответов: 6
Просмотров: 1429
Последний ответ 22.03.2017, 10:34:23
от Porohok