чтоб гетом можно было передать 'статус' и обработать
Открываем
пример.
Переходим на вкладку
PHP, чтобы посмотреть как это реализовано.
А там видим ключевые:
PHP:
protected function renderPostData()
{
$data = array();
foreach(array_intersect_key($this->input, $this->cols) as $k => $v)
{
$data[$k] = $v;
}
return $data;
}
protected function renderColumn($c)
{
if($this->input($c['name']))
{
$c['searchoptions']['defaultValue'] = $this->input($c['name']);
}
return $c;
}
В
renderColumn мы проверяем, если в массиве $this->input (по сути, он же $_REQUEST) передано среди прочего одно из имен столбцов грида, то мы это понимаем так, что параметрами в URL нам был передан "стартовый" фильтр. Поэтому для таких столбцов в
searchoptions указываем опцию
defaultValue, чтобы при визуализации грида на клиенте это defaultValue уже было прописано (применено) в FilterToolbar. Т.е. этим мы имитируем, будто пользователь ввёл условие фильтра в шапке соответствующего столбца (столбцов).
В
renderPostData мы переписываем параметры, совпадающие с названиями столбцов в нашем гриде, переданные в $this->input (по сути, он же $_REQUEST), в массив $data, чтобы позднее в jqGridPHP произошла подстановка таких параметров вместо {where} в $this->query.
Таким образом, переопределение вот этих двух функций позволяет нам через URL передать фильтры по любому кол-ву столбцов и грид на клиенте визуализируется с учётом этих фильтров. В вышеуказанном примере в URL и передаётся
PHP:
&delivery_type=2&price=>1000
delivery_type и price - это столбцы в гриде. При этом результирующий SQL можно глянуть через Firebug. Он будет таким:
PHP:
SELECT i.id AS id, i.order_id AS order_id, o.delivery_type AS delivery_type, o.delivery_cost AS delivery_cost, CONCAT(c.first_name, ' ', c.last_name) AS customer_name, b.name AS name, i.price AS price
FROM tbl_order_item i JOIN tbl_books b ON (i.book_id=b.id) JOIN tbl_order o ON (i.order_id=o.id) JOIN tbl_customer c ON (c.id=o.customer_id)
WHERE o.delivery_type = '2' AND i.price > '1000' ORDER BY id asc LIMIT 20 OFFSET 0
Вот мы и видим, что подставились наши условия фильтров.
Но такой подход сработает, если jqgrid впервые рендерится (выводится) на странице. Если же сначала jqgrid выводится без фильтров, а в процессе работы потребуется наложить некий фильтр через reloadGrid, то фильтр применится, но в FilterToolbar не будут прописаны условия фильтров, их придётся "дописать" самому. Об этом я писал
выше. Но может Вам это и не надо. Это обычно надо, когда грид расположен на диалоге, который визуализируется позже по нажатию некой кнопки. Для выбора значения из справочника, например.
У меня, к примеру, в проекте идёт использование jqgrid в диалогах для выбора значений из справочников. При этом требуется, чтобы грид сразу визуализировался с предустановленным фильтром. Поскольку у меня при загрузке страницы такие гриды, назовём их служебными, инициализируются сразу, то фильтра в них изначально нет. Поэтому предложенный выше вариант мне не подходит (по крайней мере если
~WR~ не даст ответа на мой вопрос
выше ) и я пользуюсь установкой фильтра исключительно на клиенте. Я описывал этот вариант
здесь. Т.е. происходит полная имитация, будто пользователь ввёл условие фильтра и нажал Enter.