В прошлой лекции мы пропустили рассмотрение файлов типов данных, в которых непосредственно выводятся тексты. Перед тем, как вплотную заняться разбором файлов вывода, нам следует понять что такое «тип данных». Сегодня мы поговорим именно об этом.
MaxSite CMS определяет тип данных по адресу (URL). Обычно система использует такую схему URL: http://site.com/тип/параметр1/параметр2/параметр3. Количество параметров может быть сколько угодно (если точнее, то в url-роутере указано до 8-ми параметров).
Сам по себе URL состоит из сегментов. Только для удобства отсчет сегментов ведется с первого, относительно сайта и начинается с единицы. В нашем примере сегменты будут какими:
- Сегмент 1 = тип
- Сегмент 2 = параметр1
- Сегмент 3 = параметр2
- Сегмент 4 = параметр3
Данная схема используется в CodeIgniter, поэтому я её взял за основу.
Теперь вы видите, что тип желательно явно указывать в адресе, поскольку это полностью исключает неопределенность. Однако, бывают ситуации, когда указаный тип не был определен. В таких случаях, система дополнительно выполняет запрос к базе данных и проверяет наличие первого сегмента в записях (короткая ссылка). Если таковая есть, то ставится соответствующий тип (page или category). Дополнительно проверяется номер записи. Такая схема позволяет создавать синонимы адресов.
Если же тип так и не определен, то он становится «page_404», то есть «страница не найдена».
Однако тип «page_404» совершенно не означает, что ничего дальше сделать нельзя. Напротив. В данном случае просто возникает ситуация, когда не найден предопределенный тип. Дальше вы просто анализируете сегменты и передаете управление на нужный файл.
В одном из сайтов на MaxSite CMS мне потребовалось сделать свой тип для вывода объявлений "ob". Всё, что нужно предусмотреть для таких случаев, это анализ сегмента:
if (mso_segment(1) == 'ob') require('ob.php');
Как видите, мы просто проверяем нужный нам сегмент (mso_segment).
В любом месте шаблона или плагина вы можете получать сегменты текущего URL и использовать их как параметры для различных действий. Такая схема адресации позволяет делать не только «линейные ссылки», как в обычных страницах, но и «вложенные», например так: http://site.com/mycategory/subcategory/namepage.
Правда здесь один немаловажный момент: обработчик и получение данных по таким адресам вам нужно делать самостоятельно.
Таким образом в MaxSite CMS у вас есть возможность создавать и использовать URL для самых разных задач.
Приведу список предопределенных типов данных (они описаны в application/controllers/maxsite.php).
- home - главная страница сайта
- archive - вывод записей указанной даты
- author - страница автора
- category - рубрики
- link - ссылки
- page - обычная страница
- users - список пользователей
- search - поиск
- tag - метки
- comments - лента комментариев
- loginform - форма логина: она может быть своя для шаблона
- feed - rss (см. ниже)
- install - инсталяция
- admin - админ-панель
- url - редирект на указанный адрес
- xmlrpc - зарезервировано на будущее
- xmlrpc_server - зарезервировано на будущее
- login - вход админа
- logout - выход админа
- page_404 - не найден ни один из этих типов
Обратите внимание на тип «feed». Если быть точнее, это даже не тип, а простая отметка к типу, которая сигнализирует, что нужно выводить не страницу сайта, а отдавать RSS-ленту. Всё из-за того, что rss-лента это довольно строгий XML и делать его нужно совсем по другим правилам, нежели обычную страницу. Поэтому в index.php мы вначале должны проверить «а не feed-ли?» и если feed, то подключить дргуие файлы. В шаблоне default посмотрите пример такой реализации.
Система определяет флаг «feed» путем простого анализа последнего сегмента.
Как добавить свой тип? Один способ с анализом сегмента мы уже рассмотрели. Он хорош тем, что завязан на сам шаблон и требует только одного дополнительного условия. Но иногда нужно ввести такой тип, который не будет использоваться в шаблоне. Например тип «url» бессмысленно определять в шаблоне, потому что до шаблона он даже не доходит. Всё из-за того, что «url» - это редирект по указанному адресу, например http://site.com/url/maxsite.org. Такие типы выполняются во вьювере (application/views). Главное отличие, как я уже сказал - это не требуется их выполнение в шаблоне.
Если говорить строго, то любой шаблон это тот же вьювер (index.php), который просто подключает текущий шаблон.
То есть, если вам нужно ввести свой тип, то можно сделать для него свой вьювер. Для того, чтобы подключить его к основному контролеру достаточно всего лишь создать файл с именем типа рядом с контролером. В качестве примера я сделал файл contact.php с единственной строчкой
$this->_view_i('contact');
Она означает, что нужно определить тип «contact» и передать управление по-умолчанию, то есть в шаблон.
Если же нужно передать управление в свой вьювер, то указываем его во втором параметре:
$this->_view_i('contact', 'mycontact');
При этом в «application/views» должен быть файл mycontact.php, который, собственно и будет выполняться.
Еще один момент. Определение типа данных никак не связано с получением этих данных. То есть какой бы ни был у вас тип, всю работу по получению и отображению данных, необходимо выполнить отдельно. Друго дело, что тип данных позволяет использовать универсальные функции, вроде mso_get_pages, которая делает выборки данных в зависимости от типа. То есть функция одна, но в разных случаях возвращает разные данные.
Вот об этом мы поговорим в следующей лекции.
Обсудить данную лекцию можно в google-группе MaxSite.