Request — это класс для прямого управления запросами к блокам.
Основным способом управления выборкой записей к блокам является формирование URL-запросов. Этот способ имеет ограничения, главное из которых заключается в том, что составить можно запрос только к одному блоку.
В тех случаях, когда мы имеем дело с комплектом из нескольких блоков, нужно создавать запросы одновременно ко всем блокам.
Например, в каталоге товаров могут быть такие блоки: блок навигации (меню), товарный блок, блок сопутствующих товаров, блок аналогичных товаров, и одновременно ко все блокам нужно производить соответствующие запросы.
Как построить запросы в этом случае? Во-первых, первичные запросы обычно формируются в ссылках блока навигации. Во-вторых, нужно решить, к какому блоку будут идти запросы непосредственно через URL. В случае с каталогом товаров, самый естественный вариант — это товарный блок.
При щелчке по пункту меню должно меняться не только содержимое товарного блока, но и все остальные блоки, в том числе и сам блок навигации. Как раз, с помощью класса Request и создаются запросы к остальным блокам. При этом, соответствующие коды нужно вносить в дескриптора (.tddh) или обработчика дескриптора (.tddh), так как они вызываются до формирования блока из шаблона (.tpl), то есть до извлечения данных из базы данных.
Метод для получения запросов. Можно применять до четырех параметров. Примеры:
Request::get() — получение массива всех запросов ко всем блокам страницы.
Request::get($block) — получение всех запросов к указанному блоку.
Request::get($block, 'search') — получение параметров поискового запроса к указанному блоку. Параметр $filter может принимать следующие значения: 'backward', 'limit', 'part', 'pick', 'search', 'single', 'sort'.
Параметры запросов можно уточнять, применяя третий и четвертый параметры, где это возможно.
Например:
Request::get(2, 'pick', 1, 'eq') — получение значения, переданного с помощью URL-запроса: 'block=2&pick[1][eq]=99' или 'block=2&p[1]=99'.
Входные данные (последовательность параметров) метода Request::get() и выходные данные (возвращаемый массив) имеют в своем роде (иерархически) одинаковую структуру.
Request::get($block, 'part', 'current') | Номер выбранной (текущей) части | |
Request::get($block, 'part', 'num-of-parts') | Количество частей, на которые были разбиты все записи | |
Request::get($block, 'part', 'num-of-recs') | Общее количество записей (во всех частях) | |
Request::get($block, 'part', 'prev') | Номер предыдущей части | |
Request::get($block, 'part', 'next') | Номер следующей части | |
Request::get($block, 'part', 'default') | Номер части, открываемой по умолчанию, то есть, без запроса part. При $params['part']['numbering']='desc' значение этой переменной равно Request::get($block, 'part', 'num-of-parts'), в остальных случаях значение равно 1. Пример | |
Request::get($block, 'part', 'last') | Номер части, находящейся в конце пагинации, в противоположность переменной Request::get($block, 'part', 'default'). | |
Request::get($block, 'part', 'parts') | Массив с номерами всех частей по порядку | |
Request::get($block, 'part', 'limit') | Ограничение на число отображаемых записей. Совпадает с параметром дескриптора: $params['part']['limit']. Однако, если был url-запрос limit, то его значение становится равным значению этой переменной. | |
Request::get($block, 'search', 'texts', НомерПоля) | Все поисковые слова данного поля в виде строк с пробелами между словами. | |
Request::get($block, 'search', 'where') | Где искать: в начале слов, в любом месте или в начале текстов | |
Request::get($block, 'search', 'highlight') | Выделять найденные поисковые слова. | |
Request::get($block, 'search', 'fields') | Массив полей, поисковые слова которых объединяются в один общий запрос. Используется обычно, когда одно поле ввода используется для нескольких полей. | |
Request::get($block, 'search', 'words', НомерПоля) | Все поисковые слова данного поля в виде массива слов. | |
Request::get($block, 'search', 'patterns', НомерПоля) | Массив паттернов для поиска среди текста данного поля (поставить в качестве первого параметра функции preg_replace) | |
Request::get($block, 'search', 'replacements', НомерПоля) | Массив строк для замены текста данного поля (поставить в качестве второго параметра функции preg_replace) | |
Request::get($block, 'single') | Номер запрошенной записи | |
Request::get($block, 'backward') | Если эта переменная истинна, значит записи отображаются в обратном порядке. |
Удаление определенных запросов или их элементов. Параметры такие же, как у метода Request::get().
Пример: Request::remove('block=2&p[1]');
Request::set()
Если опустить параметр, то будут обработаны глобальные запросы GET и POST, впрочем, разработчику сайта специально этого делать не нужно – система делает это автоматически.
Request::set($requests)
Как только вы вызовите данный метод с параметром, все запросы ко всем блокам будут сброшены.
Отсюда следует, что для того чтобы просто сбросить все запросы, достаточно передать пустой параметр: Request::set(''). При этом, на страничке у каждого блока будут выведены все записи (без фильтров).
Если вы собираетесь только добавить какой-то запрос, используйте метод Request::add(), описанный ниже.
Метод служит для добавления запросов к существующим (или их замене, при совпадении).
Пример: Request::add('block=1&part=2');
Request::add('block=2&p[1]=99&limit=10');
Request::add('block=3&part=1');
Request::add([
2=>[
'p'=>[1=>99],
'limit'=>10,
],
3=>['part'=>1],
]);
Request::add([
2=>[
'pick'=>[1=>['eq'=>99]],
'part'=>['limit'=>10],
],
3=>['part'=>['current'=>1]],
]);
Допустимо использование смешанных массивов, то есть, в одном массиве могут присутствовать элементы как в упрощенном формате, так и в полной.
$filtersQuery = Request::convertToQuery(Request::get($blockId));
$href = '?edit&block='.$blockId.$filtersQuery;
См. также Url::arrayToQuery()