В будущей 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.
Но это еще не всё. :)
При разработке плагина гостевой книги, я столкнулся с небольшой проблемой подключения своей страницы для шаблона непосредственно из плагина. У нас есть type-файлы, которые подключаются в шаблонном index.php. В нем происходит анализ с помощью is_type() или mso_segment(). Это типовой подход.
Теперь мне нужно вывести свою страницу в шаблоне по какому-то произвольному slug. Короткая ссылка задается в админ-панели и проверять её в шаблоне не учень удобно: если шаблонов много, то для интеграции придется менять их все.
Можно «прицепиться» на хук «init», но тогда придется придумывать и обходные маневры, чтобы подключить сам шаблон сайта...
Кстати, я только недавно задумался, что в MaxSite CMS не до конца продуман механизм подключения страницы плагина к шаблону. Подключение страниц к админ-панели работает на ура, а вот к шаблону - нет.
В итоге родилось очень простое решение, которое позволяет создавать любые вариации (по сути) type-файлов прямо из плагинов.
Для этого мы просто-напросто перед подключением «page_404» проверяем хук «custom_page_404». Если такого хука нет или он возвращает false, то подключаем как обычно 404-страницу. Иначе то, что задаст разработчик плагина.
Приведу полное описание здесь.
В index.php своего шаблона нужно изменить строчку:
else require($type_dir . 'page_404.php');
на
else { if ( !mso_hook_present('custom_page_404') or !mso_hook('custom_page_404')) require($type_dir . 'page_404.php'); }
Теперь в плагине цепляемся (в _autoload) на хук «custom_page_404»:
mso_hook_add('custom_page_404', 'myplugin_custom_page_404');
И создаем функцию myplugin_custom_page_404():
function myplugin_custom_page_404($args = false) { if ( mso_segment(1)=='myslug' ) { // подключили свой файл вывода require( getinfo('plugins_dir') . 'myplugin/mytype.php' ); return true; // выходим с true } return $args; }
Теперь, если у нас будет адрес http://сайт/myslug, то будет подключен файл mytype.php, который находится в каталоге плагина!
Продключить оформление шаблона в mytype.php элементарно:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); // meta title страницы mso_head_meta('title', t('Мой плагин', 'plugins/myplugins') ); # начальная часть шаблона require(getinfo('template_dir') . 'main-start.php'); echo 'Мой плагин'; # конечная часть шаблона require(getinfo('template_dir') . 'main-end.php'); ?>
Я даже сам удивлен, что столь простое решение не пришло мне в голову раньше, настолько оно очевидное. Скажем ту же контактную форму проще «прицепить» в виде плагина и не «таскать» из шаблона в шаблон. :)
Комментариев: 10 RSS
1WaveСайт02-05-2009 18:20
Хотя… Плагин «Бонус» — нужно, чтобы какая-то страница (например, описание очередной акции со скидками) переоделась в бонусный дизайн. Таким подходом всё равно не решается. Всё равно надо или создать свой тип страниц и бонусную туда засунуть, а в шаблоне переодеть, или ещё как-то.
P.s. Ту же — в данном случае пишется раздельно.
2Максим02-05-2009 19:33
Если дизайн, то мы уже обсуждали на форуме. Нужно смотреть в header.php шаблона и там цеплять свои стили.
Если же нужно перехватить ссылку до всех, то это хук на init. Там например можно переопределить тип с page (то что система определила) на любой несуществующий. Тогда он автоматом пойдет на хук custom_page_404. Но вообще, если на уровне шаблона, то проще всего явно проверить в шаблонном index.php и не мучиться. :)
3WaveСайт02-05-2009 20:40
Примерно догнал насчёт хука на init. До этого не обратил внимание.
Но вообще описанная задача — гипотетическая, придуманная на месте.
4Аноним03-05-2009 09:44
Хорошая идея.
Только мне название custom_page_404 не очень нравится, я бы оставил только custom_page.
5Attlant07-05-2009 11:11
Очень бы хотелось типограф в новых версиях :P
6aleks_lekiaСайт14-05-2009 11:05
Максим, у меня 2 вопроса-пожелания к следующей версии:
1. я использую ушку для размещения иконки RSS подписки. Если я делаю заголовок к ней достаточно длинным, то выглядит он ужасно: образуются огромные пробелы и слова переносятся на другую строку в произвольном порядке. Можно ли как-то вставлять в эту надпись знаки переноса (если слово не помещается целиком) и управлять выключкой. Посмотреть можно здесь: http://kabee.net.ru/
2. можно ли как-нибудь упростить форму комментария, чтобы комментатор мог сразу вбивать адрес своего сайта, а код подтверждения реализовывался через плагин (как это сделано с капчей)? Кстати, я провел тест: попробовал прокомментировать и мне код почему-то не выслался. Почему?
7CuprumСайт08-06-2009 08:34
Иногда необходимо поправить и 404-ую страницу (вывести другое сообщение об ошибке, обернуть дополнительным div-ом - требование дизайна)поэтому предлагаю включать в type_foreach полный список типовых файлов аналогичных дефолтному.
8Максим08-06-2009 09:08
Принято.
9CuprumСайт26-06-2009 15:18
Вообщем, пытался я сделать шаблон на type_foreach - с тз. косметических изменений в оформлении - да, удобнее и проще. Но когда необходимо копнуть поглубже, например, банально изменить фразу "Оставить комментарий" на "Прокомментируйте" или случай с чередованием фона комментариев (описывал на форуме, правда, тема канула в лету) тут без обычных /type/ не обойтись.
10Аноним17-09-2009 07:21
Посмотрим.