Шаблоны блога похожи на шаблоны каталога товаров, рассмотренного в одной из предыдущих статей этого раздела. На примере данного блога, мы рассмотрим несколько дополнений:
Чтобы создать персональный блог нужно собрать всего одну страницу. Корневому блоку страницы назначьте шаблон "blog_". Этот шаблон устроен так: слева идет список статей блога (шаблон blog_list), справа – статья блога (blog_articles), открывающаяся при щелчке по одному из пунктов списка. Под статьей находится блок с комментариями посетителей (шаблон blog_comments). Всем трем вложенным блокам упомянутые шаблоны назначаются по умолчанию.
<?php echo " {$dat['edit']} <table> <tr> <td>$dat[1]</td> <td> $dat[2] <hr> $dat[3] </td> </tr> </table> "; ?>
<?php
$types = [
1 => "block template('blog_list')",
2 => "block template('blog_articles')",
3 => "block template('blog_comments')",
];
?>
<?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>"; // Сюда желательно поместить // код для навигации по частям списка ?>
<?php
$titles[1] = 'Название статьи блога';
$types[1] = 'varchar(255)';
$params['multi-record'] = true;
# Показать 20 последних статей
$params['part']['limit'] = 20;
# ...в обратном порядке
$params['backward'] = true;
?>
<?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]'> "; } ?>
<?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().
<?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> "; ?>
<?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];
?>