Пример блога с комментариями посетителей

Шаблоны блога похожи на шаблоны каталога товаров, рассмотренного в одной из предыдущих статей этого раздела. На примере данного блога, мы рассмотрим несколько дополнений:

  1. В предыдущих примерах pick-навигации содержательный блок в отсутствие запросов был пуст, теперь по умолчанию, должны показываться последние записи.
  2. Добавим блок для комментариев, и рассмотим, как можно сделать условный запрос одновременно к двум блокам страницы.

Корневой шаблон (шаблон страницы)

Чтобы создать персональный блог нужно собрать всего одну страницу. Корневому блоку страницы назначьте шаблон "blog_". Этот шаблон устроен так: слева идет список статей блога (шаблон blog_list), справа – статья блога (blog_articles), открывающаяся при щелчке по одному из пунктов списка. Под статьей находится блок с комментариями посетителей (шаблон blog_comments). Всем трем вложенным блокам упомянутые шаблоны назначаются по умолчанию.

blog_.tpl
<?php
echo "
    {$dat['edit']}
    <table>
    <tr>
        <td>$dat[1]</td>
        <td>
            $dat[2]
            <hr>
            $dat[3]
        </td>
    </tr>
    </table>
";
?>
blog_.tdd
<?php

$types = [
    1 => "block template('blog_list')",
    2 => "block template('blog_articles')",
    3 => "block template('blog_comments')",
];

?>

Шаблон для списка статей блога

blog_list.tpl
<?php

# Блок для статей
$articlesBlock = 3;

if (empty($tab))
    return;

echo "<ul>";
foreach ($tab as $dat)
{
    echo "<li>";
    echo $dat['edit'];
    echo "<a href='?page=$page";

    # Запрос к блоку для статей:
    echo "&block=$articlesBlock";

    # Из того блока будут извлечены
    # записи, данные которых в поле 1
    # равны номеру записи текущено блока.
    echo "&p[1]={$dat['rec']}'>";
    # Выше приведана короткая форма записи
    # pick-запроса. Стандартная форма - ниже:
    # echo "&pick[1][eq]={$dat['rec']}'>";

    echo $dat[1];
    echo "</a>";
    echo "</li>";
}
echo "</ul>";

// Сюда желательно поместить
// код для навигации по частям списка 

?>
blog_list.tdd
<?php

$titles[1] = 'Название статьи блога';
$types[1] = 'varchar(255)';

$params['multi-record'] = true;

# Показать 20 последних статей
$params['part']['limit'] = 20;
# ...в обратном порядке
$params['backward'] = true;

?>

Шаблон для статей блога

blog_articles.tpl
<?php

if (empty($tab))
    return;
$request = Request::get($block);
# Выборка по умолчанию (если запроса не было).
# См. аналогичное условие в дескрипторе,
# где измененяется режим выборки.
if (empty($request['pick'][1]['eq']))
{
    foreach ($tab as $dat)
    {
        # не отображать запись
        # с кнопкой новой записи
        if ($dat['rec'])
        echo "
            <h1>$dat[2]</h1>
            $dat[3]<br>
            <img src='datafiles/$dat[4]'>
        ";
    }
}
# К полю 1 был произведен запрос
else
{
    # Код, как у однозаписного шаблона 
    echo "
        {$dat['edit']}
        <h1>$dat[2]</h1>
        $dat[3]<br>
        <img src='datafiles/$dat[4]'>
    ";
}
?>
blog_articles.tdd
<?php

# Блок для статей (этот блок).
$articlesBlock = 3;
//Переменная шаблона $block
//в дескрипторе недоступна.

$titles[2] = 'Заголовок блога';
$titles[3] = 'Текст блога';
$titles[4] = 'Фото';

$types[1] = 'int'; // ID статьи
$types[2] = 'varchar(255)';
$types[3] = 'text';
$types[4] = 'file maxWidth(600)';

$params['multi-record'] = true;
# Поле 1 скрыть от редактирования
$fields['hidden'] = [1];

# Если к полю 1 не был произведен запрос,
# то отображаются последние 3 статьи 
# в обратном порядке
if (!Request::get($articlesBlock,'pick', 1, 'eq')
{
    $params['backward'] = true;
    $params['part']['limit'] = 3;
}
else
{
    $params['pick']['key-fields'] = [1];
    //Этот параметр обязательности запроса
    //к полю 1 можно вообще убрать, так как
    //условие отсутствия запроса уже учтено.
}

# При создании новой записи,
# в поле 1 будет записан ID статьи
$defaults[1] =
    Request::get($articlesBlock,'pick', 1, 'eq');
?>

Шаблон для комментариев к статье блога

При щелчке по одному из пунктов списка статей шаблона blog_list.tpl, производится запрос на выборку одной статьи их блока статей (шаблон blog_articles). Одновременно в блоке комментариев, который мы сейчас рассматриваем, нужно отобразить записи, которые относятся к той же статье.

Но сделать соответствующий запрос мы уже не можем – в Blox CMS запросы специальной выборки можно делать только к одному блоку страницы. Задача состоит в том, чтобы создать такой запрос к блоку комментариев искусственно. Нужно просто взять данные от блока статей, и передать ее данные блоку с комментариями с помощью Request::add().

blog_comments.tpl
<?php
$request = Request::get($block);
# Если нет запроса на конкретную статью,
# то не показывать комментарии
if (empty($request['pick'][1]['eq']))
    return;

echo "<h4>Комментарии посетителей</h4>";
if ($tab)
{
    foreach ($tab as $dat)
    echo "
        {$dat['edit']}
        $dat[2]<br>
        <i>$dat[3]</i>
        <br><br>
    ";
}

# Форма для ввода комментариев
echo "
    <form
        action='?update&block=$block&rec=new'
        method='post'
    >
        <textarea name='dat[2]'></textarea><br>
        Имя: <input type='text' name='dat[3]'>
        <input type='submit' value='ok'>
    </form>
";

?>
blog_comments.tdd
<?php

# Блок для статей
$articlesBlock = 3;
# Блок для комментариев (этот блок)
$commentsBlock = 4;


# К блоку с комментариями запрос
# по поводу ID статьи не производился.
# Поэтому создаем этот запрос искусственно
$query[$commentsBlock]['p'][1] = 
    Request::get($articlesBlock,'pick', 1, 'eq');
Request::add($query);

$titles[2] = 'Текст комментария';
$titles[3] = 'Имя';

$types[1] = 'int(4) unsigned'; // ID статьи
$types[2] = 'text';
$types[3] = 'varchar(50)';

# При создании новой записи,
# в поле 1 будет записан ID статьи
$defaults[1] =
    Request::get($commentsBlock,'pick', 1, 'eq');

$params['multi-record'] = true;
$params['public'] = true;
# Поле 1 скрыть от редактирования
$fields['hidden'] = [1];
# Только при поступлении запроса
# к полю 1, будет произведена выборка
$params['pick']['key-fields'] = [1];


?>

Примечания

  • В некоторых шаблонах и дескрипторах необходимо указать идентификаторы блоков (переменные $articlesBlock и $commentsBlock). Эти идентификаторы станут известны только после назначения шаблонов для блока статей и для блока комментариев, соответственно. Однако, от переменных настройки можно избавиться с помощью метода описанного в статье, посвященной передаче данных между блоками.

См. также