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

sirba

Новичок
Здравствуйте.
Можно ли чтобы значения фильтров в шапке грида были связанны между собой - например два столбца область , город. Выбрал область - грид обновился, но обновился также и фильтр со значением городов - только текущей области...
Спасибо.
 

fandm

Новичок
sirba,
Думаю Вам придётся самому реализовать код по обновлению select'а в шапке столбца "Город". Просто заблаговременно пристыкуйтесь к событию onchange select'а в шапке столбца "Область" (это можно сделать и через опцию dataInit в colModel) и на него выполняйте код, который через ajax-запрос вытащит соответствующий перечень городов и обновит перечень option'ов в select'е в шапке столбца "Город".
Но это моё мнение. Возможно, имеет смысл дождаться, что скажет уважаемый ~WR~.
 

Jnas

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

У меня почему то в субгриде $r['_class'] применяется только к первой строке...
к примеру пишу
PHP:
    		protected function parseRow($r)
			{
				$r['_class'] = array('doml' => 'green');
				return $r;
			}
и красится в зеленый цвет первая строка стобца doml . в чем может быть причина ?
 

Jnas

Новичок
красит только первую строку , все остальные строки остаются прежними
 

~WR~

Новичок
У всех рядов одинаковый primary_key? По умолчанию это первая колонка.
Выбор рядов по клику работает? Если тоже только первый ряд выбирает, то следует изменить запрос так, чтобы у каждого ряда был уникальный идентификатор.
 

Jnas

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

fandm

Новичок
Может кому-то пригодится. Если кто-то использует активно серию модальных диалогов jQuery UI Dialog, то наверняка столкнётся с тем, что сообщения об ошибках в jqGrid появляются под вашими диалогами, т.к. метод $.jgrid.info_dialog порождает диалог с zIndex=1000. Опцию zIndex можно передать свою. Я поступил так. В jqgrid-ext.js вместо строки:
PHP:
$.jgrid.info_dialog($.jgrid.errors.errcap,obj.error_msg,$.jgrid.edit.bClose);
написал:
PHP:
$.jgrid.info_dialog($.jgrid.errors.errcap,obj.error_msg,$.jgrid.edit.bClose,{zIndex: max_zIndex()+1});
Функция max_zIndex() - не моя, взял откуда-то из интернета:
PHP:
function max_zIndex(){
	var maxZ = Math.max.apply(null,$.map($('body > *'), function(e,n){
		   if($(e).css('position')=='absolute')
				return parseInt($(e).css('z-index'))||1 ;
		   })
	);
	return maxZ;
}
 

~WR~

Новичок
Странно конечно, что стандартные диалоги сами не пытаются вычислить максимальный z-index.
Если не лень разбираться с гитхабом - сделайте исправляющий коммит в сам jqGrid. Я уверен, что tony его примет.

Кстати, перегружать функции лучше через jQuery.extend, не касаясь исходных файлов.
PHP:
$.extend($.jgrid.ext, {
    errorHandler: function(..)
    {
        //мой обработчик ошибок
    }
});
В случае чего, не будет проблем с обновлениями.
 

fandm

Новичок
Кстати, перегружать функции лучше через jQuery.extend, не касаясь исходных файлов.
Да, согласен, некорректно поступил, что стал править jqgrid-ext.js, надо было уже свой заводить. :) Спасибо за подсказку как это лучше оформлять в коде. ;)

Если не лень разбираться с гитхабом
Честно? Ой как лень... Да и работы столько, что просто физически некогда...( Может Вы согласитесь это сделать? Просто от своего имени, главное, чтобы польза была. ;)
 

Malig

Новичок
Здравствуйте
Подскажите как сделать, чтобы по щелчку строки грида, открывалась другая страница с гридом, формирующимся по запросу согласно ID щелкнутой записи?
Делаю так:
Формирую ссылку с параметром:
PHP:
$selector = <<<ORDER
function(rowid, selected)
{
    $(".ggg").attr("href", "index.php?getID="+rowid);

}
ORDER;
$grid->setGridEvent('onSelectRow', $selector);
Потом делаю запрос:
PHP:
$getID = htmlspecialchars(addslashes($_GET['getID']));

$grid->SelectCommand = "
	SELECT *
	FROM table
        WHERE id = $getID
";
И не работает
 

Malig

Новичок
ну я имел ввиду сам плагин.
А эта строка мне в наследство досталась, вместе со скриптом, от предыдущего кодера
 

Sema

Новичок
Здравствуйте, подскажите пож-та, как можно передать параметр из страницы index на скрипт грида, чтобы использовать его в селекте.
 

~WR~

Новичок
Самый простой способ - использовать jqGridLoader как промежуточное звено.

В index.php
PHP:
$loader = new jqGridLoader;
...
$loader->set('my_param', 'foo');
$rendered_grid = $loader->render('my_grid');
В классе грида:
PHP:
$this->loader->get('my_param'); //foo
Обратите внимание, что параметр будет доступен только при рендеринге (действие render).
Чтобы параметр сохранялся и при получении данных, добавляем такое:
PHP:
protected function renderPostData()
{
    return array('my_param' => $this->loader->get('my_param');
}
У меня было много мыслей о том, чтобы это немного автоматизировать, но ни один из вариантов не покрывал всех ситуаций. Поэтому оставлено на откуп конкретному разработчику. Просто сделайте адаптер и двумя строчками определите в нем, как лично вам удобно передавать переменные.
 

Redjik

Джедай-мастер
Столкнулся со странным поведением

PHP:
 $this->query = "SELECT {fields} 
                        FROM dr_ree_price i
                            JOIN dr_ree b ON (i.LS_NUM=b.LS_NUM)
                            JOIN dr_usr o ON (i.USR_NUM=o.USR_NUM)
                        WHERE {where}
                        " ;
Запрос происходит 8 секунд, копирую оба запроса из json ответа, phpmyadmin их обрабатывает меньше чем за секунду - как и должно быть...
Еще дебажить целиком класс jqGrid не пробовал, есть идеи?
 

Redjik

Джедай-мастер
false alarm - на сервере некорректно работал microtime
phpmyadmin поэтому нагло врал
дело было во втором запросе с count
 

~WR~

Новичок
Я точно не помню, описано ли это в документации, но с медленными count-запросами можно чуть-чуть схитрить.
А именно, выполнять их без JOIN'ов, если это не изменит общее количество рядов, и если нет условий или сортировок на дополнительные таблицы.

Как-то так:
PHP:
$this->query = "
    SELECT {fields}
    FROM table_a a
        JOIN table_b b ON (a.id=b.id)
        JOIN ...
        JOIN ...
   WHERE {where}
";

$this->query_count = "
    SELECT {fields}
    FROM table_a a
    WHERE {where}
";
И, разумеется, можно брать count'ы из каких-нибудь внешних счетчиков, мемкешей и т.д. Примерно так:
PHP:
protected function setRowCount($count=null)
{
    $count = myCounter::getCount();
    parent::setRowCount($count);
}
parent нужно звать затем, чтобы посчитались всякие производные величины, вроде общего количества страниц.
 
Сверху