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

~WR~

Новичок
BeerDrinkings, надо еще событие добавить.

Как-то так:
PHP:
.dialog({
    open: function() {
		$grid.extRequest({
			oper: 'get_city_list',
			letter: 'a'
		}, {
			success: function(ret) {
				$('#gs_sel2 OPTIONS').remove();

				for(var i in ret.list){
					$('#gs_sel2').append(ret.list[i].city_name);
				}
			}
		});
	}
});
extRequest - обертка на $.ajax. По сути, это то же самое, что:
PHP:
$.getJSON($grid.getGridParam('url'), {oper: 'get_city_list', letter: 'a'}, function(ret){ ... success ... });
Только еще содержит всякие штуки, относящиеся к гридам. Например, перегружать ли грид после реквеста, сохранять ли выделением, лочить ли таблицу и т.п.
 

BeerDrinkings

Новичок
Спасибо. Сейчас попробуем...

Да, действительно, после того как проставил все скобочки правильно, вывелись данные в <select>.
Если в это окно надо в цикле организовать вывод литеральных кнопок, то тоже с помощью
$grid.extRequest сделать можно, или лучше как-то по другому?
 

Nole

Новичок
Здравствуйте. Как при загрузке грида по умолчанию выбирать (подсвечивать)
первую строчку.
 

~WR~

Новичок
Очень просто. :)

PHP:
$grid.bind('jqGridGridComplete', function()
{
    var first_id = $(this).find('TR.jqgrow:first').attr('id'); //получили id первого ряда
    $(this).setSelection(first_id); //выбрали ряд по id
});
 

AleXKaN

Новичок
Подскажите пожалуйста, как при сохранении новой строки включить в SQL-запрос дополнительные данные. Т.е. мне нужно чтобы при сохранении данных, в базу данных сохранялась еще и текущая дата редактирования/добавления записи, а также, желательно, выполнялся дополнительный запрос на сохранение лога в другую таблицу.
И еще, как можно увеличить размер полей для редактирования в форме редактирования/добавления записи.
 

AleXKaN

Новичок
С включением дополнительных данных разобрался так:
PHP:
protected function opEdit($id,$data)
{
$data['col1'] = date("Y-m-d",time());
$response=parent::opEdit($id,$data);
return $response;
}
Но при добавлении данных с этим кодом:
PHP:
Protected function opAdd($data)
{
$data['col1'] = 'value';
$response = parent::opAdd($data);
return $response;
}
добавляет только определенные в этой функции данные игнорируя то что в форме добавления записи.

И остался вопрос как поменять ширину,высоту контролов в форме редактирования/изменения записи
 

AleXKaN

Новичок
С размерами контролов разобрался:
для нужной колонки определяю editoptions
PHP:
'editoptions' => array('style' => 'width:200px; height:100px;',),
Пока не ясно как выполнить свой INSERT в другую таблицу при обновлении/добавлении записи
 

~WR~

Новичок
PHP:
protected function opAdd($ins)
{
    //insert в основную таблицу
    $result = parent::opAdd($ins);

    //insert еще куда-нибудь
    $this->DB->insert('table_name', array('foo' => 'bar'));

    return $result;
}
Все пришедшие в запросе данные в чистом виде живут в массиве $this->request.
 

AleXKaN

Новичок
А почему, если я пишу
PHP:
protected function opEdit($id,$data)
{
global $_NAMES;
$data['col1'] = date("Y-m-d",time());
$data['col2'] = $_NAMES[$_SERVER['REMOTE_ADDR']];
$response=parent::opEdit($id,$data);
//insert еще куда-нибудь
$this->DB->insert('table_name', array('foo' => 'bar'));
return $response;
}
обновляет только указанные в коде col1,col2 колонки
 

~WR~

Новичок
В $data попадают только те параметры, имена которых пересекаются с именами колонок.
Иначе бы в базу сохранялись переменные типа oper, jqgrid и прочий технический треш.
 

AleXKaN

Новичок
Простите за глупый вопрос, просто я описал в функции opEdit столбцы, которые хочу изменять програмно, а остальные мне нужно чтобы передались как их отредактировал пользователь, но получается что в $data попадают только col1, col2, хотя в таблице есть еще и столбцы col3-col5. И изменяются в итоге, только столбцы col1, col2. Как мне передать остальные столбцы так, как их отредактировал пользователь.
UPD:
Сделал так:
PHP:
$data = array(
...
'col3' => $_REQUEST['col3']
...
Так сделал для всех оставшихся столбцов. Это правильно?
 

AleXKaN

Новичок
Все получилось и прекрасно работает, спасибо ~WR~ за его труд.
А как можно после добавления записи выделить добавленную строку в гриде, ибо если много pager, то не хочется листать в конец чтобы посмотреть добавленное.
 

Nekton

Новичок
Все получилось и прекрасно работает, спасибо ~WR~ за его труд.
А как можно после добавления записи выделить добавленную строку в гриде, ибо если много pager, то не хочется листать в конец чтобы посмотреть добавленное.
Здесь уже обсуждалось.
 

Spyke

Новичок
~WR~, спасибо за прекрасную библиотеку. Подскажи пожалуйста, как передать selarrrow (естественно при использовании multiselect) в свой opEdit или opAdd. В твоем примере "Пользовательские операции" на сайте ты используешь свой extRequest. Т.е. придется расширять editGridRow? Подскажи, как сделать наиболее красиво и кратко.

UPDATED:
Всё, на что хватило фантазии пока.(
PHP:
			$grid.bind("jqGridAddEditBeforeInitData", function(e, $form, type) {
				var arrrow = $grid.jqGrid("getGridParam", "selarrrow");
				/* и ниже что-то вроде такого */
				$grid.jqGrid("setGridParam", {postData: {"selrow": arrrow}});
				$(this).trigger("reloadGrid");
			});
UPDATED:
Подсмотрев Ваш код:
PHP:
			$grid.bind("jqGridAddEditBeforeInitData", function(e, $form, type) {
				if($(this).jqGrid("getGridParam", "multiselect"))
				{
					var postData = {};
					postData["id[]"] = $(this).jqGrid("getGridParam", "selarrrow");
					$.post($(this).jqGrid("getGridParam", "url"), postData, function(ret)
					{
						$(this).trigger("reloadGrid");
					}, "json");
				}
			});
Но всё равно что-то не так, в общем, жду помощи.)

SOLVED:
Бывает полезно почитать ветку полностью.) А именно этот ответ. Еще раз спасибо за точные и понятные ответы.

Итоговый код получился:
PHP:
	protected function renderComplete($data)
	{
		$selarrrow = new jqGrid_Data_Raw('$grid.getGridParam("selarrrow")');
		$data['nav']['prmEdit']['editData']['id[]'] = $selarrrow;
		return parent::renderComplete($data);
	}
 

Spyke

Новичок
и еще:
в файле jqGrid.php в функции getOutputParams я бы заменил строку
PHP:
$this->sidx = $this->input('sidx') ? jqGrid_Utils::checkAlphanum($this->input('sidx')) : $this->primary_key[0];
на
PHP:
$this->sidx = $this->input('sidx') ? jqGrid_Utils::checkAlphanum($this->input('sidx'), ' ,') : $this->primary_key[0];
чтобы работала опция грида grouping и соответственно groupingView, т.к. там будет запрос с параметром sidx:"name desc, id", т.е. будут еще пробелы и запятая.
Может можно как-нибудь проверку сделать в getOutputParams, что если grouping, тогда добавляем additional в checkAlphanum.
 

~WR~

Новичок
На самом деле, запятая в sidx - это адский хак, который не стоит поддерживать.
Он предполагает то, что данные, пришедшие от клиента, попадают в запрос как есть без фильтрации.

Если нужен сложный order by, то лучше всего перегрузить buildOrderBy.

Например:
PHP:
protected function buildOrderBy($sidx, $sord)
{
    return "ORDER BY service ASC, $sidx $sord";
}
Группировка по колонке service.
$sidx и $sord уже провалидированы заранее.
 

jjsf

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

1. Вертикальный скролл появляется как отдельный столбец. И этот "столбец" исчезает если скролла нет. Как добиться чтобы этот столбец(точнее прямоугольник сверху) остался при отсутствии скролла как в примерах ?

2. опция 'shrinkToFit'=> true , но почему то появляется горизонтальный скролл. Урезал количество столбцов до одного - скролл не исчезает. Как избавится от него?

- Как сделать всю строку ссылкой?

В Firefoxe и Opere границы некоторых(кажется пустых ) ячеек не отображаются

С чем это связано?
 
Сверху