В MaxSite CMS типы страниц используются для дополнительной группировки различных записей. Обратите внимание, что типы страниц и типы данных это разные вещи. Тип данных определяется на основе URL. Тип страниц же задается только для записей.
Давайте разберем типы страниц на примере WordPress. :) Как известно в WordPress можно создавать записи двух типов: записи, которые выводятся в ленте на главной (собственно сам блог) и постоянные страницы, которые не выводятся в лентах. Идея состояла в том, что постоянные страницы должны выводиться в редких частных случаях. Поскольку WordPress блоговый «движок», то такие страницы позволяют выводить какую-то статичную информацию, например: «О сайте», «Контакты» и т.п.
В отличие от постоянных страниц, обычным записям можно присваивать рубрики, метки и т.д. Остается загадкой, почему разработчики WordPress ввели все эти искусственные ограничения, поскольку технически никакой разницы между типами нет. К тому же поддержка постоянных страниц в WordPress сделана очень плохо. Впрочем, об этом я неоднократно писал на своем блоге.
В MaxSite CMS я, естественно, учел ограничения WordPress и сразу сделал так, чтобы все записи были равнозначны. Стандартно в системе есть два типа страниц: blog и static. Думаю, вы поняли, что blog - это аналог записей, а static - постоянных страниц в WordPress'е.
Типы страницы позволяют группировать записи. В какой-то мере это «плоский» аналог рубрик. Возьмем к примеру главную страницу. Мы знаем, что на ней выводятся только blog-записи (тип по-умолчанию).
В параметрах функции mso_get_pages() можно явно указать тип страниц, например static:
'type' => 'static'
В этом случае функция вернет записи только типа static. Если же указать:
'type' => false
то функция вернет записи всех типов.
Кстати, обратите внимание, что в отличие от WordPress, в MaxSite CMS слово «запись» имеет отношение к любой странице, поскольку понятия «постоянная страница» просто не существует.
То есть в принципе тип страниц можно использовать для тех записей, которые не требуют сложного деления на рубрики. Ну например на сайте вы захотите сделать что-то вроде twitter'а: вывод коротких заметок, реплик. Пускать такие записи на главную страницe вы не хотите. Можно, конечно сделать в виде рубрики, но тогда придется следить за ней. Использование типа страниц самый оптимальный вариант.
Для начала сделаем новый тип страниц (Основные -> Типы страниц), например «twitter».
Обратите внимание, что пока удалить созданные типы страниц нельзя. По идеологическим соображениям. :) Впрочем, в будущих версиях я думаю, решу этот вопрос.
Выводить наш twitter проще всего в сайдбаре. Соответственно располагаем виджет «last_pages_widget» (Последние записи). Если у вас уже есть такой виджет, то добавьте через пробел номер. После сохранения, переключаемся на виджеты и в настройках указываем заголовок, например «Мой twitter», тип страниц «twitter», а также формат вывода «%DATE%<br/>%TITLE%<br/>%TEXT%».
После этого создадим новую страницу и укажем её тип «twitter». Рубрики и все остальное можно не указывать.
Вот, собственно и всё. Наш twitter готов! :)
У вас как и прежде осталась возможность указывать метки, рубрики и т.п, то есть все теже возможности как и для любых страниц. Например на этом сайте для Центра помощи, помимо типа страниц «help» я указываю и рубрику. Это позволяет создать дополнительную навигацию.
Теперь давайте рассмотрим более сложный вариант: вывод нашего twitter на отдельной странице по адресу http://сайт/twitter
Как вы помните по предыдущим лекциям, в этом варианте у нас должен быть тип данных «twitter» (первый сегмент). Если на сайте не используется короткая ссылка (slug) «twitter», то мы можем в шаблоне анализировать этот сегмент и, соответственно, подключать его файл.
... if (mso_segment(1)=='twitter') require('type/twitter.php'); ...
Более надежный вариант - это создание файла типа в контролере. В этом варианте будет явно определен тип и его можно получить с помощью is_type(). Давайте разберем именно его.
Вначале скопируем файл controllers/contact.php как twitter.php в том же каталоге. Откроем его и изменим единственную строчку, чтобы получилось так:
$this->_view_i('twitter');
После этого в шаблонном index.php добавим условие, по которому будем подключать файл для вывода twitter-записей.
... elseif ( is_type('twitter') ) require('type/twitter.php'); ...
Обратите внимание, что мы явно указываем путь к каталогу «type», поскольку в дефолтном шаблоне его нет. Соответственно нужно его создать в вашем шаблоне. В него поместим файл twitter.php вот такого содержания:
<?php mso_head_meta('title', 'Мой Twitter'); // meta title страницы # начальная часть шаблона require(getinfo('template_dir') . 'main-start.php'); # параметры для получения страниц $par = array( 'type' => 'twitter', 'custom_type'=>'home', 'limit' => 10); $pages = mso_get_pages($par, $pagination); // получили страницы if ($pages) { echo '<div>'; foreach ($pages as $page) // выводим в цикле { extract($page); mso_page_title($page_slug, $page_title, '<h1>', '</h1>', false); mso_page_date($page_date_publish, array('format' => 'd/m/Y H:i:s'), '<p><em>', '</em></p>'); if ($page_content) { echo '<div class="page_content">'; mso_page_content($page_content); echo '</div>'; } } echo '</div>'; } # конечная часть шаблона require(getinfo('template_dir') . 'main-end.php'); ?>
Как видите код очень простой и по комментариям всё понятно. Остановлюсь только на двух моментах.
В параметрах для получения страниц мы указываем
'type' => 'twitter' и 'custom_type'=>'home'
Первый указывает на тип страниц, а второй указывает на тип данных. В нашем случае мы выводим записи как на главной, то есть «home». Если бы нам нужно вывести одиночную запись, то «custom_type» следует установить «page».
На самом деле у mso_get_pages() очень много параметров, но для нашего случая достаточно только этих. Технически, параметр «custom_type» указывает на то, как будет формироваться SQL-запрос.
Второй момент - это false в mso_page_title(). Этот параметр указывает нужно ли формировать ссылку на заголовке записи. В нашем случае это не требуется, поэтому и стоит false. Если же вам нужен переход на страницу записи, то укажите true.
В целом мы можем на этом остановиться, но мне бы хотелось еще немного попрограммировать ;) и я предлагаю немного модифицировать вывод с тем, чтобы было как на настоящем Twitter'е. В частности в нем только первая запись выводится крупно, а остальные мелко.
Чтобы этого добиться мы просто введем счетчик, который будем увеличивать на единицу. Вот измененный кусок кода.
... if ($pages) { echo '<div>'; $count = 1; // счетчик foreach ($pages as $page) // выводим в цикле { extract($page); if ($count == 1) { mso_page_title($page_slug, $page_title, '<h1>', '</h1>', false); mso_page_date($page_date_publish, array('format' => 'd/m/Y H:i:s'), '<p><em>', '</em></p>'); if ($page_content) { echo '<div class="page_content">'; mso_page_content($page_content); echo '</div>'; } } else { echo '<div class="page_content">'; mso_page_title($page_slug, $page_title, '', '', false); mso_page_date($page_date_publish, array('format' => 'd/m/Y H:i:s'), ' - <em>', '</em>'); if ($page_content) mso_page_content($page_content); echo '</div>'; } $count++; // увеличили счетчик на 1 } echo '</div>'; } ...
Отличие только в том, что мы по другому формируем вывод для первой страницы.
При желании вы можете добавить вывод строки пагинации, но мне кажется, что это уже лишнее.
Еще такой момент. Поскольку в настоящем твитере используется только одно поле для текста, а у нас два, то на мой взгляд лучше всё-таки писать текст как текст, а заголовок как заголовок. В крайнем случае, можно убрать mso_page_title(). Просто когда вы будете делать длинные тексты в заголовках, то нужно будет следить и за короткой ссылкой, иначе она может оказаться очень длинной и это может привести к ошибкам: длина url имееет ограничения.