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

~WR~

Новичок
Если undefined, значит скрипты не подгружаются. Проверьте по firebug.
Запрос можно собирать самостоятельно через $this->query.

По процедурам - можно оператор поиска добавить.
PHP:
$this->cols['foo']['serach_op'] = 'foo';
...
...
protected function searchOpFoo($c, $val)
{
    return "foo('$val', 'param1', 'param2') IS TRUE";
}
Что searchOp* вернет, то и запишется в условие.
 

Navern

Новичок
Как связать две таблицы.?По примеру Master Detail
trirand.com/blog/jqgrid/jqgrid.html
Advanced->Master Detail
 

~WR~

Новичок
Добавить к мастеру:
PHP:
onSelectRow(id): function(id)
{
    $('#detail').trigger('reloadGrid', {page: 1});
}
Добавить к деталям:
PHP:
serializeGridData(data)
{
    data.user_id = $('#master').jqGrid('getGridParam', 'selrow');
    return data;
}

При любом обновлении таблицы деталей на сервер будет посылаться параметр 'user_id', соответствующий id выбранного ряда в таблице мастер.
Если у деталей есть колонка с таким же именем, то фильтрация сработает автоматически. Иначе можно вручную добавить условие:
PHP:
protected function search()
{
    parent::search();
    $this->where[] = 'user_id='. intval($this->input('user_id'));
}
 

Alexey_Ro

Новичок
От хранимок отказался, пока хватило вьюх - весь функционал отлично работает.
Загрузить грид аяксом так и не получается - все файлы подгружаются, но что-то мешает включиться в DOM.
Кстати, на странице описания использован именно фрейм http://jqgrid-php.net/doku.php Есть возможность показать работу с загрузкой по ajax?
Поправил ошибку с залочиванием грида при экспорте в Excel в IE.
В Opera тоже лочится (

По поводу вывода итоговых значений - рабочего примера с агрегатором нет...:
Далее включаем footerRow как в этом примере:
http://jqgrid-php.net/examples/?render=jqCols
Обнаружился момент, связанный с кодировками: у меня база на win1251, поэтому я все скрипты тоже сделал windows1251. Но если в гриде поиск like по запросу кириллицей нормально отрабатывает, то при экспорте в эксель - только заголовки колонок попадают. Почему так может быть?

Еще просьба - прикрутить в одном из примеров к колонке дат поиск по дате с контролом date picker.
 

~WR~

Новичок
В Opera тоже лочится (
Поправил. Не понимаю браузеры, которым жалко отдать событие load на загрузку iframe.

Насчет ajax'а. Лучше всего, если будет возвращаться кусочек html'ки, собранный по тем же правилам, что и для обычной страницы.
А именно, результат работы функции render внутри тегов <script>.

Еще в старой версии по умолчанию использовалось добавление элементов на страницу через document.write.
Можно проверить по переменной $render_html, которая НЕ должна иметь значение 'js'.

Еще может быть такая проблема, что id самого грида - не уникальное. В этом случае следует генерировать суффикс.
В старой версии это делалось через аргумент $suffix функции render.
В более новых - через функцию renderGridSuffix.

Обнаружился момент, связанный с кодировками
Помню, раньше была подобная проблема. Причина её заключалась в том, что запрос на экспорт происходит через iframe.
При этом не появляется заголовок $_SERVER['HTTP_X_REQUESTED_WITH']. И поэтому не происходит конвертирования входящих данных из utf-8 в win-1251.

Попробуйте поискать строку:
PHP:
if($this->loader->get('encoding') != 'utf-8' and isset($_SERVER['HTTP_X_REQUESTED_WITH']))
И заменить на:
PHP:
if($this->loader->get('encoding') != 'utf-8')

Еще просьба - прикрутить в одном из примеров к колонке дат поиск по дате с контролом date picker.
Вот тут вроде было: http://jqgrid-php.net/examples/?render=jqPmdb
Кодом примерно так:
PHP:
'searchoptions' => array('dataInit' => new jqGrid_Data_Raw("function(el){ $(el).datepicker({dateFormat: 'yy-mm-dd'})}"));
Здесь очень удобно какую-нибудь обертку сделать, чтобы она генерила datepicker с нужными вам форматами и событиями.
 

~WR~

Новичок
1. Пример подгрузки ajax'ом в диалоговом окне.
http://jqgrid-php.net/examples/?render=jqMiscAjaxDialog

Обратите внимание, что инициализировать грид нужно в тот момент, когда базовый <table> уже вставлен в DOM-дерево.
После закрытия диалога, его содержимое желательно очищать через .dialog('destroy') + .remove(). Иначе замучают проблемы со скрытыми дублями элементов.

Также в jQuery используется хитрый способ обработки тегов <script> которые добавляются на страницу через $.html(). На самом деле, все скрипты оттуда вырезаются и выполняются в глобальном контексте.
В 99% случаев это не должно быть проблемой. Но, в теории, может воспрепятствовать корректному выполнению особо хитрых скриптов.

2. Пример работы с датами.
http://jqgrid-php.net/examples/?render=jqMiscDatepickers

Показывает как простой datepicker, так и daterangepicker.
Таймер в JS нужен для того, чтобы обойти двойной вызов события onChange при выборе произвольного промежутка.

Вообще, вариантов работы с датами великое множество, но от этого можно танцевать при разработке своих.
Если будете пробовать у себя, то последнюю range picker'а следует забрать отсюда:
http://www.filamentgroup.com/lab/date_range_picker_using_jquery_ui_16_and_jquery_ui_css_framework/
 

jjsf

Новичок
1)В этом примере http://jqgrid-php.net/examples/?render=jqWelcome почтовые адреса кликабельные(в коде: 'formatter' => 'email' ) .
Как сделать ссылки кликабельными ? может уже имеется какой нибудь formatter ? Как создавать/собирать ссылки?

2)Над всеми столбцами имеется input поиска по столбцу. А можно ли сделать "общий input" , (поиск по всем столбцам)?
 

~WR~

Новичок
Как сделать ссылки кликабельными ? может уже имеется какой нибудь formatter ? Как создавать/собирать ссылки?
Есть встроенный showlink, но он не особо удобен:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:predefined_formatter

Я сделал свой, но не припомню, чтобы документировал.

Использовать примерно так:
PHP:
'my_link_col' => array(
    ...
    'formatter'     => 'ext_link',
    'formatoptions' => array('href'   => 'http://microsoft.com/?user_id={user_id}',
                             'class'  => 'user-link',
                             'target' => '_blank',
                             ),
),
В параметре href можно указывать плейсхолдеры в фигурных скобках, и они будут заменяться на значения соответствующих колонок.
В примере вместо {user_id} будет подставлено значение колонки user_id из текущего ряда. Колонки с источниками для замены можно прятать через hidden.

Класс удобен для bind'а особых событий через delegate. Например, "открыть диалоговое окно".

2)Над всеми столбцами имеется input поиска по столбцу. А можно ли сделать "общий input" , (поиск по всем столбцам)?
Можно.
Создайте input, передавайте его значение на сервер через событие serializeGridData.
На сервере разбирайте и превращайте в условие вида (id='a' OR name='a' OR foo='a')

В нормальных базах, типа Postgresql, можно искать сразу по всем колонкам.
http://www.depesz.com/2010/06/24/tips-n-tricks-looking-for-value-in-all-columns-of-a-table/

Правда, обычно это плохая идея. :)
 

jjsf

Новичок
Ссылки работают,спасибо!
а вот с поиском не разобрался. можете сделать пример?
 

klev2004

Новичок
Помогите разобраться с проблемой:
$loader->output('test'); - выводит содержимое полей таблицы в формате json
echo $rendered_grid = $loader->render('test'); - выводит пустую таблицу
Почему таблица пустая?
 

~WR~

Новичок
можете сделать пример?
Могу, но я слишком ленив, и здесь лучше самому попробовать.
Один раз поняв, как это работает, вы сразу сможете самостоятельно делать куда более сложные вещи.

Почему таблица пустая?
Всё правильно. Render создает пустую таблицу, которая потом сама обращается к серверу и хочет получить результат из output (JSON с данными).
Обращается она на URL, который получает из функции renderGridUrl. Можно firebug'ом посмотреть, куда идет запрос.

В классе jqGridLoader есть функция autorun, которая содержит пример простейшего "контроллера".
 

klev2004

Новичок
Разобрался.
В классе указал путь к скрипту, который должен возвращать json в таблицу.

PHP:
class test extends jqGrid
{
    protected function init()
    {
        $this->table = 'tbl_customer';
        $this->base_url = 'core/functions.php'; // base_url можно указывать явно
        $this->cols = array(
            'id'          => array('label' => 'ID',
                                   'width' => 10,
                                   'align' => 'center',
                                   ),
...
 

4aki.zp

Новичок
Доброго времени суток.
Может кто знает либо сталкивался, такой вопрос:
При редактировании записи выдает ошибку "parsererror Status: 'OK'. Error code: 200", в таблице все меняет нормально, но что б увидить надо обновить таблицу... и еще проблема в том что после изменения (нажатия кнопки "Сохранить") данных автоматически не исчезает окно редактирования.

Понял что ошибка синтаксическая, но в каком месте искать не пойму, может глаз замыленный, но я не вижу ничего.
 

~WR~

Новичок
Посмотрите через firebug, что конкретно возвращается от сервера.
Скорее всего, там какой-нибудь notice из php.
 

klev2004

Новичок
На локалке собрал все как мне нужно было, перенес на хостинг, предварительно проверив наличие pdo драйвера для mysql.
Выскочила такая ошибка: Fatal error: Class 'jqGrid_DB_PDO' not found in /var/www/brba/data/www/site.ru/engine/jqGridPHP/jqGridLoader.php on line 126
Сначала грешил на неправильно прописанные настройки коннекта к БД. Умышленно на локалхосте изменил настройки, там эта ошибка не появилась, просто загрузилась страница без информации.
Подскажите в чем может быть проблема.

UPD:
Для Debian можно попробовать такое решение:
$dbh = new PDO("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=$DB_NAME", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); // using persistent connections
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 

4aki.zp

Новичок
Посмотрите через firebug, что конкретно возвращается от сервера.
Скорее всего, там какой-нибудь notice из php.
Посмотрел через firebug в firefox , так в Мозилле все работает отлично, а вот Опера и Хром как то не понимает.

Хотел показать что написано в editurl: *.php, пока копировал заметил:
При выводе данных было написано
PHP:
header("Content-type: text/xml;charset=utf-8");
а я то использую Json
PHP:
header("Content-type: text/json;charset=utf-8");
так все в порядке

Изивините за невнимательность и глупый вопрос, спасибо что ответили :)

И еще один вопрос, как сделать так что бы при нажатии на кнопку "сохранить" окно редактирования скрывалось?
 

newzen

Новичок
Thanks for your work,


Hello, zorry i dont write rusian :)

if the query contain
GROUP BY
the total pages of the grid is not well counted.

adding

jqGrid.php, around line 755 on protected function getDataAgg() added

if ( strpos($query,"GROUP BY") !== FALSE )
$query = "select count(*) as _count from ( " . $query . ") as _count;";

make the trick.

Im not expert on php, you can do a better work with this information

greetings.
 

~WR~

Новичок
И еще один вопрос, как сделать так что бы при нажатии на кнопку "сохранить" окно редактирования скрывалось?
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing
Тут есть опции 'closeAfterAdd' и 'closeAfterEdit'. Их можно задать через 'navGrid' (prmEdit - вроде есть в примерах).
Но еще лучше, если это нужно для всех ваших гридов, изменить значение по умолчанию:
PHP:
$.jgrid.edit.closeAfterAdd = true;
$.jgrid.edit.closeAfterEdit = true;
Добавьте это куда-нибудь в <head>, после подключения js'ов, но до грида.

newzen
This example should help you:
http://jqgrid-php.net/examples/?render=jqOutComplex

In short: you should wrap your query with GROUP BY in higher level query.
PHP:
$this->query = "
    SELECT {fields}
    FROM (
        SELECT id, name, foo, bar, sum(price) AS price
        FROM {$this->table}
        GROUP BY id, name, foo, bar
    ) a
    WHERE {where}
";
You will get full grid functionality that way. Correct pagination, sorting and filtering by all comumns.
 

4aki.zp

Новичок
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing
Тут есть опции 'closeAfterAdd' и 'closeAfterEdit'. Их можно задать через 'navGrid' (prmEdit - вроде есть в примерах).
Но еще лучше, если это нужно для всех ваших гридов, изменить значение по умолчанию:
PHP:
$.jgrid.edit.closeAfterAdd = true;
$.jgrid.edit.closeAfterEdit = true;
Добавьте это куда-нибудь в <head>, после подключения js'ов, но до грида.
Спасибо помогло, и к этому времени новый вопрос, долго уже мучаюсь что делать не знаю.
Пытаюсь организовать поиск через toolbarSearch, но мне надо что бы он составлял запросы (желательно регистронезависимый) и все делал через БД в mySql.
Искал, читал. Создается впечатление что это не возможно, но все же надеюсь. Нашел вариант который как бы ищет, но только локально т.е. при включенном
PHP:
loadonce:true
. ну а так получается что я потом не могу редакьтровать БД.
Спасибо огромное за помощь
 
Сверху