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

  • Автор темы Автор темы ~WR~
  • Дата начала Дата начала
А еще, используя тот же PostgreSQL или MSSQL, можно сцепить воедино и rows и count запросы.
В некоторых случаях, использование window-функций дает прирост производительности.

1. Выключаем обычный count:
PHP:
$this->do_count = false;

2. Дополняем {fields} для rows запроса таким образом, чтобы в него добавлялись aggregate'ы.
PHP:
protected function buildFields($cols)
{
    $cols = parent::buildFields($cols);
    $cols .= ', count(*) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS _count';
    
    return $cols;
}

3. Подставляем получившееся значение count'а в $this->agg:
PHP:
protected function parseRow($r)
{
    $this->agg['_count'] = $r['_count'];
    unset($r['_count']);

    return $r;
}

4. Profit! Все работает в один запрос.

Не бойтесь экспериментировать, если что-то работает не так, как хочется. Количество зависимостей в коде постарались сократить до минимума.
 
Здравствуйте. Насчет загрузки с помощью ajaxFormProxy. Данные добавляются и удаляются нормально, а редактирование работает только для поля с картинкой, остальные поля не сохраняют изменения. Это я что-то делаю не так или это нормальное поведение? :-) Если нормальное, то можно как-то это обойти?
Спасибо.
 
Здесь вроде работает:
http://jqgrid-php.net/examples/?render=jqOperUpload

Можете вынести в интернет пример, в котором не работает?
Если после добавления нажать F5 и только после этого попробовать отредактировать - тоже не сработает?
 
Немного некорректно задал вопрос.
Если изменения внести вместе с загрузкой картинки то да, все изменяется. А если просто изменить описание (в примере это "Comment"), то изменения не сохраняются.
 
Понял. Ajax form не хочет отправлять форму без активных input'ов, даже если data заполнено.
Надо выбрасывать сторонние плагины и делать свою версию.

Сегодня-завтра посмотрю.
 
Залил обновление. Теперь iframe включается только в том случае, если есть хотя бы один файл для загрузки.
 
Перекачал. Но у меня всё осталось также :-(. Ну и у Вас в примере тоже.
 
Да действительно Ваш пример заработал, хотя вроде первым делом сбросил кеш когда проверял... У меня правда всё равно не заработало )) Буду разбираться почему. Спасибо за обновление :-)
 
Подскажите пожалуйста такой момент.
Создал две таблицы Контакт и Контактная информация, сделал их вложенными. Контактная информация вложена в Контакт.
Возможно ли заполнять в таком случае подчиненную таблицу?
Т.е. я хочу раскрыв Контакт начать добавлять во вложенную таблицу записи.

Делал как в этом примере http://jqgrid-php.net/examples/?render=jqMiscSubgrid
Данные вставляются, но не заполняется привязка по внешнему ключу и почему-то только значение одного из двух заполненных полей.
 

Вложения

  • Ashampoo_Snap_2012.04.17_22h35m12s_001_.png
    Ashampoo_Snap_2012.04.17_22h35m12s_001_.png
    27,2 KB · Просмотры: 35
Уважаемый ~WR~, расскажите пож-та как раскрасить строки, как в вашем примере в первых постах.
 
Примерно так:
PHP:
protected function parseRow($r)
{
    $r['_class'] = array('col1' => 'red', 'col2' => 'green');
    return $r;
}

Вместо 'col1' и 'col2' - имена колонок, которые красить.

'red' и 'green' - имена стандартных классов с цветами. Можно свои добавить.
Посмотрите, как они в CSS прописаны, чтобы не конфликтовали с выделением строки.
 
  • Like
Реакции: jjsf
Добрый день Уважаемый WR.
Подскажите есть ли возможность в jqGrid сделать сортировку данных нескольких стобцов?
А именно - есть таблица бомбардиров (хоккей) - 4 значения (игрок, пас, гол, очки). Хочется сделать сортировку соответственно по очкам, затем при равенстве очков по голам, затем при равенстве того и другого по фамилиям.
Спасибо.
 
Да. Перегружаем функцию, которая отвечает за сбор кусочка запроса с ORDER BY.
PHP:
protected function buildOrderBy($sidx, $sord)
{
    return "ORDER BY score DESC, goals DESC, name ASC";
}

В аргументах $sidx и $sord - параметры сортировки, которые пришли в запросе со стороны клиента.
С той разницей, что они всегда "чистые". $sidx не нужно escape'ить, а в $sord обязательно будет либо 'asc', либо 'desc'.
Используя их, можно динамически формировать любую сортировку.

Вот еще пример:
http://jqgrid-php.net/examples/?render=jqOutSort
 
Подскажите пожалуйста такой момент.
Создал две таблицы Контакт и Контактная информация, сделал их вложенными. Контактная информация вложена в Контакт.
Возможно ли заполнять в таком случае подчиненную таблицу?
Т.е. я хочу раскрыв Контакт начать добавлять во вложенную таблицу записи.
вот здесь был ответ
 
~WR~, подскажите, пожалуйста. Имею вложенную таблицу, в которой есть поле для загрузки файла, соответственно выставляю опции
PHP:
$this->options = array(
			'editurl' => NULL,
			'dataProxy' => '$.jgrid.ext.ajaxFormProxy',
		);
При редактировании или добавлении записей во вложенную таблицу возникает ошибка "URL не установлен". Я предполагаю, что оно не понимает, что данные нужно направить через прокси, это как-то можно реализовать?
 
Примерно так:
PHP:
protected function parseRow($r)
{
    $r['_class'] = array('col1' => 'red', 'col2' => 'green');
    return $r;
}

Вместо 'col1' и 'col2' - имена колонок, которые красить.

'red' и 'green' - имена стандартных классов с цветами. Можно свои добавить.
Посмотрите, как они в CSS прописаны, чтобы не конфликтовали с выделением строки.

Спасибо за скорый ответ.

Прописал в parseRow($r), строки не красились. Далее добавил extHighlight и возникла проблема. Грид серый, не активный, постоянно висит индикация загрузки. Стало так после того как прописал следующее
PHP:
'gridComplete' : function()
    {
        $(this).jqGrid('extHighlight');
    }

Может подскажете, в чем может быть проблема?
 
Должно быть:
PHP:
'dataProxy' => new jqGrid_Data_Raw('$.jgrid.ext.ajaxFormProxy'),
- если хочется указывать такие опции через php. Иначе он передает параметр как строку.

Если такое нужно очень часто, то можно объявить какую-нибудь функцию:
PHP:
protected function raw($val)
{
    return new jqGrid_Data_Raw($val);
}
PHP:
'dataProxy' => $this->raw('$.jgrid.ext.ajaxFormProxy');

Sema
Посмотрите консоль ошибок javascript. Там обязательно что-нибудь будет.
 
Сверху