Советы и хитрости создания шаблонов

27 февраля 2011 г. Просмотров: 2716 RSS 10
MaxSite CMS » MaxSite CMS для вебмастера

За время с последней публикации статьи из цикла «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 труд программиста, верстальщика и дизайнера и на текущий момент можно смело заявлять, что мы движемся в верном направлении. grin

ps Вопрос к моим читателям. Можно попробовать сделать несколько статей с чисто практическим уклоном, где подробно рассказать о вёрстке шаблона с нуля (с картинками и описаниями). Есть интерес?


twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru friendfeed.com google.com yandex.ru
Комментариев: 10
  1. Можно попробовать сделать несколько статей с чисто практическим уклоном, где подробно рассказать о вёрстке шаблона с нуля (с картинками и описаниями). Есть интерес?
    Интерес есть. Сделайте, пжалста.

  2. ps Вопрос к моим читателям. Можно попробовать сделать несколько статей с чисто практическим уклоном, где подробно рассказать о вёрстке шаблона с нуля (с картинками и описаниями). Есть интерес?

    Очень интересует

  3. Конечно.

  4. То, что выходит из-под моих пытливых ручек, имеет несколько отличный от классического для MaxSite вид. Однако, не прочитав предварительно (кое-что не по одному разу) цикл статей для чайников и многие другие, я бы не понял, как это все работает. Получать [собственный] стабильно положительный результат можно только поняв структуру шаблона, принцип его построения и взаимодействия компонентов между собой и с системой.

    Так что адназначна! Новые статьи необходимы.

    За $MAIN_OUT и вообще за детали разработческой кухни спасибо!

  5. 2011-03-01 в 20:33:04 | Андрей#5

    Конечно, интересно.

  6. 2011-03-04 в 02:38:45 | Аноним#6
    рассказать о вёрстке шаблона с нуля (с картинками и описаниями). Есть интерес?

    Еще какой!

  7. 2011-03-04 в 13:09:44 | Аноним#7

    Очень, очень интересно!

  8. Уверен будет интересно

  9. 2011-03-31 в 01:42:17 | Максим#9

    Присоединяюсь! Интересно безумно excaimexcaimexcaim

  10. 2011-12-10 в 17:41:40 | Jimmy Jonezz#10

    Было бы удобней если были скринкасты уроков. Можно с озвучкой

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

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

Используйте нормальные имена

Имя и сайт используются только при регистрации

Зарегистрируйтесь, чтобы получать уведомления о новых комментариях по email.

Авторизация Войти через loginza

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