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

sirba

Новичок
Подскажите пожалуйста - как можно , зная id записи в гриде ,перейти на эту запись и ее выделить, то есть эта запись может быть на любой странице
 

~WR~

Новичок
Подскажите пожалуйста - как можно , зная id записи в гриде ,перейти на эту запись и ее выделить, то есть эта запись может быть на любой странице
Есть у меня такая функция, но она написана специально для работы только с PostgreSQL, поэтому не включена в public-версию.

Для MySQL реализация будет примерно такая.

Создаем новую custom-операцию:
http://jqgrid-php.net/doku.php?id=wiki:oper-custom

В ней ищем, в каком ряду относительно других находится строка с нашим id.
Номер ряда в MySQL получают как-то так: http://snippets.dzone.com/posts/show/6831
Вычисляем, на какой странице будет эта строка, возвращаем номер страницы клиенту.

На клиенте напрямую выставляем пришедший номер страницы: .setGridParam('page', page);
Перезагружаем грид: .trigger('reloadGrid');
После перезагрузки выделяем ряд с нужным id через .setSelection.
 

sirba

Новичок
Спасибо.....Еще один вопрос - можно ли в зависимости от значения одного поля раскрасить всю строку. Заранее спасибо за ответ
 

fandm

Новичок
можно ли в зависимости от значения одного поля раскрасить всю строку.
Можно, это делается в parseRow. Например
PHP:
		if($r['myfield'] == 1) {
			$r['_class'] = 'red';
		}
,
где red- это класс из jqgrid-ext.css.

Добавлю. Чтобы отработал parseRow, необходимо соблюсти одно условие. Например, ранее я писал свой вариант.
 

fandm

Новичок
~WR~,
день добрый!
А у меня такой вопрос. А если мне необходимо в opEdit выполнить свой updateSQL (OraScript), для Oracle, аля:
PHP:
declare 
...
begin
...
серия DML-операций
...
end;
да ещё и параметризованный?
Нужно что-то с bind-ингом параметров. Это надо адаптер для Oracle дописать самому, да?

И, получается, по вызовам stored procedures тот же вопрос.
 

~WR~

Новичок
Да, совершенно правильно. Такие вещи следует дописывать самостоятельно.

Логика тут следующая. jqGridPHP не ставит перед собой цель написать идеальную обертку для работы с БД. У него другая задача.

Предполагается, что если вообще возникла необходимость сделать что-то сложное, значит у вас уже есть какие-то наработки в этом направлении. Будь то ваш любимый фреймворк, ORM, dbSimple, что угодно. И вы можете просто всё это напрямую использовать.

Через jqGridLoader можно передать ссылки на любые объекты вашего приложения.
Подключайте свой autoloader и пользуйтесь статическими методами.

Можно также написать драйвер для jqGrid_DB, который будет всё перенаправлять в ваши функции. В которых пишутся логи так, как вам надо. Которые работают с транзакциями так, как вам хочется.

По сути, стандартные драйверы преследуют только одну цель - реализовать простейший функционал и дать идею о том, что с ним можно сделать дальше. Если посмотреть код - каждый из них занимает по 50 строк. :)
 

~WR~

Новичок
Информация по раскраске рядов и ячеек:
http://jqgrid-php.net/doku.php?id=wiki:client-color

Единственное, обратите внимание на то, как прописаны классы цветов в jqgrid-ext.css
PHP:
.ui-jqgrid .red { background: #FFCCCC; }
Вот этот .ui-jqgrid в начале обязателен, иначе его "перебьет" стандартный стиль.
Firebug вам в помощь. jqGridPHP только классы добавляет, а дальше уже чистая магия css.
 

sirba

Новичок
Если у меня есть грид, в поиске выпадающий селект(фильтр) например "Все, Активные,Неактивные" можно ли грузить грид с уже определенным значением - например сразу фильтр стоит "Активные" и в гриде уже отфильтрованные записи, а при смене фильтра все варианты доступны также..Спасибо
 

~WR~

Новичок
например сразу фильтр стоит "Активные"
Скорее всего, сработает вот это:
PHP:
'searchoptions' => array('value' => $my_values, 'defaultValue' => 1);
В defaultValue указываем ключ того значения, которое должно быть выбрано по умолчанию.

Сразу отфильтровать чуть сложнее, потому что первая загрузка у них всегда идет без поиска.
Самый простой вариант:
PHP:
public function output()
{
    if($this->input('_search') !== 'true')
    {
        $this->input['status'] = 1;
    }

    parent::output();
}
Этим мы говорим, что если запросили вывод рядов для грида, и при этом не использовался поиск, то делаем вид, что к нам якобы пришло условие status => 1. Есть еще варианты, но они чуть подлиннее.
 
  • Like
Реакции: jjsf

fandm

Новичок
А я всё-таки решил вписывать условие фильтра в нужный столбец сразу после загрузки грида, а потом делать $grid[0].triggerToolbar(); По крайней мере такой подход получился более универсальным. Сделал функцию аля SetFilter, в кот. передаю к какому столбцу применить фильтр и, собственно, само условие и никаких подготовительных работ делать не надо, можно применить любой фильтр по любому столбцу(ам).
Ну, а если у столбца в toolbar-е не <input type=text>, а select, то тогда чуть по-другому, надо указать selected item, а уже затем - $grid[0].triggerToolbar();.
Если заинтересует такой подход, то опишу более детально.
 

sirba

Новичок
И снова здравствуйте.... Как можно на добавленную кнопку в pagere повесить простую ссылку
PHP:
$grid.jqGrid("navButtonAdd", pager, 
{
    caption : "Добавить", 
    title   : "Добавить", 
    icon    : "ui-icon-circle-plus",    
    onClickButton: function()
    {
 ....
    }
});
 
  • Like
Реакции: jjsf

fandm

Новичок
~WR~
День добрый!

Такой вопрос. А можно как-то из opEdit вернуть некий флаг успешности/неуспешности выполнения операции? Ну, т.е., последовательность действий:
1. Есть грид.
2. Нажимаем кнопку редактирования записи
3. Редактируем
4. Нажимаем "Принять"
5. Выполняется opEdit на серверной стороне
6. Возникает некая ошибка, выводится сообщение об ошибке через throw new jqGrid_Exception_DB, тут понятно
7. И тут хотелось бы не просто, чтобы выводилось сообщение об ошибке, а на клиенте выполнилось некое дополнительное действие в связи с ошибкой (например, открыть диалог редактирования записи снова и сфокусироваться на поле с ошибкой или как-то воспрепятствовать закрытию диалога или что-то в этом роде). Т.е., нужен некий возврат успешности/неуспешности от opEdit.

Стандартными средствами это можно как-то реализовать?
 

~WR~

Новичок
По идее, когда выбрасывается исключение - на клиент уходит полная информация о нем.
Далее в jqgrid-ext.js повешен маленький обработчик, который и отвечает за текущий вывод исключений.

Его можно заменить на свой. Просто определите свою функцию afterSubmit.

Если нужна какая-то обработка на стороне сервера, то можно перегрузить функцию catchException.
Она ловит все jqGrid_Exception'ы и отвечает за их вывод. Можно как поменять вывод на свой, так и сделать какие-то свои дополнительные действия. Например, записать что-то в лог.

Выделять конкретный exception лучше всего по его коду.
 

fandm

Новичок
Просто определите свою функцию afterSubmit.
Да, я уже увидел, спасибо. Единственное, если я правильно понял, то afterSubmit отработает только при успешной операции, т.е. если Status == "success" (ну, т.е., в JSON-ответе success = 1).
Но, в принципе, подходит и такой вариант. Если операция была успешной, значит на afterSubmit можно смело делать закрытие диалога, а если неуспешной, то и закрытие, соответственно, не произойдёт. :)
 
Сверху