В MaxSite CMS 0.852 появился новый PHP-класс Block_pages задача которого упростить создание блоков записей в шаблоне. Традиционно вывод записей блоками достаточно сложная задача и вебмастера стараются её обходить стороной. Вместо этого предлагается типовой вариант вывода записей.
Самый распространенный пример — вывод главной страницы сайта. В MaxSite CMS хоть и существуют различные варианты, но они достаточно простые и очевидные. Если потребуется что-то сложное, например вывод колонками, то необходимо программировать такой вариант индивидуально. Кроме того остается нерешенным вопрос вывода нескольких блоков записей на главной. Скажем, вверху одиночная запись, ниже две колонки по рубрике, а ещё ниже — только миниатюры в ряд.
Новый Block_pages как раз и призван упростить написание такого вывода. Он сам получает данные записей для вывода и сам же организует необходимые циклы вывода.
Проще всего будет продемонстрировать новые возможности на примере Default-шаблона. Создадим какой-то свой вариант вывода главной страницы. Для затравки выведем просто указанную запись.
Создаем файл type/home/my_home.php:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); $b = new Block_pages( array ( 'page_id' => 2, // номер записи )); $b->output( array ( 'block_start' => '<div class="home-last-page">', 'block_end' => '</div>', ));
Класс Block_pages размещен в том же файле, где и Page_out, поэтому никакие отдельные его подключения выполнять не нужно.
При инициализации класса сразу указываются параметры получения записей. В нашем случае мы указываем номер записи (2). Если бы нам нужно было вывести несколько записей, то в page_id достаточно указать номера через запятую:
... 'page_id' => '2,5,8,19,45,67', // номера записей ...
В методе output происходит непосредственный вывод записей по указанным параметрам.
Block_start и block_end выводят произвольный HTML-код в начале и конце этого блока.
Итак, Block_pages вначале получает данные, после их выводит. Соответственно каждый метод имеет свой набор опций. Получение данных фактически происходит стандартно через mso_get_pages() по типу данных home (он универсальный). Таким образом при получении данных можно задать:
- limit — количество получаемых записей (всего)
- cut — значение cut
- pagination — true/fasle — использовать ли пагинацию
- cat_id — рубрики через запятую
- page_id — номера записей через запятую
- type — тип записей (по-умолчанию blog)
А вот что касается метода output, то он имеет гораздо больше опций, которые будут только увеличиваться. Поэтому, чтобы упростить себе задачу и сохранить актуальность статьи, даю ссылку на гитхаб.
Сейчас рассмотрим ещё несколько практических примеров. Теперь, пусть нам нужно вывести ниже верхней записи 5 последних записей сайта. После вышеприведенного блока сделаем отбивку в виде:
echo '<hr>';
Просто что-бы визуально разделять блоки.
Последние 5 записей сайта:
$b = new Block_pages( array ( 'limit' => 5, 'pagination' => true, )); $b->output( array ( 'block_start' => '<div class="home-5-last-page">', 'block_end' => '</div>', ));
Я включил пагинацию и указал лимит в 5 записей на страницу. Если отключить пагинацию, то будут выведены только эти записи.
Теперь выведем заданные рубрики (1, 2 и 3 для примера) в две колонки:
$b = new Block_pages( array ( 'limit' => 6, 'cat_id' => '1,2,3', )); $b->output( array ( 'block_start' => '<div class="home-page">', 'block_end' => '</div>', 'columns' => 2, ));
В cat_id я указал нужные рубрики, а в columns (метода output) указываю количество колонок. Для формирования колонок используются css-хелперы MaxSite CMS, которые уже подключены к Default-шаблону. Если требуется другое количество колонок, например 3, то делаем так:
$b->output( array ( 'block_start' => '<div class="home-page">', 'block_end' => '</div>', 'columns' => 3, 'columns_class_cell' => 'col w1-3', 'content_words' => 20, ));
При этом я ограничил вывод контента 20-ю словами (параметр content_words). Аналогично можно сделать органичение на количество символов — content_chars.
Миниатюры
Для работы с миниатюрами предназначены особые параметры. Можно задать ширину, высоту, css-класс изображений. При этом есть возможность использовать заглушку (placehold).
$b->output( array ( 'block_start' => '<div class="home-page">', 'block_end' => '</div>', 'columns' => 3, 'columns_class_cell' => 'col w1-3', 'content_words' => 20, 'thumb_width' => 100, 'thumb_height' => 100, 'thumb_class' => 'left', 'placehold' => true, ));
Если установить placehold равным true, то для записей, где не указано изображение, будет выводиться заглушка с размерами миниатюры. По-умолчанию заглушка берется с сайта placehold.it, но при желании можно задать и явный путь к каталогу шаблона:
'placehold_path' => getinfo('template_url') . 'images/placehold/'
Одна рубрика — одна колонка
Рассмотрим теперь более сложный случай — колоночный вывод рубрик. Для простоты будем использовать две колонки. Алгоритм такого вывода усложняется тем, что нужно организовать в каждой колонке свой цикл вывода записей. То есть каждая колонка выводится как отдельный вывод Block_pages.
В MaxSite CMS уже есть css-хелперы для колоночного вывода, поэтому будем делать сразу на них.
echo '<div class="onerow">'; ... получаем и выводим первую колонку как div.col.w1-2 ... ... получаем и выводим вторую колонку как div.col.w1-2 ... echo '</div>';
Вот полный код:
echo '<div class="onerow">'; // первая колонка $b = new Block_pages( array ( 'limit' => 3, 'cat_id' => 1, // номер рубрики )); $b->output( array ( 'block_start' => '<div class="col w1-2"><h2>Рубрика 1</h2>', 'block_end' => '</div>', 'content_words' => 20, 'thumb_width' => 100, 'thumb_height' => 100, 'thumb_class' => 'left', )); // вторая колонка $b = new Block_pages( array ( 'limit' => 3, 'cat_id' => 3, // номер рубрики )); $b->output( array ( 'block_start' => '<div class="col w1-2"><h2>Рубрика 2</h2>', 'block_end' => '</div>', 'content_words' => 20, 'thumb_width' => 100, 'thumb_height' => 100, 'thumb_class' => 'left', )); echo '</div>';
Аналогично можно выводить любое количество рубрик/колонок.
Схема вывода записи
В Block_pages для вывода записей используется шаблонизатор Page_out, только в более простом варианте. Предполагается, что каждая запись выводится в виде пяти линий. Три вначале, далее текст записи, в конце еще 2 линии. Схематично, в виде параметров это будет так:
- block_start
- line1
- line2
- line3
- content
- line4
- line5
- block_end
- pagination
По-умолчанию значения линий такие (остальные пустые):
- 'line1' => '[thumb]'
- 'line2' => '[title]'
- 'line3' => '[date] [cat]'
Если например нужно выводить запись: заголовок, миниатюра, контент, дата, то:
$b->output( array ( ... 'line1' => '[title]', 'line2' => '[thumb]', 'line3' => '', 'line4' => '[date]', ... ));
Если требуется изменить верстку каждого элемента, то используем параметры «XXX_start» и «XXX_end», которые передаются в format шаблонизатора Page_out.
$b->output( array ( ... 'title_start' => '<h4 class="home-best-page">', 'title_end' => '</h4>', ... ));
Без контента
Такой вариант вывода иногда встречается в premium-шаблонах: выводятся в одной линии только миниатюра и заголовок записи. Например 5 записей в ряд. С Block_pages это делается достаточно просто — нужно лишь предположить, что это пять колонок.
$b = new Block_pages( array ( 'limit' => 5, )); $b->output( array ( 'block_start' => '<div class="home-mini-title">', 'block_end' => '</div>', 'columns' => 5, 'columns_class_cell' => 'col w1-5', 'content' => false, 'thumb_width' => 100, 'thumb_height' => 100, 'thumb_class' => '', 'placehold' => true, 'placehold_path' => getinfo('template_url') . 'images/placehold/', 'line3' => '', 'title_start' => '<p>', 'title_end' => '</p>', ));
Вся магия в limit, css-классе .w1-5 и content (false).
Кеширование
Каждый блок записей может генерировать большое количество запросов БД. Поэтому я рекомендую пожалеть сервер и реализовать кеширование всего вывода главной. Для этого вы можете использовать следующий код:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); $home_cache_time = 15; // время кеша в минутах, 0 — отключить кеш $home_cache_key = 'home-' . getinfo('template') . '-' . mso_current_paged(); if ($home_cache_time > 0 and $k = mso_get_cache($home_cache_key) ) echo $k; else { ob_start(); ... тут вывод всех блоков ... mso_add_cache($home_cache_key, ob_get_flush(), $home_cache_time * 60); }
Комментариев: 2 RSS
1Дмитрий20-09-2013 04:34
Спасибо статья очень помогла.
Как вывести cut на главной через определеное количество символов вот мой код
2Дмитрий20-09-2013 04:37