Перейти к контенту

Модификации IPB на заказ

  • записей
    28
  • комментариев
    165
  • просмотров
    148 314

JQ: Работа с гридами


WildRAID

2 647 просмотров

Работа с гридами.

Основная документация по 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 комментариев


Рекомендуемые комментарии

Комментариев для отображения не найдено.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.