Современная, быстрая и удобная система управления сайтом

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

Архив записейКомментарии: 10Просмотров: 46251

В будущей 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 полный список типовых файлов аналогичных дефолтному.

9CuprumСайт26-06-2009 15:18

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

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

Комментарий будет опубликован после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

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