Наш шаблон подразумевает подключение отдельного файла типа. Например для главной это будет home.php, для обычной страницы - page.php, для рубрик - category.php. Теоретически, как я уже говорил, можно все сделать в одном файле. Но, поскольку сам html-вывод может быть разным, то нам придется вводить различные условия. Вот чтобы этого не делать, мы и используем раздельные файлы.
Для начала рассмотрим общий алгоритм работы.
- Определив тип в index.php подключаем файл типа.
- В файле типа мы должны вначале получить данные для вывода.
- Подключить main-start.php, который содержит html первой части дизайна.
- Вывести полученные данные.
- Подключаем main-end.php, который выводит конечную часть html.
Почему нужно получать данные (п.2) перед подключением main-start.php? В шаблоне в секции HEAD у нас содержатся данные, которые зависят от выводимых данных. Например титул страницы мы получаем на основе заголовка. Поэтому, пока мы не получим данные, у нас нет возможности заполнить первую часть шаблона.
Для получения текста для вывода используется функция mso_get_pages. Первый её параметр - это массив опции, второй - переменная для пагинации (листания страниц).
Функция mso_get_pages универсальная, то есть она получает страницы, учитывая тип данных. Возможна ситуация, когда возможностей этой функции будет недостаточно. В этом случае вы можете сами составить свой SQL-запрос к базе и получить нужные данные. Впрочем о своих SQL-запросах мы еще поговорим, а пока будем считать, что возможностей mso_get_pages нам хватит. :-)
Давайте рассмотрим параметры mso_get_pages. Через «=» указано значение по-умолчанию.
- limit = 7 - количество записей для вывода
- cut = 'Далее' - ссылка на полную версию записи, если использовался [ cut ]
- cat_order = 'category_name' - поле сортировки рубрик записей
- cat_order_asc = 'asc' - порядок сортировки рубрик
- pagination = true - разрешить пагинацию
- content = true - получать полный текст; false - нет
- type = 'blog' - если false - то получать все типы страниц (не путать с типами данных!), иначе только указанного типа, например blog или static
- page_id = 0 - если 0, значит не учитывать id записи; учитывается только для главной; если указан номер, то тип страницы сбрасывается на false
- cat_id = 0 - если 0, значит все рубрики, иначе только указанные номера; используется только для главной
Эти параметры следует оформлять в виде единого массива, например так:
$par = array( 'cut'=>false, 'cat_order'=>'category_name', 'cat_order_asc'=>'asc', 'type'=>false ); $pages = mso_get_pages($par, $pagination);
После этого кода в переменной $pages содержится массив из полученных записей. Для его вывода мы используем самый обычный PHP-цикл foreach вот примерно так:
if ($pages) // есть страницы { foreach ($pages as $page) : // выводим в цикле extract($page); // экспортируем элементы массива в переменные // непосредственный вывод endforeach; } else { echo '<h1>404. Ничего не найдено...</h1>'; echo '<p>Извините, ничего не найдено</p>'; }Комментарии объясняют этот код.
Технический момент. Переменная $page - глобальная. Сделано это для того, чтобы к ней имелся доступ из плагинов, виджетов и других частей кода. Иногда встречаются задачи, которые требуют учитывать текущую страницу. Например когда выполняется хук на текущую страницу и при этом нужно использовать другие элементы этой же страницы. (Пример: см. плагин «perelinks».)
Для того, чтобы заполнить титул страницы, а также ключевые слова и описание, мы можем использовать специальную функцию mso_head_meta. Первым параметром в ней указывается что именно мы хотим получить. Доступны только три значения:
- 'title' для title
- 'description' для meta description
- 'keywords' для meta keywords
Вторым параметром нужно передать полученные страницы ($pages). Тут на самом деле нет особой хитрости, просто вместо того, чтобы предварительно обрабатывать полученные данные, мы поручим сделать это самой функции mso_head_meta.
Для третьего параметра можно указать формат вывода. Доступны такие поля:
- %title% - название (титул) сайта (задается в опциях)
- %page_title% - заголовок страницы
- %category_name% - название рубрики
В качестве разделителя можно использовать символ «|». Он заменится на четвертый параметр.
Последний, пятый параметр функции, указывает как поступать с теми записями, у которых заполнено поле title в редакторе. Если параметр = true, то будет выводиться только title записи. Иначе титул записи будет комбинированным.
Вот примеры использования для page.php:
mso_head_meta('title', &$pages, '%page_title%|%title%', ' » ', true ); mso_head_meta('description', &$pages); mso_head_meta('keywords', &$pages);
Для category.php:
mso_head_meta('title', &$pages, '%category_name%|%title%', ' - '); mso_head_meta('description', &$pages, '%category_name%'); mso_head_meta('keywords', &$pages, '%category_name%');
Функция mso_head_meta позволяет явно задать титул, например так:
mso_head_meta('title', 'Мой заголовок');
А вот если указать в качестве второго параметра данные для getinfo (различные опции), то будет возвращено значение этой опции. Например так можно вывести в title:
mso_head_meta('title', 'title');
Грубо говоря, используя mso_head_meta можно комбинировать самые разные варианты для title страниц.
В цикле вывода записей мы выполняем extract($page), что помещает элементы массива в переменные. Например у нас есть такой массив:
$ar = array ( 'a'=>'первый', 'b'=>'второй', 'c'=>'третий' );
После выполнения extract($ar) у нас появятся переменные $a равная 'первый', $b равная 'второй' и $c равная 'третий'. То есть функция extract нам нужна для того, чтобы немного упростить дальнейший синтаксис и использовать переменные, вместо элементов массива.
После extract у нас будут доступны следующие переменные:
- $page_id - id страницы.
- $page_type_name - название типа страницы, например "blog"
- $page_slug - короткая ссылка
- $page_title - заголовок
- $page_date_publish - дата публикации, например 2008-06-16 22:24:00
- $page_status - статус записи: publish, draft или private
- $users_nik - ник автора
- $page_content - текст
- $page_view_count - количество просмотров
- $page_rating - рейтинг страницы
- $page_password - пароль на страницу
- $page_comment_allow - разрешение на комментирование
- $users_avatar_url - ссылка на аватар автора
- $page_count_comments - количество комментариев (не для всех типов данных)
- $page_categories - массив номеров рубрик, которые отмечены для этой записи
- $page_tags - массив меток
- $page_meta - массив мета-полей, например здесь хранятся title, descriptions и т.д.
Стоит отметить, что имена этих переменных совпадают с именами полей в таблицах базы данных.
Теперь имея всю информацию, можно непосредственно осуществить вывод. Можно воспользовать обычным echo и, поначалу именно так я и делал, но потом написал несколько функций, которые несколько упрощают вывод. При этом они учитывают разные условия. Например при выводе страницы нет смысла ставить ссылку на заголовке.
Перед рассмотрением каждой функции, отмечу несколько общих деталей. Прежде всего эти функции по-умолчанию сразу выводят данные как echo. Сделано это потому что в шаблоне все равно придется вызывать echo, поэтому принято именно такое поведение. Впрочем, у них есть параметр, который укажет отдавать результат по return.
Сформировать заголовок страницы
mso_page_title( $page_slug = '', // короткая ссылка $page_title = 'no title', // сам заголовок $do = '<h1>', // текст ДО $posle = '</h1>', // текст ПОСЛЕ $link = true, // выводить ли ссылку? $echo = true) // сразу выводить по echo #Пример использования mso_page_title($page_slug, $page_title, '<h1>', '</h1>', false);
Получить ссылки на рубрики указанной страницы
mso_page_cat_link( $cat = array(), // массив рубрик $sep = ', ', // разделитель $do = '', // текст ДО $posle = '', // текст ПОСЛЕ $echo = true) // сразу выводить по echo #Пример использования: mso_page_cat_link($page_categories, ' | ', '<span>Рубрика:</span> ', '<br />');
Получить ссылки на метки указанной страницы
mso_page_tag_link( $tags = array(), // массив меток $sep = ', ', // разделитель $do = '', // текст ДО $posle = '', // текст ПОСЛЕ $echo = true) // сразу выводить по echo #Пример использования: mso_page_tag_link($page_tags, ' | ', '<span>Метки:</span> ', '<br />');
Вывод форматированной даты
mso_page_date( $date = 0, // дата $format = 'Y-m-d H:i:s', // формат вывода (как в PHP) $do = '', // текст ДО $posle = '', // текст ПОСЛЕ $echo = true) // сразу выводить по echo #Пример использования: mso_page_date($page_date_publish, 'd/m/Y H:i:s', '<span>Дата:</span> ', '');
Получить ссылку на редактирование страницы
mso_page_edit_link( $id = 0, // id записи $title = 'Редактировать', // текст ссылки $do = '', // текст ДО $posle = '', // текст ПОСЛЕ $echo = true) // сразу выводить по echo #Пример использования: mso_page_edit_link($page_id, 'Edit page', ' -', '-');
Формирование ссылки для rss страницы (подписка на комментарии)
mso_page_feed( $page_slug = '', // короткая ссылка записи $page_title = 'Подписаться', // текст ссылки $do = '<p>', // текст ДО $posle = '</p>', // текст ПОСЛЕ $link = true, // выводить ссылкой? $echo = true) // сразу выводить по echo #Пример использования: if ($page_comment_allow) mso_page_feed($page_slug, 'комментарии по RSS', '<br /><span>Подписаться</span> на ', '', true);
Формирование ссылки «обсудить» (например для главной)
mso_page_comments_link( $page_comment_allow = true, // разрешены ли комментарии к записи $page_slug = '', // короткая ссылка записи $title = 'Обсудить', // текст ссылки $do = '', // текст ДО $posle = '', // текст ПОСЛЕ $echo = true) // сразу выводить по echo #Пример использования: mso_page_comments_link($page_comment_allow, $page_slug, 'Обсудить (' . $page_count_comments . ')', '<div class="comments-link">', '</div>');
Текст записи следует выводить вот в таком блоке:
mso_page_content($page_content);
В конце вывода у нас используется вывод пагинации:
if (function_exists('pagination_go')) echo pagination_go($pagination); // вывод навигации
Данная возможность реализуется с помощью плагина pagination, поэтому его следует включить в админ-панели. Переменная $pagination мы уже получили при выполнении mso_get_pages.
Для того, чтобы лучше разобраться с этой лекцией, вы можете посмотреть page.php, category.php и другие из дефолтного шаблона. Что касается файла home.php, то там несколько сложней разобраться, хотя используется тот же самый код и принцип, только еще реализована поддержка опций шаблона. Об этом мы поговорим в одной из ближайших лекций.
Обсудить данную лекцию можно в google-группе MaxSite.