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

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

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

JQ: Автоматизация поиска и сортировки


WildRAID

1 849 просмотров

Всего для выдачи результата необходимо минимум два запроса к БД:

  1. Count-запрос. Здесь же считаются суммы для колонок, у которых 'sum' => true.
  2. Основной запрос.

В основном SELECT-запросе ($this->query) используется два placeholder'а - {fields} и {where}.

 

Подробнее:

{fields} - собирается на основании $this->cols, ключа 'db'. В count-запросе подставляется 'count(*)'.

{where} - собирается на основании $this->cols и данных из $this->request. Если поиск не осуществлялся, то подставляет 'true'.

 

К основному запросу автоматом добавляются ORDER BY, LIMIT и OFFSET на основании входящих данных.

 

В данный момент поддерживается только автоматический поиск с прямой передачей параметров в запросе. Это filterToolbar, это простой formSearch, это прямая передача параметров через serializeGridData или setPostDataItem. Поддержка других типов поиска появится тогда, когда в этом возникнет надобность.

 

Указание операторов

При поиске по датам и числам поддерживается указание префиксов-операторов.

 

Например:

>16 (больше 16)
>=17 (больше-равно 17)
<>15.02.2010 (не равно 15.02.2010)

 

Прямо так и вводим в filterToolbar.

Оператор по умолчанию - '=' (равенство).

 

Строковые значения ищутся оператором ILIKE '%{val}%'

 

Поиск "по умолчанию"

Чтобы упростить жизнь, было сделано следующее.

 

Все переменные дополнительные переменные (кроме section и act), которые использовались в момент создания грида, будут добавлены к нему в URL. Следовательно, будут влиять на поиск. Пример можно посмотреть в "Статистике внешних сервисов". Там передается &cat=X.

 

Особый поиск

Для сложных случаев возможно опускать {where} и вручную формировать условия, либо использовать комбинацию из {where} и своих условий. Живой пример:

 

		$transfer_id = isset($this->request['transfer_id']) ? intval($this->request['transfer_id']) : 0;

	$this->query = "
		SELECT {fields}
		FROM payment_bnd_order b
			JOIN payment_tbl_transfer pt ON (b.transfer_id=pt.id)
			JOIN tbl_order o ON (b.order_id=o.id)
			JOIN tbl_order_payment p ON (b.order_id=p.order_id AND pt.payment_type=p.payment_type)
			JOIN lst_payment_types lp ON (p.payment_type=lp.id)

			LEFT JOIN (
				SELECT order_id, sum(sum) as sum_prev
				FROM payment_bnd_order
				WHERE transfer_id != $transfer_id
				GROUP BY order_id
			) s ON (b.order_id = s.order_id)
		WHERE b.transfer_id=$transfer_id AND {where}
	";

 

Работа с диапазонами дат

См. refstat/jq_refstat.php

0 комментариев


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

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

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