Выборка одной записи (запрос 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($request['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($request['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, sort) на извлечение этой записи не влияют.

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

Исключение составляет запрос part, который при single-запросах игнорируется, о чем читайте ниже.

Одновременное применение запросов single и part

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

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


Параметрические ссылкиЧеловекопонятные ссылки
href="?page=3&block=24&single=456"href="news/iphone-6-release"
href="?page=3&block=24&part=99&single=456"href="news/99/iphone-6-release"

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

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

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

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


См. также