Современная, быстрая и удобная система управления сайтом

7. Типы страниц. Делаем свой Twitter

Архив записейКомментарии: 0Просмотров: 24846

В 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 имееет ограничения.