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 из-за несоответствия аргументов при перегрузке функции.

Документация обновится в ближайшее время.
 

~WR~

Новичок
Обновились еще раз. Теперь точно всё.

У 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
 

jjsf

Новичок
Просто запустите /examples/install.php, предварительно настроив config.php
Будет создана тестовая база со случайными значениями. Генератор сделан для MySQL.
установил jqgridPHP
Запустил install.php (в базе создались таблицы)

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

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

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

Вложения

  • 396,1 KB Просмотры: 8

~WR~

Новичок
У кого-то уже была такая проблема.
Проверьте firebug'ом или просто вручную, какие JS-файлы не открываются. Они все внутри <head>.

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

o-sport

Новичок
Пожскажите, заметил на одном из скриншов синхронизацию. расскажите как реализовано?
 

o-sport

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


Еще непонятки:)
запускаю
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 не подставляется.
что не так делаю?
 

yadenis

Новичок
в редактировнии все верно значение в базе 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;
        }
    }
 

jjsf

Новичок
У кого-то уже была такая проблема.
Проверьте firebug'ом или просто вручную, какие JS-файлы не открываются. Они все внутри <head>.

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

В примере "Группировка заголовков 2" заметил, что можно менять местами столбцы драг-дропом.Столбцы меняются местами, но не понятно что творится с заголовками столбцов(с шапкой таблицы)
. На скрине: поменял местами PRICE и QUANTITY.
Как можно это исправить?
 

~WR~

Новичок
нет я хотел бы чтобы появлялось стандарное окошко редактирования, но по двойному клику
PHP:
ondblClickRow: function(id)
{
    $(this).editGridRow(id);
}
По группировке - они там что-то меняют в последних версиях. Попробуйте использовать штатную.
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:groupingheadar
 

aurewa

Новичок
Всем привет!!! Ребят есть вопрос. Я использую для поиска данных в 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
";

может подскажете другие варианты.
 

~WR~

Новичок
Выбор диапазона даты можно сделать через:
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.
 

~WR~

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

Сейчас функция 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.
Возможно, для стороннего наблюдателя звучит сложно, но те, кто сталкивался, сразу поймет, о чем речь.
 

Jnas

Новичок
Здравствуйте,

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

~WR~

Новичок
Да, забыл сказать. :)
Если все было ок, то обновляться не нужно. Ничего принципиально нового не добавится.
А обратная совместимость потерялась еще примерно месяц назад.

Впрочем, касается это, в основном, функции 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);
}
 

Alexey_Ro

Новичок
Подскажите, что должно стоять на сервере для нормального коннекта с mssql? на сервере работает zf через adapter PDO_MSSQL. Сама поддержка mssql для php - FreeTDS.
В jqGridPHP использую адаптер jqGrid_Adapter_Mssql - все время ошибка could not find driver.
 

~WR~

Новичок
Если ZF работает через PDO, то и jqGrid должен.

Попробуйте сделать простой скрипт:
PHP:
<?php
$pdo = new PDO($dsn, $username ... );
var_dump($pdo);
И на его примере подобрать подходящий DSN. Можно попытаться выдернуть его из ZendFramework.

Для начала, попробуйте такой формат:
PHP:
dblib:host=localhost;dbname=testdb
 

Alexey_Ro

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