 
Пример блога с комментариями посетителей
Шаблоны блога похожи на шаблоны каталога товаров, рассмотренного в одной из предыдущих статей этого раздела. На примере данного блога, мы рассмотрим несколько дополнений:
-
В предыдущих примерах pick-навигации содержательный блок в отсутствие запросов был пуст, теперь по умолчанию, должны показываться последние записи.
-
Добавим блок для комментариев, и рассмотим, как можно сделать условный запрос одновременно к двум блокам страницы.
Внешний шаблон (шаблон страницы)
Чтобы создать персональный блог нужно собрать всего одну страницу.
Внешнему блоку страницы назначьте шаблон "blog_".
Этот шаблон устроен так: слева идет список статей блога (шаблон blog_list), справа – статья блога (blog_articles), открывающаяся при щелчке по одному из пунктов списка.
Под статьей находится блок с комментариями посетителей (шаблон blog_comments).
Всем трем вложенным блокам упомянутые шаблоны назначаются по умолчанию.
blog_.tpl | blog_.tdd |
|
<?php
echo "
{$dat['edit']}
<table>
<tr>
<td>$dat[1]</td>
<td>
$dat[2]
<hr>
$dat[3]
</td>
</tr>
</table>
";
?>
|
<?php
$types = array (
1 => "block template('blog_list')",
2 => "block template('blog_articles')",
3 => "block template('blog_comments')",
);
?>
|
Шаблон для списка статей блога
blog_list.tpl | blog_list.tdd |
|
<?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['isMultiRec'] = true;
# Показать 20 последних статей
$params['part']['limit'] = 20;
# ...в обратном порядке
$params['backward'] = true;
?>
|
Шаблон для статей блога
blog_articles.tpl | blog_articles.tdd |
|
<?php
if (empty($tab))
return;
# Выборка по умолчанию (если запроса не было).
# См. аналогичное условие в дескрипторе,
# где измененяется режим выборки.
if (empty($GLOBALS['pick'][$block][1]['eq']))
{
foreach ($tab as $dat)
{
# не отображать запись
# с кнопкой новой записи
if (!empty($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['isMultiRec'] = true;
# Поле 1 скрыть от редактирования
$params['hiddenFields'] = array(1);
# Если к полю 1 не был произведен запрос, то
# отображаются последние 3 статьи в обратном порядке
if (empty($GLOBALS['pick'][$articlesBlock][1]['eq']))
{
$params['backward'] = true;
$params['part']['limit'] = 3;
}
else
{
$params['pick']['keyFields'] = array(1);
//Этот параметр обязательности запроса
//к полю 1 можно вообще убрать, так как
//условие отсутствия запроса уже учтено.
}
# При создании новой записи,
# в поле 1 будет записан ID статьи
$defaults[1] =
$GLOBALS['pick'][$articlesBlock][1]['eq'];
?>
|
При щелчке по одному из пунктов списка статей шаблона blog_list.tpl, производится запрос на выборку одной статьи их блока статей (шаблон blog_articles). Одновременно в блоке комментариев, который мы сейчас рассматриваем, нужно отобразить записи, которые относятся к той же статье.
Но сделать соответствующий запрос мы уже не можем – в Blox CMS запросы специальной выборки можно делать только к одному блоку страницы. Задача состоит в том, чтобы создать такой запрос к блоку комментариев искусственно. Нужно просто взять соответствующую глобальную переменную от блока статей, и передать ее данные глобальной переменной блока с комментариями.
blog_comments.tpl | blog_comments.tdd |
|
<?php
# Если нет запроса на конкретную статью,
# то не показывать комментарии
if (empty($GLOBALS['pick'][$block][1]['eq']))
return;
echo "<h4>Комментарии посетителей</h4>";
if (!empty($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 статьи не производился.
# Поэтому создаем этот запрос искусственно
$GLOBALS['pick'][$commentsBlock][1]['eq'] =
$GLOBALS['pick'][$articlesBlock][1]['eq'];
$titles[2] = 'Текст комментария';
$titles[3] = 'Имя';
$types[1] = 'int(4) unsigned'; // ID статьи
$types[2] = 'text';
$types[3] = 'varchar(50)';
# При создании новой записи,
# в поле 1 будет записан ID статьи
$defaults[1] =
$GLOBALS['pick'][$commentsBlock][1]['eq'];
$params['isMultiRec'] = true;
$params['public'] = true;
# Поле 1 скрыть от редактирования
$params['hiddenFields'] = array(1);
# Только при поступлении запроса
# к полю 1, будет произведена выборка
$params['pick']['keyFields'] = array(1);
?>
|
Примечания
- В некоторых шаблонах и дескрипторах необходимо указать идентификаторы блоков (переменные $articlesBlock и $commentsBlock). Эти идентификаторы станут известны только после назначения шаблонов для блока статей и для блока комментариев, соответственно. Однако, от переменных настройки можно избавиться с помощью метода описанного в статье, посвященной передаче данных между блоками.
|