jqGridPHP - таблицы на ajax без головной боли

  • Автор темы Автор темы ~WR~
  • Дата начала Дата начала
По результатам последних дней, выкатил обновление.

1. Сохранение параметров.
Появилась возможность сохранять параметры, с которыми был инициализирован грид, во всех операциях и без дополнительных усилий.

Делается следующим образом:
PHP:
$data = array('user_id' => 15);
$rendered_grid = $jq_loader->render('myGrid', array('data' => $data));

Чтобы получить параметр в классе грида:
PHP:
$user_id = $this->render_data['user_id']; //15

2. Новая система Event'ов.
В последней версии jqGrid появилась система event'ов.

Для нас это хорошо тем, что теперь не нужно прописывать в событие 'gridComplete' вещи вроде 'extHighlight' и 'extFooterAgg'. Они будут работать автоматически, если соответствующие данные пришли со стороны сервера.

3. Легкое добавление filterToolbar.
Теперь можно добавить стандартный search toolbar, просто указав переменную:
PHP:
$this->render_filter_toolbar = true;

4. Упрощение работы с параметром 'extend'.
Если кто не знает, этот параметр позволяет вызвать jQuery.extend() и дополнить опции грида на стороне клиента. Что очень удобно для указания всяких функций.

Теперь его не обязательно явно прописывать. По умолчанию он берет глобальную переменную 'opts', чтобы работало "как в примерах". Вы можете изменить это поведение через переменную:
PHP:
$this->render_extend_default = ''; //disable

5. Изменились аргументы функции render.
Было:
PHP:
$jq_loader->render('myGrid', $extend, $suffix);

Стало:
PHP:
$options = array(
    'extend' => $extend,
    'suffix' => $suffix,
);
$jq_loader->render('myGrid', $options);

Причины заключаются в том, что многим людям нужно передавать какие-то специфические вещи в render, что приводит к увеличению кол-ва аргументов. При этом первые два заполняются null'ами. Всё это уродски выглядит и жалуется на ошибки E_STRICT из-за несоответствия аргументов при перегрузке функции.

Документация обновится в ближайшее время.
 
Обновились еще раз. Теперь точно всё.

У render остался один аргумент - массив $render_data. Его содержимое доступно в любом месте внутри классов таблиц.
Старые параметры 'suffix' и 'extend' теперь передаются в составе этого массива.

Добавился хук 'renderGridData', при помощи которого можно динамически изменять сохраняемый render_data.
Например, вы можете сделать адаптер, который будет инициализировать грид с параметрами, пришедшими из $_GET.

PHP:
protected function renderGridData($data)
{
    foreach(array_intersect_key($_GET, $this->cols)) as $k => $v)
    {
        $data[$k] = $v;
    }

    return $data;
}

Все, проще некуда.

P.S. У кого на последних версиях jqGrid не работает редактирование при наличии активных editrules, скачайте последнюю версию с github. Tony вчера всё поправил.
https://github.com/tonytomov/jqGrid/commit/3ace7baa4593aada458275bc24694f564db3cda8
 
Просто запустите /examples/install.php, предварительно настроив config.php
Будет создана тестовая база со случайными значениями. Генератор сделан для MySQL.

установил jqgridPHP
Запустил install.php (в базе создались таблицы)

Но при запуске вижу вот это:
qgrid1.png
,
как будто javascript отключен.

Может я не правильно установил jqgridPHP, или что то еще не то...

Можете проверить? (исходники во вложении)
 

Вложения

  • jq.zip
    jq.zip
    396,1 KB · Просмотры: 8
У кого-то уже была такая проблема.
Проверьте firebug'ом или просто вручную, какие JS-файлы не открываются. Они все внутри <head>.

Обратите внимание, что jQuery и jQuery UI берутся с CDN Яндекса. В прошлый раз полечилось отключением адских настроек безопасности, которые его блокировали.
 
Пожскажите, заметил на одном из скриншов синхронизацию. расскажите как реализовано?
 
Еще всплыл вопрос, хочу вызывать редактирование двойным щелчком по строке. подскажите как реализовать?

22.jpg

Еще непонятки:)
запускаю
PHP:
            'lastname' =>array('label' => 'Фамилия',
                                'width' => 35,
                                'editable'	=> true,
                                'edittype'	=>'select',
                                'editoptions'=>	 new jqGrid_Data_Raw('{value:"FX:FedEx;IN:InTime;TN:TNT;AR:ARAMEX"}'),

                                ),
в редактировнии все верно значение в базе FX к примеру, а в таблице FedEx не подставляется.
что не так делаю?
 
в редактировнии все верно значение в базе FX к примеру, а в таблице FedEx не подставляется.
что не так делаю?

создайте ассоциативный массив
$this->lastnames = array('FX' => 'FedEx', 'IN' => 'InTime', 'TN' => 'TNT', 'AR' => 'ARAMEX');

Затем перегрузите функцию
PHP:
protected function parseRow($r)
{
     $r['lastname'] = $this->lastnames[$r['lastname']];
}

и поидеи вуаля)

выводить также можно массивом
'editoptions' => array('value' => new jqGrid_Data_Value($this->lastnames))

Еще всплыл вопрос, хочу вызывать редактирование двойным щелчком по строке. подскажите как реализовать?

Если вы про inline-редактирование, то в массив opts нужно добавить
PHP:
ondblClickRow: function(id)
    {
        if(id && id!==lastsel)
        {
            $(this).jqGrid('restoreRow',lastsel);
            $(this).jqGrid('editRow',id,true);
            lastsel=id;
        }
    }
 
У кого-то уже была такая проблема.
Проверьте firebug'ом или просто вручную, какие JS-файлы не открываются. Они все внутри <head>.

Обратите внимание, что jQuery и jQuery UI берутся с CDN Яндекса. В прошлый раз полечилось отключением адских настроек безопасности, которые его блокировали.
Оказалось были ошибки в пути к js-файлам( я не правильно размещал файлы).

В примере "Группировка заголовков 2" заметил, что можно менять местами столбцы драг-дропом.Столбцы меняются местами, но не понятно что творится с заголовками столбцов(с шапкой таблицы)
qgrid2.png
. На скрине: поменял местами PRICE и QUANTITY.
Как можно это исправить?
 
нет я хотел бы чтобы появлялось стандарное окошко редактирования, но по двойному клику
PHP:
ondblClickRow: function(id)
{
    $(this).editGridRow(id);
}

По группировке - они там что-то меняют в последних версиях. Попробуйте использовать штатную.
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:groupingheadar
 
Всем привет!!! Ребят есть вопрос. Я использую для поиска данных в jqgrid панель поиска, такую же как приводили в примерах. Недостатком такого подхода является то, что я например не могу задать в фильтре дату за период с-по. Для решения проблемы я нарисовал на форме 2 поля с-по, которые планировал использовать в качестве фильтра в совокупности с уже существующими в гриде фильтрами. Подскажите каким образом я могу сделать так, чтобы по нажатию кнопки refresh грида значения полей передавались в форма где собсвенно происходит выборка:
$filter = $this->createFilter();// а тут собственно и обработать все то что приходит с формы

$this->query = "
SELECT {fields}
FROM call_oper c
LEFT JOIN `services` s ON (c.service_id=s.code)
WHERE {where} $filter
";

может подскажете другие варианты.
 
Выбор диапазона даты можно сделать через:
http://www.filamentgroup.com/lab/date_range_picker_using_jquery_ui_16_and_jquery_ui_css_framework/

Потом добавить тип поиска 'search_op' => 'date_range' и функцию:
PHP:
protected function searchOpDateRange($c, $val)
{
    $dates = explode(' - ', $val, 2);
    return $c['db'] . " BETWEEN '{$dates[0]}' AND '{$dates[1]}'";
}

$val уже escaped, но без кавычек.

Передать дополнительные данные при Refresh можно через событие serializeGridData.
PHP:
seraizlieGridData: function(data)
{
    data.foo = $('#foo').val();
    data.bar = $('#bar').val() ? 1 : 0;

    return data;
}

Чтобы что-то добавить в {where}, можно сделать так:
PHP:
protected function init()
{
    ...
    if(isset($this->input['foo']))
    {
        $this->where[] = 'foo=' . intval($this->input['foo']);
    }
}

Не обязательно init. Можно перегрузить search. Просто исторически сложилось, что с init потом проще разбираться.
Ну или можно назвать входящую переменную так же, как имя одной из колонок, и воспользоваться стандартным поисковым searchOp.
 
По итогам последних дней, откатились к самой первой версии передачи параметров в грид.
Она оказалось самой простой и понятной, хоть и содержит в себе потенциальную возможность выстрелить себе в ногу. :)

Сейчас функция render принимает один аргумент - массив с параметрами.
Они напрямую записываются в URL грида и, таким образом, сохраняются.

При рендеринге переданные параметры доступны в $this->render_data.
При других операциях - в общем $this->input ($_GET).

Например, отрендерили грид с параметром 'user_id' => '1' и колонкой с таким же именем.
Он будет отправлять запросы на URL: ?grid=myGrid&user_id=1
Поэтому будет фильтровать вывод: WHERE user_id='1'
И также добавит в апдейты: SET user_id='1'

Помним о том, что если параметр с таким же именем будет дополнительно передан через POST, то он перетрет значение из GET.
Возможно, для стороннего наблюдателя звучит сложно, но те, кто сталкивался, сразу поймет, о чем речь.
 
Здравствуйте,

Обновил версию, теперь всё время ошибка " Fatal error: Render data must be an array in <b>/home/local/info/grid/base/php/jqGrid.php on line 422" ,
где что мог забыть ?
 
Да, забыл сказать. :)
Если все было ок, то обновляться не нужно. Ничего принципиально нового не добавится.
А обратная совместимость потерялась еще примерно месяц назад.

Впрочем, касается это, в основном, функции render.
В двух словах:

Раньше было:
PHP:
$loader->render($grid_name, $extend, $suffix);

Теперь стало:
PHP:
$loader->render($grid_name, $data);

Extend теперь можно задать через $this->render_extend. Причина в том, что у 95% людей он все равно повторялся и всегда был одинаковым.
Suffix теперь возвращается из функции renderGridSuffix.

Если вы использовали общий адаптер для своих гридов, то можно добавить в него следующий код:
PHP:
public function render($extend=null, $suffix=null)
{
    $this->extend = $extend;
    $this->suffix = $suffix;

    return parent::render();
}

protected function renderComplete($data)
{
    $data['extend'] = $this->extend;
    $data['suffix'] = $this->suffix;

    return parent::renderComplete($data);
}
 
Подскажите, что должно стоять на сервере для нормального коннекта с mssql? на сервере работает zf через adapter PDO_MSSQL. Сама поддержка mssql для php - FreeTDS.
В jqGridPHP использую адаптер jqGrid_Adapter_Mssql - все время ошибка could not find driver.
 
Если ZF работает через PDO, то и jqGrid должен.

Попробуйте сделать простой скрипт:
PHP:
<?php
$pdo = new PDO($dsn, $username ... );
var_dump($pdo);

И на его примере подобрать подходящий DSN. Можно попытаться выдернуть его из ZendFramework.

Для начала, попробуйте такой формат:
PHP:
dblib:host=localhost;dbname=testdb
 
Еще пара вопросов:
1. при загрузке via ajax не рендерится грид.. Все сорсы загружаются, но $.jgrid is undefined или $("#accordion").accordion is not a function и т.п.. Должно ли работать нормально (у trirand.net такой функционал работает)?
2. как лучше решить вопрос работы с хранимой процедурой? Сейчас предусмотрен только обход массива параметров и преобразование его в цепочку для WHERE, а как быть с параметрами к процедуре?
 
Сверху