Поиск в системе
Результаты поиска по тегам 'JQ-админ'.
Найдено 4 результата
-
JQ-админка. Добавление новой секции. 1. Придумать короткое имя секции на английском. 2. Добавить в config.php элемент массива $sections: Например: $sections['payment'] = array( 'name' => 'Платежи', 'items' => array( 'distrib'=> 'Разнос платежей', 'return'=> 'Возврат средств', ), ); Где payment - имя секции. Секция появится в главном меню. 3. В /grids/ создать папку с именем секции. В нее положить классы гридов. 4. В /templates/ создать папку с именем секции. В нее положить шаблоны smarty. 5. (Не обязательно) В /libs/ создать контроллер и модель секции. По изменениям в механизмах работы. Практика показала, что в подавляющем большинстве интерфейсов центральное место занимают гриды. Так или иначе, все вращается вокруг них. Это привело к тому, что в контроллерах постоянно повторяются однотипные функции. Плохо. В новой схеме всё максимально автоматизируется и упрощается. Контроллер Чтобы обратиться к функции test секции payment, используем ?section=payment&act=test Если контроллер секции отсутствует, либо соответствующая функция в нем не определена, то возможны два варианта. Если у act есть префикс 'jq_' (например: 'jq_orders'), то подгружается класс грида с таким названием. Если в запросе есть oper - вызывается соответствующее действие грида (вставка, редактирование и т.п.) Если нет - происходит выгрузка данных в грид (JSON). [*]В ином случае напрямую вызывается tpl-шаблон с именем, аналогичным act. В примере выше произойдет вывод шаблона test.tpl из секции payment. Если вам нужны дополнительные переменные в шаблоне - создавайте контроллер и определяйте свои функции.
-
Работа с гридами. Основная документация по 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.
-
Рендеринг грида В шаблоне tpl грид создается следующим образом (на примере jq_return): <script> {$jq_loader->render('jq_return')} {literal} autowidth: true, height: 430, rowNum: 50, caption: 'Возврат средств', scroll: 1, gridComplete: function(){ gridHighlight('#jq_return'); } }); $grid.jqGrid('navGrid', pager,{add: false, edit: false, del: true, deltext:'Удалить', refresh:true, refreshtext: 'Обновить', search:false}); Объект $jq_loader - это "фабрика" гридов. Она всегда присутствует в темплейтах. Метод render подгружает класс грида из текущей секции (?section=xxx) с именем, указанным в аргументе, и рендерит необходимый HTML-код и "верхушку" JS-объекта. В нее входит: colModel colNames pager url editurl cellurl Это то, что можно сгенерировать автоматически. Также определяются переменные: $grid - объект jQuery с последним созданным гридом. Специально для любителей копи-пасты.) Если гридов несколько, то эту переменную можно использовать на этапе инициализации кнопочек и тулбаров, но нельзя использовать в событиях. Если грид один - можно использовать везде. $jq_return - переменная с именем, аналогичным id грида. Используется в тех случаях, когда гридов несколько. Не надо писать селекторы по сто раз! Пользуйтесь переменными. Несколько однотипных гридов Если грид один и тот же должен повторяться несколько раз на одном экране, следует использовать второй необязательный аргумент функции render - $suffix. Например: {$jq_loader->render('jq_cats', 1)} ... {$jq_loader->render('jq_cats', 2)} Будет создано два грида - $jq_cats1 и $jq_cats2. Но они будут работать с единым классом jq_cats.
-
Всего для выдачи результата необходимо минимум два запроса к БД: Count-запрос. Здесь же считаются суммы для колонок, у которых 'sum' => true. Основной запрос. В основном 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