CONTENT MANAGEMENT SYSTEM
Blox Logo
Blox CMS — блочный метод сайтостроения
.
 
Blox Help

←→

Выборка одной записи (запрос single)

Для выборки одной записи в ссылках применяется запрос single, который указывает на идентификатор записи. Вместе с этим запросом должен быть передан идентификатор блока, в котором находится запрашиваемая запись, и идентификатор страницы. На страничке "Переменные шаблона" вы может посмотреть перечень переменных, которые передаются на шаблон при данном запросе.

Пример 1.

<?php echo "

    {$dat['edit']}
    foreach ($tab as $dat)
    echo "
        <a href='?page=$page&block=$block&single={$dat['rec']}'>$dat[1]</a>
    ";

?>

В данном примере при первом открытии появятся все записи. При щелчке по ссылке, будет показана только одна запись, на идентификатор которой указывает значение этой переменной запроса. Приведем более сложный пример:

Пример 2.

<?php
    if (empty($single))
    {
        echo "Список специалистов<br>";
        foreach ($tab as $dat)
        echo "
            {$dat['edit']}
            <a href='?page=$page&block=$block&single={$dat['rec']}'>$dat[1]</a>
            <br>
        ";
    }
    else
    {
        echo "
        {$dat['edit']}
        Фамилия Имя Отчество: $dat[1]<br>
        Специальность: $dat[2]<br>
        Дата рождения: $dat[3]<br>
        Телефон: $dat[4]<br>
        Адрес: $dat[5]<br>
        Примечания: $dat[6]<br>
        ";    
    }
?>

В качестве примера взят некоторый банк данных по специалистам. Если страничка была открыта по умолчанию без запроса single, то открывается список из фамилий. Каждая фамилия является ссылкой на страничку с детальной информацией о конкретном специалисте.


Переход на соседнюю запись (предыдущую или следующую)

Как было показано выше, данные текущей записи находятся в себе массив $dat. Эти же данные дублируются в массиве $tab[0]. На самом деле при запросе single извлекаются также данные соседних записей, и полностью массив данных выглядит так:

$tab[0]данные текущей записи
$tab['prev']данные предыдущей записи
$tab['next']данные следующей записи

С помощью элементов $tab['prev'] и $tab['next'] можно создать ссылки для перехода, соответственно, на на предыдущую и следующую запись. С дополнительным кодом, который показан в цвете, предыдущий пример будет выглядеть так:

Пример 3.

single.tpl

<?php 

if (empty($single))
{
    echo "
    Список специалистов<br>";
    foreach ($tab as $dat)
    echo "
        {$dat['edit']}
        <a href='?page=$page&block=$block&single={$dat['rec']}'>
        $dat[1]
        </a>
        <br>
    ";
}
else
{          
    echo "<br>
    {$dat['edit']}
    Фамилия Имя Отчество: $dat[1]<br>
    Специальность: $dat[2]<br>
    Дата рождения: $dat[3]<br>
    Телефон: $dat[4]<br>
    Адрес: $dat[5]<br>
    Примечания: $dat[6]<br>
    ";
            
    echo "<a href='?page=$page'>Показать все записи</a>";
    
    if (empty($tab['prev']['rec'])) 
        echo "Предыдущий";
    else
        echo "<a href='?page=$page&block=$block&single={$tab['prev']['rec']}'>Предыдущий</a>";
        
    if (empty($tab['next']['rec'])) 
        echo "Следующий";
    else
        echo "<a href='?page=$page&block=$block&single={$tab['next']['rec']}'>Следующий</a>";
}

?>

single.tdd (дескриптор шаблона для примеров 2 и 3)

<?php
 
$types[1] = 'varchar(155)';
$types[2] = 'varchar(100)';
$types[3] = 'date';
$types[4] = 'varchar(15)';
$types[5] = 'varchar(255)';
$types[6] = 'varchar(155)';

$params['isMultiRec'] = true;
 
?>

Особенности извлечения соседних записей при сложных запросах

Формирование элемента $tab[0] с информацией о текущей записи, определяется только значением запроса singleReс, то есть номером запрашиваемой записи. Другие одновременно действующие запросы (например, pick или part) на извлечение этой записи не влияют. Однако, дополнительные запросы нужны для получения списка всех записей, из которых потом будут браться соседние записи (в виде $tab['prev'] и $tab['next']).

Дополнительный запрос, действуя как фильтр, сужает выборку данных. И именно в рамках этой выборки пользователь и будет перемещаться от одной записи к другой. Отсюда следует, что, чем больше условий, накладываемых на выборку, тем меньше цепочка записей.

Если нужно делать сквозной проход по всем записям, не накладывайте никаких условий, кроме запроса singleReс

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

Сквозной проход по всем частям

В продолжение предыдущего параграфа. Если вы хотите, чтобы пользователи перемещались между записями в рамках только одной части, в URL нужно добавить параметр part:

# Переход к следующей записи
<a href='?page=$page&block=$block&part=$part&single={$tab['next']['rec']}'>Следующий</a>

Однако, для перехода к записям из другой части пользователю теперь придется выходить в общий список. Для сквозного прохода через все части запрос part лучше убрать.

# Переход к следующей записи
<a href='?page=$page&block=$block&single={$tab['next']['rec']}'>Следующий</a>

При этом время выборки увеличится. Хотя для обычных случаев это увеличение не существенно. Тест на MySQL 5.0.5 при общем числе записей 180 и числе записей в одной части 30 показал увеличение времени вывода блока на 8%. Однако, если число записей в выборке по данному запросу будет велико (порядка тысячи), то к запросу single желательно добавлять запрос part.

Ссылка на текущую часть при сквозной проходе

Перемещаясь от одной записи к другой, пользователь может захотеть выйти в список. Даже при сквозном проходе было бы логично выйти не в начальную часть, а в ту часть, в которой находилась последняя просмотренная запись. Для этого нужно знать номер этой части.

Хотя при сквозном проходе, запрос part и не используется, все параметры текущей части продолжают отслеживаться. То есть, в шаблоне действуют все переменные шаблона, передаваемые при выборке записей по частям. Например, чтобы выйти в список записей текущей части нужно иметь такую ссылку:

# Возврат в список текущей части
<a href='?page=$page&block=$block&part=$part'>В список</a>

# Переход к следующей записи
<a href='?page=$page&block=$block&single={$tab['next']['rec']}'>Следующий</a>