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

Вывод блоков записей в шаблоне

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

В 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

$b = new Block_pages( array ( 'limit' => 4, 'cat_id' => '1,2,3,4,5,6,7,8,9,10', 
'cut' => mso_get_option('more', 'templates', 'Читать полностью »'),
'pagination' => true,
));
$b->output( array ( 'block_start' => '', 'block_end' => '', 'columns' => 2,'content_words' => 20,
'thumb_width' => 280, 'thumb_height' => 120, 'thumb_class' => 'left', 'placehold' => true,
'content_chars'=> 200,
'cut' => '...',
));
Оставьте свой комментарий!

Комментарий будет опубликован после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)