MaxSite.org 11 лет
Блог вебмастера о сайтостроении
Внимание! Данная запись отмечена как устаревшая и может содержать неточную или неактуальную информацию!

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

MaxSite CMS / Общие вопросыПросмотров: 10453 (195)

В 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' => '',
        'title_end' => '',
    ));

Вся магия в 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 06:34

Спасибо статья очень помогла.

Как вывести cut на главной через определеное количество символов вот мой код

2Дмитрий20-09-2013 06: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' => '...',
));
Оставьте комментарий!

Комментарий будет опубликован после проверки. Вы соглашаетесь с правилами сайта.

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

О сайте

Здесь вы получите самую полную информацию о создании сайтов на MaxSite CMS.