JQ: Работа с гридами
Работа с гридами.
Основная документация по JS-части: http://www.trirand.com/jqgridwiki/doku.php...wiki:jqgriddocs
Серверная часть представлена классами гридов и шаблонами.
Классы.
В /grids/ лежит базовый класс - jq_base. Он содержит реализацию многих стандартных функций "по умолчанию". От него наследуются классы отдельных гридов.
Необходимый минимум (на примере jq_payment):
<?php class jq_return extends jq_base { protected function init() { //определение имени главной таблицы $this->tblName = 'payment_tbl_return'; //основной запрос на выборку $this->query = " SELECT {fields} FROM {$this->tblName} pr JOIN tbl_order o ON (pr.order_id=o.id) JOIN tbl_order_payment p ON (pr.order_id=p.order_id) JOIN lst_payment_types lp ON (lp.id=pr.payment_type) WHERE {where} "; //колонки грида $this->cols = array( 'id' =>array('name' => '№ пп', 'db' => 'pr.id', 'width' => 5, ), 'order_number' =>array('name' => '№ заказа', 'db' => 'o.order_number', 'width' => 10, ), ); } }
Этого достаточно. Грид уже умеет делать постраничный вывод, сортировать по любому из полей, осуществлять поиск. Также умеет делать INSERT, UPDATE и DELETE.
Функции
Если вам нужно особое поведение, то оно достигается перегрузкой соответствующих методов:
- init() - Вызывается в конструкторе ПОСЛЕ получения массива $this->request, но ПЕРЕД любыми другими действиями.
- parseRow($r) - Вызывается для каждого ряда таблицы. Принимает массив, возвращает его же. Пример -> добавление элемента '_class' => 'green' для покраски строки в зеленый цвет.
- op_add($ins) - Добавление ряда (INSERT). Принимает массив значений для вставки.
- op_edit($id, $upd) - Апдейт ряда (UPDATE). Принимает id и массив значений для обновления.
- op_del($id) - Удаление ряда (DELETE). Принимает id или список id через запятую (multiselect) для удаления.
- oper_data($data) - Возвращает массив значений. Вызывается ПЕРЕД op_add и op_edit. Нужно в тех случаях, когда в одном гриде используются обе эти функции, и в обоих должно быть одинаковое преобразование данных перед записью.
Для определения custom-операций следует создавать функции с префиксом 'op_' аналогично стандартным.
Например, oper=test. Функция будет op_test.
Custom-операции не имеют аргументов. Все данные в них следует получать из $this->request.
Колонки
Колонки грида определяются массивами $this->cols и $this->cols_default.
$this->cols_default содержит опции, которые применяются ко всем колонкам, для которых они явно не определены. Например:
$this->cols_default = array('align' => 'center', 'formatter' => 'integer');
- выровняет все колонки по центру и применит к ним formatter.
По структуре $this->cols:
Ключи массива - это идентификаторы колонок. Они используются везде - в colModel, в передаваемых данных, в запросах к БД (pt.id AS id). Необходимо избегать идентификаторов, совпадающих с техническими переменными jqGrid или админки: oper, nd, _search, section, act и т.д.
В будущем будет включена защита, которая будет выкидывать Notice в случае совпадения.
Значения соответствуют структуре colModel jqGrid'а. Со следующими особенностями:
- Ключ 'name'
Задает имя колонки. Русское. Для людей. По умолчанию - пустая строка.
- Ключ 'db'
Поле для подстановки в {fields} и {where}. Может быть выражением. Примеры:pt.id COALESCE(pt.id, 0) round(price) * discount
По умолчанию аналогично идентификатору колонки, поэтому в простых запросах ключ db следует опускать.
- Ключ 'manual'
Указывает на то, что данные НЕ следует брать из БД, а они будут сформированы в parseRow вручную. Такая колонка не попадет в {fields}, по ней невозможен поиск и сортировка. Ключ 'db' в этом случае игнорируется.
- Ключ 'unset'
Действие противоположно manual. Колонка выбирается из БД, по ней возможен поиск и сортировка. Но она не попадает в colModel и не передается в составе результатов от сервера. Нужно для особых случаев -> в обычной жизни лучше прятать стандартным ключом 'hidden'.
- Ключ 'id_flag'
Явно указывает поле, которое будет считаться id ряда в jqGrid. По умолчанию первое поле становится id.
- Ключ 'count_sum'
Добавляет подсчет суммы по этой колонке. Это происходит в рамках count-запроса. Значения записываются в userdata. Пример работы с footerrow можно посмотреть в партнерке.
- Определение JS-функций
Если вам нужно добавить в colModel имя функции (например, dataInit при редактировании), следует добавить перед ним знак апострофа. Например:'sum' =>array('name' => 'Оплата', 'db' => 'b.sum', 'width' => 10, 'editable' => true, 'editrules' => array('integer' => true, 'custom' => true, 'custom_func' => '`check_sum'), ),
Хотя это и возможно, следует воздержаться от написания тел JS-функций в определении колонок, ограничившись лишь указанием их имен. Чтобы свалки не было.)
Апостроф работает только только при создании colModel. Dont worry about your data.)
- Другие особые ключи
Если посмотрите в код, сможете обнаружить другие особые ключи: default, null, replace, search_op и т.д. В данный момент их не следует использовать. Пользуйтесь перегрузкой parseRow.
0 комментариев
Рекомендуемые комментарии
Комментариев для отображения не найдено.