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

fandm

Новичок
Ну и пишете вот так внутри класса вашего наследника jqGrid:
PHP:
	protected function init()
	{
		if (isset($this->input('table'))) {
				...
		}
		...
	}
 

~WR~

Новичок
Снова у меня заморочки с GET - cкажите пожалуйста как можно передать таблицу через GET . Например строка выглядит http://jqgrid-php.net/examples/?render=jqSimple&table=news а в скрипте init прописать что-то типа $this->table =$_GET['table'];
По-моему, вы хотите странного. Но все должно работать.

Возможно еще $this->query нужно оставить пустым, либо указать в нем таблицу через переменную как-то так:
PHP:
$this->query = "
    SELECT {fields}
    FROM {$this->table}
    WHERE {where}
";
Никаких других связок с таблицами, кроме $this->table и $this->query в коде нет.

P.S. Хотя бы разрешенный список таблиц сделайте. Имя таблицы из напрямую $_GET - жутковато.
 

sirba

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

fandm

Новичок
Используйте Firebug, посмотрите что приходит в ответе на xhr-вызов. Если есть какая-то ошибка в вашем .php-скрипте, то вместо json гриду придёт сообщение об ошибке, которое он не сможет обработать, в итоге он будет пустым.
 

~WR~

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

Jnas

Новичок
Здравствуйте, ув.-мые форумчанины.
У меня опять появились ламерские вопросы, на которые самостоятельно не смог найти ответа(( На этот раз связано с субгридами.
Посмотрел пример, и не могу понять как связали грид с субгридом. Если быть точнее , то как значение tbl_customer.id отправляется в субгрид...
Я видел строчку
PHP:
$this->loader->render('jqMiscSubgrid2', null, $this->input('row_id'));
, но не совсем понимаю запись $this->input('row_id'), почему не $this->input('id') и почему на другой стороне
PHP:
$this->input('customer_id')
??
Также еще второй вопрос, как можно сделать, чтоб в данном примере , по двойному клику по гриду (а не субгриду)как бы не входил в режим "редактирование", точнее в видео http://www.youtube.com/watch?feature=player_detailpage&v=G1yWOXGhDv4
 

fandm

Новичок
Также еще второй вопрос, как можно сделать, чтоб в данном примере , по двойному клику по гриду (а не субгриду)как бы не входил в режим "редактирование"
В этом примере переходим ниже на закладку JS и видим обработчик выделения записи (т.е. там не DblClick, а просто Click на записи):
PHP:
    onSelectRow: function(id)
    {
        if(id && id!==lastsel)
        {
            $(this).jqGrid('restoreRow',lastsel);
            $(this).jqGrid('editRow',id,true);
            lastsel=id;
        }
    }
Уберите этот обработчик и запись не будет переходить в режим редактирования.

А по первому вопросу, к сожалению, не смогу помочь, т.к. не занимался ещё субгридами.
 

~WR~

Новичок
, но не совсем понимаю запись $this->input('row_id'), почему не $this->input('id') и почему на другой стороне
Посмотрите JS-кусочек. Он совсем маленький. Там вызывается $.ajax, которым отправляется запрос на рендеринг subgrid. В нем и передается row_id. Имя переменной может быть любое.

Третий аргумент функции render используется для того, чтобы все гриды на странице имели уникальные ID.
 

Polina

Новичок
Добрый вечер)
Можно просто примерчик с datapicket ... ajax только начала изучать, не смогла пристроить.
Заранее спасибо)
 

Jnas

Новичок
fandm , ~WR~ спасибо за ответы.

походу туплю, даже не знаю как выразить мысль , по поводу
как значение tbl_customer.id отправляется в субгрид
я не правильно выразился...
я понял, что мы передаем из грида tbl_customer.id в субгрид (ajax средствами), и в субгриде выводим значения , которые o.customer_id ==tbl_customer.id .
Мне не ясно, что мы записываю в row_id {только значение tbl_customer.id или всю строку} и как мы в субгриде получаем данное значение.... нигде не вижу переменную row_id .

Polina первую страницу смотри, там есть пример
 

fandm

Новичок
Polina,
что именно у Вас не получается? Опишите подробнее проблему.
Для начала скажите, Вам нужен datepicker (выбор даты из календаря) при редактировании записи в гриде или же в фильтре в шапке грида?
 

Polina

Новичок
fandm
нужен при редактировании записи... посмотрела по коду страницы, при редактирование поле имеет значение
PHP:
<input id="date_pic"
. пробовала как в примере писать
PHP:
'editoptions' => array('dataInit' => new jqGrid_Data_Raw('$(function() {$( "#date_pic" ).datepicker();	});')),
и пробовала писать
PHP:
$(function() {$( "#date_pic" ).datepicker();	});
Еще не поняла , как в каждой строке организовать кнопку, ну чтоб при нажатии на кнопку, она брала значение столбца допустим link и вызывала скрипт $.ajax({})
 

~WR~

Новичок
нигде не вижу переменную row_id .
Значение лежит в $data['suffix']. row_id передали в третий аргумент функции render. Этот аргумент и есть суффикс.
Впрочем, $this->input в данном случае тоже можно использовать.

'editoptions' => array('dataInit' => new jqGrid_Data_Raw('$(function() {$( "#date_pic" ).datepicker(); });')),
PHP:
'editoptions' => array('dataInit' => new jqGrid_Data_Raw('function(el){$(el).datepicker();}')),
Еще не поняла , как в каждой строке организовать кнопку, ну чтоб при нажатии на кнопку, она брала значение столбца допустим link и вызывала скрипт $.ajax({})
На событие gridComplete добавить создание кнопок в каждом ряду.
К кнопкам привязать событие. В событии брать значение link и вызывать ajax.

Я не троллю сейчас. Вот серьезно - берем jQuery и делаем то, что нам нужно. По несколько строк кода на каждое действие. Не надо стесняться писать напрямую в ячейки таблицы. Никаких "волшебных" методов нет только лишь потому, что они не нужны.
 

fandm

Новичок
Polina,
ещё вот видел такой пример от авторов jqGrid.
Там, правда, они на закладке PHP приводят пример со своей PHP-обёрткой, но сути дела это не меняет. Там есть кусок кода:
PHP:
$grid->setColProperty('BirthDate', 
        array("formatter"=>"date",
            "formatoptions"=>array("srcformat"=>"Y-m-d H:i:s", "newformat"=>"Y-m-d"),
// Ok. We use some trick here to create the datepicer on dataInit event
// when the element is created. Note the js: before the function.
// this instruct the grid to put a javascript code without additional formating
            "editoptions"=>array("dataInit"=>
                "js:function(elm){setTimeout(function(){
                    jQuery(elm).datepicker({dateFormat:'yy-mm-dd'});
                    jQuery('.ui-datepicker').css({'font-size':'75%'});
                },200);}")
            ));
~WR~ это Вам и написал, но применительно к его jqGridPHP. Единственное, хочу обратить Ваше внимание на маленький момент, а именно применение:
PHP:
setTimeout(function(){
},200);
Очевидно в их примере без этого datepicker не применится. Возможно это и не имеет никакого значения, но всё же.

Еще не поняла , как в каждой строке организовать кнопку, ну чтоб при нажатии на кнопку, она брала значение столбца допустим link и вызывала скрипт $.ajax({})
Вам, в самом деле, лучше напрямую "вписывать" код кнопки в нужную Вам ячейку. Для получения данных выделенной строки грида используем:
PHP:
var rowData = $grid.getRowData($grid.jqGrid('getGridParam','selrow'));
Значение поля link тогда будет в rowData['link']. Ну, а дальше нечто вроде:
PHP:
$.getJSON(url_to_ajax_script, {
			    link : escape(rowData['link'])
		       }, function(json){ //ответ
			   ...
			}
);
 

fandm

Новичок
Бился я тут давеча над IE8 (8.0.6001.18702)... <Господи, когда же уже сгинет со свету сия поделка?>

Суть проблемы была в следующем...
У меня в jqGrid около 50 столбцов. Инициализация грида происходила просто в теле HTML-документа, как делается везде в примерах jqGridPHP. Всё отлично работало в Opera, Firefox, Chrome, Safari, но не в IE8. Осёл выводил вот такую ошибку.
Однако в данном случае дело было точно не в &.
Оказалось, что строка инициализации colModel (столбцов-то 50) получалась такой большой и сложной (42 кб js-кода), что на выполнении следующей строки, где происходит инициализация navGrid, IE8 вот так ругался. Т.е., очевидно, он не успевал справиться с предыдущей строкой кода и что-то там внутри ломалось.

Пришлось убрать из renderComplete строки:
PHP:
//document.write(\'<table id="'.$data['id'].'"></table>\');
//document.write(\'<div id="'.$data['pager_id'].'"></div>\');
и добавить эти элементы статически в том месте, где у меня должен появляться грид. Ну, а всю работу по инициализации перенёс в:
PHP:
$(document).ready( function() {
});
Вуаля. Всё заработало и в IE8.
Может кому-то пригодится.

Что примечательно. Любой пример из jqGridPHP, например, даже этот в IE8 вызывает ту же ошибку.
А примеры отсюда все открываются без этой ошибки. Вероятно потому, что у них хитро построен вывод грида. У них при клике на элемент дерева слева отрабатывает js-код, который добавляет в <div> справа HTML-элементы <table> для грида и <div> для navGrid, соответственно, и код по инициализации грида в виде линка на отдельный js-скрипт. Получается, что грид инициализируется не при загрузке страницы. Возможно поэтому ошибка и не проявляется.
 

Jnas

Новичок
~WR~ ,
открыл сессию , и вывел значение $this->input('row_id') тогда до меня и дошло, что суффикс приобретает значение первого ключа(первого столбца) в массиве $this->cols .Возник иной вопрос, как в суффикс записать значение не первого столбца?

P.S. внутри opRenderSubgrid() ручками менял местами первого по счету ключа с другим ключем, но увы моя хитрость не сработала.
 

~WR~

Новичок
Возник иной вопрос, как в суффикс записать значение не первого столбца?
Передать его с клиента на сервер в $.ajax (data). На клиенте получить через метод .getCell(id_ряда, имя_колонки).
Или получить данные на сервере по имеющемуся primary_key отдельным запросом.

Любой пример из jqGridPHP, например, даже этот в IE8 вызывает ту же ошибку.
У меня не повторяется. Хотя винда сама апдейты ставит. Видимо, обновила уже свой несчастный браузер.

В текущей версии режим рендеринга по умолчанию переключен с document.write на другой.
По инициализации - с IE много проблем и по другим jQuery плагинам. Общий совет такой: если jqGrid работает для внутренних админок, то конкретно для него ready реально не нужен. В нормальных браузерах все отлично работает. Зато инициализация от ready заметно откладывается, что раздражает.

А в IE всё равно больше гриды тормозят. Причем это даже не от jqGrid зависит. Сделайте реально большой <table> с шапкой и дополнительной разметкой внутри ячеек и убедитесь сами.
 

fandm

Новичок
У меня не повторяется.
Думаю зависит конкретно от билда именно IE8.
если jqGrid работает для внутренних админок
В том-то и дело, что нет. :) Да ещё и не один он, а штук 10 да увесистых, используемых в одном сеансе.
А в IE всё равно больше гриды тормозят...
Знаю, но, если в требованиях прописан и этот "несчастный браузер", то... Одно дело рекомендовать всё, что угодно, но не IE, и совсем другое - заявить, что он вообще не поддерживается. А там уже трава не расти. :) Пользователи сами увидят, что тормоз, и откажутся в пользу более прогрессивных вещей.
Зато инициализация от ready заметно откладывается, что раздражает.
Пусть уж лучше раздражает, зато стопудово работает даже в осле. ;)
Кстати, засекал суммарное время загрузки страницы в Firebug, так оно одинаковое примерно в обоих случаях. Единственное, грид в IE как бы появляется мгновенно в самом конце загрузки страницы. Но хоть ошибку не выдаёт и на том спасибо.
 
Сверху