Изменения в шаблонах

Рубрика: MaxSite CMS -> Ход работ
Суббота, 2 мая 2009 г.
Просмотров: 3905
Подписаться на комментарии по RSS
]]>
]]>

В будущей MaxSite CMS 0.32 решил сделать еще большую кастомизацию шаблонов. Начальные идеи я описал на форуме, а здесь остановлюсь на основных моментах.

Итак, у нас есть некая базовая концепция организации шаблонов: html-каркас хранится отдельно, а программная часть в каталоге type дефолтного (default) шаблона. Пример: шаблон «Clouds». Этим удалось значительно снизить зататы на создание шаблонов, то есть дизайнеру нет необходимости заниматься программированием и поддержкой обновлений - все автоматом обновится вместе с системой.

Однако, такой подход имеет и ограничения. Прежде всего речь идет о том, что в type-файлах жестко задан порядок вывода информации: заголовок, дата, потом рубрики и т.д. А что делать, если по дизайну нужно вывести рубрику после текста, а дату вообще убрать? Единственный способ был - скопировать нужный type-файл в свой шаблон и там его уже править.

Само по себе это не очень сложно, но тут у нас может возникнуть проблема с обновлением. Например в будущей версии MaxSite CMS я что-то изменю в дефолтном шаблоне: скажем, добавлю новую полезную функцию. Таким образом вебмастеру придется искать все изменения и опять обновлять свои type-файлы.

Всё это не совсем удобно, поэтому я решил реализовать механизм, который позволяет использовать type-файлы «частично»: подключается type-файл дефолтный, а для организации самого цикла вывода - свой кастомный «type_foreach»-файл.

На практике это выглядит так. В type-файлах заданы идентификаторы цикла. Если вы используете свои type-файлы, то сможете придумать свои варианты, а для шаблона default они такие:

  • archive
  • author
  • category
  • comments
  • home-cat-block-last-page
  • home-cat-block
  • home-top
  • home
  • page-comment-form
  • page-comments
  • page
  • search
  • tag
  • users-all

Несложно догадаться какой для чего используется. Дальше так. В шаблоне default я заранее приготовил каталог «type_foreach», в нем файлы с префиксом «_». Вебмастеру достаточно скопировать этот каталог в свой шаблон и убрать из имени префикс для нужных файлов. Теперь система автоматом их подхватит и будет использовать в цикле вывода. Если вы посмотрите эти файлы, то увидите, что они очень небольшие и содержат только «дизайнерскую» часть вывода. Таким образом мы сохранили type-файлы и смогли кастомизировать сам вывод.

Специальное замечание: все старые шаблоны будут работать без изменений, как и работали и ничего в них менять не придется. У вас также осталась возможность, как и прежде использовать свои type-файлы. Файлы «type_foreach» просто еще одна возможность MaxSite CMS, облегчающая жизнь вебмастеру.

Данное изменение я решл анонсировать заранее, пока оно доступно только в latest-версии 0.326.

Но это еще не всё. smile

При разработке плагина гостевой книги, я столкнулся с небольшой проблемой подключения своей страницы для шаблона непосредственно из плагина. У нас есть type-файлы, которые подключаются в шаблонном index.php. В нем происходит анализ с помощью is_type() или mso_segment(). Это типовой подход.

Теперь мне нужно вывести свою страницу в шаблоне по какому-то произвольному slug. Короткая ссылка задается в админ-панели и проверять её в шаблоне не учень удобно: если шаблонов много, то для интеграции придется менять их все.

Можно «прицепиться» на хук «init», но тогда придется придумывать и обходные маневры, чтобы подключить сам шаблон сайта...

Кстати, я только недавно задумался, что в MaxSite CMS не до конца продуман механизм подключения страницы плагина к шаблону. Подключение страниц к админ-панели работает на ура, а вот к шаблону - нет.

В итоге родилось очень простое решение, которое позволяет создавать любые вариации (по сути) type-файлов прямо из плагинов.

Для этого мы просто-напросто перед подключением «page_404» проверяем хук «custom_page_404». Если такого хука нет или он возвращает false, то подключаем как обычно 404-страницу. Иначе то, что задаст разработчик плагина.

Приведу полное описание здесь.

В index.php своего шаблона нужно изменить строчку:

  1.  else require($type_dir . 'page_404.php');

на

  1.  else
  2.  {
  3.   if ( !mso_hook_present('custom_page_404') or !mso_hook('custom_page_404'))
  4.   require($type_dir . 'page_404.php');
  5.  }

Теперь в плагине цепляемся (в _autoload) на хук «custom_page_404»:

  1.  mso_hook_add('custom_page_404', 'myplugin_custom_page_404');

И создаем функцию myplugin_custom_page_404():

  1.  function myplugin_custom_page_404($args = false)
  2.  {
  3.   if ( mso_segment(1)=='myslug' )
  4.   {
  5.   // подключили свой файл вывода
  6.   require( getinfo('plugins_dir') . 'myplugin/mytype.php' );
  7.   return true; // выходим с true
  8.   }
  9.   return $args;
  10.  }

Теперь, если у нас будет адрес http://сайт/myslug, то будет подключен файл mytype.php, который находится в каталоге плагина!

Продключить оформление шаблона в mytype.php элементарно:

  1.  <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3.  // meta title страницы
  4.  mso_head_meta('title', t('Мой плагин', 'plugins/myplugins') );
  5.  
  6.  # начальная часть шаблона
  7.  require(getinfo('template_dir') . 'main-start.php');
  8.  
  9.  echo 'Мой плагин';
  10.  
  11.  # конечная часть шаблона
  12.  require(getinfo('template_dir') . 'main-end.php');
  13.  ?>

Я даже сам удивлен, что столь простое решение не пришло мне в голову раньше, настолько оно очевидное. Скажем ту же контактную форму проще «прицепить» в виде плагина и не «таскать» из шаблона в шаблон. smile

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

Комментариев: 10

  1. 2009-05-02 в 20:20:33 | Wave
    ]]>]]>
    зататы на создание шаблонов
    Скажем туже контактную форму проще «прицепить» в виде плагина и не «таскать» из шаблона в шаблон.
    А вот это очень классно! Один только нюанс: этот подход не может переопределить уже существующую ссылку. Я пока не очень представляю, где нужно бы, чтоб плагин перехватил ссылку на уже существующую страницу и переопределял её дизайн…

    Хотя… Плагин «Бонус» — нужно, чтобы какая-то страница (например, описание очередной акции со скидками) переоделась в бонусный дизайн. Таким подходом всё равно не решается. Всё равно надо или создать свой тип страниц и бонусную туда засунуть, а в шаблоне переодеть, или ещё как-то.

    P.s. Ту же — в данном случае пишется раздельно.

  2. 2009-05-02 в 21:33:41 | Максим
    ]]>]]>

    Если дизайн, то мы уже обсуждали на форуме. Нужно смотреть в header.php шаблона и там цеплять свои стили.

    Если же нужно перехватить ссылку до всех, то это хук на init. Там например можно переопределить тип с page (то что система определила) на любой несуществующий. Тогда он автоматом пойдет на хук custom_page_404. Но вообще, если на уровне шаблона, то проще всего явно проверить в шаблонном index.php и не мучиться. smile

  3. 2009-05-02 в 22:40:41 | Wave
    ]]>]]>

    Примерно догнал насчёт хука на init. До этого не обратил внимание.

    Но вообще описанная задача — гипотетическая, придуманная на месте.

  4. 2009-05-03 в 11:44:13 | Аноним

    Хорошая идея.

    Только мне название custom_page_404 не очень нравится, я бы оставил только custom_page.

  5. 2009-05-07 в 13:11:46 | Attlant

    Очень бы хотелось типограф в новых версиях raspberry

  6. 2009-05-14 в 13:05:07 | aleks_lekia
    ]]>]]>

    Максим, у меня 2 вопроса-пожелания к следующей версии:

    1. я использую ушку для размещения иконки RSS подписки. Если я делаю заголовок к ней достаточно длинным, то выглядит он ужасно: образуются огромные пробелы и слова переносятся на другую строку в произвольном порядке. Можно ли как-то вставлять в эту надпись знаки переноса (если слово не помещается целиком) и управлять выключкой. Посмотреть можно здесь: http://kabee.net.ru/

    2. можно ли как-нибудь упростить форму комментария, чтобы комментатор мог сразу вбивать адрес своего сайта, а код подтверждения реализовывался через плагин (как это сделано с капчей)? Кстати, я провел тест: попробовал прокомментировать и мне код почему-то не выслался. Почему?

  7. 2009-06-08 в 10:34:25 | Cuprum
    ]]>]]>

    Иногда необходимо поправить и 404-ую страницу (вывести другое сообщение об ошибке, обернуть дополнительным div-ом - требование дизайна)поэтому предлагаю включать в type_foreach полный список типовых файлов аналогичных дефолтному.

  8. 2009-06-08 в 11:08:38 | Максим
    ]]>]]>

    Принято.

  9. 2009-06-26 в 17:18:13 | Cuprum
    ]]>]]>

    Вообщем, пытался я сделать шаблон на type_foreach - с тз. косметических изменений в оформлении - да, удобнее и проще. Но когда необходимо копнуть поглубже, например, банально изменить фразу "Оставить комментарий" на "Прокомментируйте" или случай с чередованием фона комментариев (описывал на форуме, правда, тема канула в лету) тут без обычных /type/ не обойтись.

  10. 2009-09-17 в 09:21:42 | Комментатор 139
    ]]>]]>

    Посмотрим.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

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



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)