За время с последней публикации статьи из цикла «MaxSite CMS для верстальщиков» накопилось несколько новых идей по вёрстке шаблонов. В частности я бы хотел ещё раз вернуться к структуре типичного шаблона MaxSite CMS. Я об этом подробно остановился во второй статье из которой известно, что сам html-шаблон состоит из двух файлов: main-start.php и main-end.php. Данные файлы подключаются type-файлом автоматически до и после непосредственного вывода type-данных.
Таким образом предполагается, что main-start.php и main-end.php являются обязательными файлами шаблона MaxSite CMS и верстальщику необходимо разделять исходный html-шаблон на две части.
Но можно ли ещё упростить работу верстальщика: исключить деление на два файла, а использовать единый файл html-шаблона? Ответ - да, можно.
Для решения этой задачи необходимо вспомнить, что подключение дизайна (html-шаблона) как такового происходит в type-файле:
- получаются type-данные
- подключается main-start.php
- выводятся type-данные
- подключается main-end.php
То есть type-данные выводятся между двумя файлами и именно поэтому мы используем разделение html-шаблона. Однако данный алгортм подключения файлов позволяет использовать main-start.php и main-end.php не для вывода html-шаблона, а для буферизации вывода type-данных в переменную, которую после можно вывести в произвольном месте.
Чтобы было понятно приведу исходные коды.
Файл main-start.php:
ob_start(); // включаем буферизацию вывода
Файл main-end.php:
global $MAIN_OUT; // глобальная переменная $MAIN_OUT = ob_get_contents(); // получаем в $MAIN_OUT весь буфер ob_end_clean(); // очищаем буфер require('main.php'); // подключаем html-шаблон
Я специально прокомментировал каждую строчку, чтобы было понятно. В целом же алгоритм очень прост: включаем буферизацию вывода, type-данные из буфера сохраняем в переменную $MAIN_OUT и после подключаем html-шаблон - файл main.php.
Таким образом верстка шаблона несколько упрощается, поскольку полностью переносится в один файл. Для примера рассмотрим произвольный main.php, но перед этим я хочу напомнить шестую статью, в которой я рассказываю про Многократно используемые компонеты, представляющие из себя php-файлы с типовыми готовыми решениями, например код меню, форма поиска, шапка и т.п. Особо хочу отметить, что данный подход пригодится не только для шаблонописателя MaxSite CMS, но и любой другой системы. Это здорово облегчает трудозатраты по верстке и я смело советую его использовать.
Рассмотрим небольшой пример. Файл main.php одного из моих шаблонов:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); require(getinfo('template_dir') . 'header.php'); ?> <div id="all"> <div id="ushka-top"><?php if (function_exists('ushka')) echo ushka("top"); ?></div><!-- /div id="ushka-top" --> <div id="header"> <div class="b1"><?php if (file_exists(getinfo('template_dir') . 'component/headers.php')) require(getinfo('template_dir') . 'component/headers.php'); ?></div><!-- /div class="b1" --> <div class="b2"><?php if (file_exists(getinfo('template_dir') . 'component/randomtext.php')) require(getinfo('template_dir') . 'component/randomtext.php'); ?></div><!-- /div class="b2" --> <div id="header-menu"><?php if (file_exists(getinfo('template_dir') . 'component/main-menu.php')) require(getinfo('template_dir') . 'component/main-menu.php'); ?></div><!-- /div id="header-menu" --> </div><!-- /div id="header" --> <div id="main"> <div id="content"><?php global $MAIN_OUT; echo $MAIN_OUT; ?></div><!-- /div id="content" --> <div id="sidebar1"><?php mso_show_sidebar('1', NR . '<div class="widget widget_[NUMW] widget_[SB]_[NUMW] [FN] [FN]_[NUMF]"><div class="w0"><div class="w1">', '</div><div class="w2"></div></div></div>' . NR); ?></div><!-- /div id="sidebar1" --> </div><!-- /div id="main" --> <div id="footer"><?php if (file_exists(getinfo('template_dir') . 'footer.php')) require(getinfo('template_dir') . 'footer.php'); ?></div><!-- /div id="footer" --> </div><!-- /div id="all" --> <?php if (function_exists('ushka')) echo ushka('google_analytics'); ?> </body></html>
В данном случае мы видим достаточно простую html-структуру с легкочитаемым кодом. Отмечу лишь несколько моментов.
1. При вёрстке сайтов я всегда вначале делаю модульную сетку (1, 2, 3). Основа сетки - это тэги с id-атрибутом.
2. Перед началом верстки мне нет надобности задумываться о частностях, потому что повторяющийся код я выношу в файлы компонент. На этапе проектирования я просто комментирую php-строки и получаю незагромождённый html-код. В данном примере подключение файлов выполняется так:
if (file_exists(getinfo('template_dir') . 'component/headers.php')) require(getinfo('template_dir') . 'component/headers.php');
Поскольку шапка в разных шаблонах может быть разной (например: фоновая картинка, название, описание текстом; фон, лого ссылкой, название, описание; картинкой-ссылкой и т.д.), то у меня есть несколько заготовок из которых я просто выбираю необходимую. Очевидно, что поменять имя файла несравненно проще, чем менять html-код в основном шаблоне.
3. Некоторые функции я прописываю прямо в шаблоне. В данном примере это ушки и сайдбар. То есть если компонента состоит из одной функции, то нет смысла делать из неё отдельный файл.
4. Главная «фишка» - вывод type-данных осуществляется так:
<?php global $MAIN_OUT; echo $MAIN_OUT; ?>
Объявлять $MAIN_OUT глобальной имеет смысл, если она используется ещё где-то в других функциях. Если этого нет (как в этом примере), то global можно удалить.
Думаю, что при таком подходе вёрстка шаблонов под MaxSite CMS становится ещё проще и удобней. Для себя я сразу ставил задачу разделять в MaxSite CMS труд программиста, верстальщика и дизайнера и на текущий момент можно смело заявлять, что мы движемся в верном направлении. :-)
ps Вопрос к моим читателям. Можно попробовать сделать несколько статей с чисто практическим уклоном, где подробно рассказать о вёрстке шаблона с нуля (с картинками и описаниями). Есть интерес?
Комментариев: 10 RSS
1Vladimir28-02-2011 06:20
Интерес есть. Сделайте, пжалста.
2Аноним28-02-2011 10:25
Очень интересует
3dark10428-02-2011 18:00
Конечно.
4Аноним28-02-2011 22:48
То, что выходит из-под моих пытливых ручек, имеет несколько отличный от классического для MaxSite вид. Однако, не прочитав предварительно (кое-что не по одному разу) цикл статей для чайников и многие другие, я бы не понял, как это все работает. Получать [собственный] стабильно положительный результат можно только поняв структуру шаблона, принцип его построения и взаимодействия компонентов между собой и с системой.
Так что адназначна! Новые статьи необходимы.
За $MAIN_OUT и вообще за детали разработческой кухни спасибо!
5Андрей01-03-2011 18:33
Конечно, интересно.
6Аноним04-03-2011 00:38
Еще какой!
7Аноним04-03-2011 11:09
Очень, очень интересно!
8Аноним24-03-2011 05:25
Уверен будет интересно
9Максим30-03-2011 23:42
Присоединяюсь! Интересно безумно :exclaim::exclaim::exclaim:
10Jimmy Jonezz10-12-2011 15:41
Было бы удобней если были скринкасты уроков. Можно с озвучкой