Главное нововведение в MaxSite CMS 0.80 - это новый способ построения шаблона. Традиционно у нас использовалась схема, которую я взял из WordPress - default-шаблон содержал файлы, которые могли использоваться другими шаблонами. Схема довольно простая - если в шаблоне нет какого-то типового файла, он автоматом берётся из default.
Сама по себе схема неплохая, но имеет ряд ограничений, одно из которых довольно жесткая завязка на default-шаблон. Приходилось идти на ряд ухищрений, чтобы сохранить совместимость и при этом добавить новую функциональность. Всё это приводило к неявным вещам. Например в default-шаблоне для опций используется несколько ini-файлов.
Другая проблема - дублирование файлов и php-кода, который кочуют от шаблона в шаблон в неизменном виде. Теперь, если мне захочется ввести новую функционнальность, придется пожертвовать совместимостью, а это не совсем верно.
В итоге я решил сделать еще один вариант построения шаблона, на основе т.н. shared-каталога. Этот каталог является общим для всех шаблонов. Если раньше шаблон завязывался на default-шаблон, то теперь он «питается» из shared.
Попутно я переделал структуру каталогов так, чтобы обеспечить как можно большую гибкость и модульность. Например type-файлы теперь располагаются в своём одноименном подкаталоге. То есть теперь существует «главный» файл типа данных, а остальные, если есть, его модули. Раньше нужно было вводить дополнительные условия, чтобы исключить вспомогательные type-файлы (например page-comments.php). По этой причине главный файл шаблона index.php упростился буквально до нескольких строчек. Сравните его с default, чтобы увидеть разницу.
Новый шаблон D2 работает на основе shared-каталога и призван продемонстрировать новые возможности. Если вы делали шаблоны для MaxSite CMS, то без труда разберётесь с D2 и заметите, что в шаблоне теперь меньше файлов и структура каталогов более логичная.
Далее я хочу остановиться на некоторых новых возможностях. На текущий момент они доступны в MaxSite CMS 0.804.
Изображение записи
Для любой записи можно указать адрес изображения в дополнительных полях (метаполя).
После указания картинки, из файла будет автоматически сформирована миниатюра с размерами, указанными в настройках шаблона.
Самое главное здесь то, что миниатюра формируется автоматически с учетом исходных и конечных размеров: выполняется обрезка, кроп и т.п. Для этого используется класс Thumb, о котором я уже рассказывал.
Новые компоненты
Сейчас доступно 19 компонентов, которые можно использовать в шапке или подвале сайта. Некоторые компоненты выполняют роль «подкомпонентов», то есть используются в других компонентах. Например menu используется в menu-icons, menu-login, menu-search и других. То есть это различные комбинации меню с другими блоками.
Структура компонентов изменилась. Теперь каждый компонент находится в своём каталоге и больше не будет путаницы с файлами. Существуют предопределенные файлы:
- style.css - стили компонента, которые автоматически подключатся в HEAD сайта.
- options.ini и options.php - файлы опций, также подключаются автоматически.
Если компонент начинается на «-» или «_», то его подключение игнорируется. Как правило это использутся для подкомпонентов.
«Main-шаблоны» вывода
Это новая возможность, которой раньше не было и приходилось программировать отдельно. Как известно main.php в шаблоне выполняет роль модульной сетки. Теперь main.php можно указать опционно для любой записи. Например довольно частая задача - вывести запись без сайдбара. Чтобы её решить старым способом, приходилось указывать разные условия в sidebars.php. В D2 для этого существует мета-опция «Шаблон записи».
Файл вывода при таком выборе: main/no-sidebar/main.php. В D2 этот файл имеет ту же самую структуру, что и главный main.php, только удалён вывод сайдбара и прописан css-класс body.no-sidebar.
Помимо шаблона записи, можно указать шаблон вывода для произвольного type-файла. Для этого соответствующий main.php следует расположить в main/type/ТИП ДАННЫХ/main.php. Например, если требуется выводить главную страницу без сайдабра, то скопируем main/no-sidebar/main.php в main/type/home/main.php.
Опции шаблона
В default с опциями сложность в том, что есть некие общие опции, которые могут использоваться другими шаблонами, а есть опции «типовые», которые как правило могут использоваться шаблоном, и есть строго свои опции. Эта путаница в D2 решена очень просто: все общие опции вынесены в shared-каталог, а опции шаблона в отдельных каталог options. В этом каталоге располагаются ini-файлы, которые подключаются «скопом». Таким образом удалось разделить некогда единый ini-файл на отдельные секционные файлы.
В файле options.php, который выполняет роль диспетчера, можно указать режим подключения дефолтных (из shared) опций - параметр get_options_default. Если они не нужны, то значение false.
Функциональность
Часть функций, которые раньше я делал в default/functions-template.php, теперь перенесена в shared-каталог или включена в ядро MaxSite CMS. Для шаблона автоматически подключается шаблонизатор Page_out, вывод колонок - Columns, а также формирование миниатюр - Thumb.
Шаблонизатор Page_out, о котором я уже раказывал (раз, два), теперь используется достаточно активно. Например в компонентах, а также type-файлах.
LESS/CSS
«Любимая» тема. :-) Если кратко, то MaxSite CMS имеет очень хорошую поддержку LESS, причём на таком уровне, о котором другие CMS могут только мечтать. Помимо компилятора mso_lessc(), я написал плагин less_compiling, в котором можно выполнить компиляцию произвольного less-файла, а не только в каталоге шаблона. Если вы работаете с LESS, то обратите внимание на этот плагин, с ним очень удобно работать.
В самом компиляторе mso_lessc() добавил некоторые новые «фишки». Например автоматическое подключение less-файлов компонентов, блоков, плагинов и т.п. Описание есть в var_style.less шаблона D2.
Также я сделал возможность, которая присутствует только в LessPHP - создание своих less-функций. Например, мы хотим сделать функцию double и использовать так:
border: double(4px) solid red;
Создаём файл var_style.less.php, который располагается рядом с компилируемым var_style.less.
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); function lessphp_double($arg) { list($type, $value, $unit) = $arg; return array($type, $value*2, $unit); } $compiler->registerFunction("double", "lessphp_double");
MaxSite CMS автоматически подключит этот файл, где less-компилятор зарегистрирует новую функцию double.
Теперь касательно каталога css-less. Основная задача - обеспечение модульности стилей при том, чтобы было понятно где какой файл находится. Очевидно, что стили компонентов расположены в components, модульная сетка - в layouts и т.п.
Типографика, UI-элементы и css-фреймворк
CSS-фреймворк style-all-mini.css теперь находится в shared-каталоге и доступен в виде исходных less-файлов. Сами стили были поправлены, лишнее выкинуто, что-то улучшено. Типографика стала лучше и симпатичней. Технически, вместо style-all-mini.css можно использовать его составные less-файлы, если вдруг какие-то стили не нравятся.
Некоторые стили были вынесены в отдельные less-файлы и чтобы их использовать следует явно подключить в своём шаблоне. Сейчас это кнопки, табы, сообщения, метки и dropdown-меню. Файл helpers.less содержит хелперы-миксы и может подключаться прямо из shared-каталога.
В css-less находятся два каталога frameworks и elements, которые предполагают использование сторонних стилей под определенные элементы. Предполагается, что разместив в них свои миксы, можно будет автоматом получать разные дизайны, которые сейчас публикуются как UI-Kit. Пока это задел на будущее, будем надеятся, что идея будет реализована.
Как теперь делать шаблоны
На текущий момент D2 выполняет роль каркаса для новых шаблонов. Таким образом достаточно его скопировать и он уже полностью готов к использованию. Шаблон Default оставлен только в целях совместимости со старыми шаблонами, поэтому на его основе уже нет смысла делать новые. Каркас «_create_a_new_template» удалён, поскольку больше не имеет смысла.
Комментариев: 5 RSS
1Аноним23-12-2012 18:23
Спасибо за обзор! Интересно было почитать, буду изучать новое построения шаблонов! :)
2Анатолий27-12-2012 22:46
А как правильно обновляться? У меня 801...
3Аноним28-12-2012 09:05
Можно просто файлы поверх. Единственный момент: в d2/options/ я убрал ini-файлы. Если они есть, то удалите d2 и загрузите по новой.
4Аноним07-01-2013 10:07
Слушай Максим. Заметил у себя на сайте в каждой статье, сразу в начале идет вот такой код:
Откуда он берется и как его убрать?
5Сергей09-02-2013 18:56
Такой же код заметил у себя. И плюсом после заголовка H1 выводятся еще раз блоки, как в начале странице. Как это можно поправить?
Шаблон default, 0,81 maxsite. Что самое интересное, на локальном сервере - код страниц нормальный.