Jqgrid php без головной боли

Jqgrid php без головной боли thumbnail
<?php

class jq_purchase2 extends jqGrid_Adapter_ReadRu
{
protected $tblName = ‘bnd_books_periodical’;

protected function init()
{
$this->delivery_types = array(
1 => ‘Доставка’,
2 => ‘Самовывоз’,
3 => ‘Комбинир.’,
);

$this->contract_types = array(
1 => ‘Купля-продажа’,
2 => ‘Реализация’,
);

#Простые запросы? Ха! 🙂
$this->query = »
SELECT {fields}
FROM lst_periodical p

JOIN (
SELECT n.book_id
,n.number_supply_date
,COALESCE(n.period_id, s.period_id) AS period_id
,COALESCE(n.number, s.number_next) AS number
,COALESCE(n.year, s.number_next_year) AS year

,COALESCE(s.period_cnt, 0) AS req_period

,CASE WHEN n.book_id IS NOT NULL THEN calc_present_book(n.book_id, 0) ELSE 0 END AS cnt
,b.purchase_delivery_id

FROM bnd_books_periodical n

FULL JOIN (
SELECT s.period_id, s.number_next, s.number_next_year, sum(s.quantity) AS period_cnt
FROM period_tbl_subscribe s
JOIN tbl_order o ON (s.order_id=o.id)
WHERE o.status_bo != 6 AND s.numbers_gone < s.number_cnt
GROUP BY s.period_id, s.number_next, s.number_next_year
) s ON (n.period_id=s.period_id AND n.number=s.number_next AND n.year=s.number_next_year)

LEFT JOIN tbl_books b ON (n.book_id=b.id)

WHERE (n.book_id IS NULL OR n.number IS NOT NULL)
) AS n ON (p.id=n.period_id)

LEFT JOIN (
SELECT book_id, sum(cnt_reserve) AS cnt_reserve
FROM tbl_order_reserve
GROUP BY book_id
) r ON (n.book_id=r.book_id)

LEFT JOIN (
SELECT i.book_id, sum(CASE WHEN ps.id IS NOT NULL THEN i.quantity — i.quantity_return_total END) AS sel_period
, sum(CASE WHEN ps.id IS NULL THEN i.quantity — i.quantity_return_total END) AS sel_retail
FROM tbl_order_item i
JOIN tbl_order o ON (i.order_id=o.id)
JOIN bnd_books_periodical n ON (i.book_id=n.book_id)
LEFT JOIN period_tbl_subscribe ps ON (ps.period_id=n.period_id AND o.id=ANY(ps.orders_created))
WHERE o.status_bo NOT IN (6,19)
GROUP BY i.book_id
) i ON (n.book_id = i.book_id)

LEFT JOIN (
SELECT n.period_id, wr_max(purchase_delivery_id, n.id) AS purchase_delivery_id
FROM tbl_books b
JOIN bnd_books_periodical n ON (b.id=n.book_id)
WHERE b.purchase_delivery_id IS NOT NULL
GROUP BY n.period_id
) pd ON (p.id=pd.period_id)

LEFT JOIN (
SELECT d.id, cl.short_name AS client_name, co.number AS contract_number, co.contract_type_id
,COALESCE(d.payment_conditions, 0) AS payment_conditions, d.delivery_type_id
FROM purchase_tbl_deliveries d
JOIN purchase_tbl_contracts co ON (d.contract_id=co.id)
JOIN purchase_tbl_clients cl ON (co.client_id=cl.id)
) AS d ON (COALESCE(n.purchase_delivery_id, pd.purchase_delivery_id)=d.id)

LEFT JOIN (
SELECT n.book_id, string_agg(l.name, ‘,’) AS pubhouse
FROM bnd_bookspubhouse n
JOIN lst_pubhouse l ON (n.pubhouse_id=l.id)
JOIN lst_periodical p ON (p.book_id=n.book_id)
GROUP BY n.book_id
) AS ph ON (p.book_id=ph.book_id)

WHERE {where}
«;

$this->cols_default = array(‘align’ => ‘center’, ‘width’ => 10);

$this->cols = array(
‘id’ =>array(‘db’ => «n.period_id || ‘:’ || n.number || ‘:’ || n.year»,
‘hidden’=> true,
),

‘period_id’ =>array(‘label’ => ‘ID’,
‘db’ => ‘p.id’,
‘width’ => 5,
),

‘period_name’ =>array(‘label’ => ‘Название’,
‘db’ => ‘p.name’,
‘width’ => 30,
‘align’ => ‘left’,
),

‘number_next_str’=>array(‘label’=> ‘Номер’,
‘db’ => «‘№’ || n.number || ‘/’ || n.year»,
‘width’ => 15,
‘stype’ => ‘select’,
‘searchoptions’ => array(‘value’ => new jqGrid_Data_Value($this->getHalfYears(), ‘Все полугодия’)),
‘search_op’ => ‘number’,
),

‘number_supply_date’
=>array(‘label’ => ‘Дата поставки’,
‘db’ => ‘n.number_supply_date’,
‘width’ => 15,
‘formatter’ => ‘date’,
‘editable’ => true,
‘editoptions’ => array(‘dataInit’ => new jqGrid_Data_Raw(‘function(el){$(el).datepicker({«onSelect»: onDateSelect});}’)),
),

‘delivery_type_id’
=>array(‘label’ => ‘Доставка’,
‘db’ => ‘d.delivery_type_id’,
‘replace’ => $this->delivery_types,
‘stype’ => ‘select’,
‘searchoptions’ => array(‘value’ => new jqGrid_Data_Value($this->delivery_types, ‘Все’)),
),

‘numbers_half’ =>array(‘label’ => ‘В п/г’,
‘db’ => ‘p.numbers::numeric / 2’,
),

‘numbers_full’ =>array(‘label’ => ‘В год’,
‘db’ => ‘p.numbers’,
),

‘req_period’ =>array(‘label’ => ‘Подписка’,
‘db’ => ‘n.req_period’,
),

‘sel_total’ =>array(‘label’ => ‘Итого’,
‘db’ => ‘COALESCE(i.sel_period, 0) + COALESCE(i.sel_retail, 0)’,
),

‘sel_period’ =>array(‘label’ => ‘Подписка’,
‘db’ => ‘COALESCE(i.sel_period, 0)’,
),

‘sel_retail’ =>array(‘label’ => ‘Розница’,
‘db’ => ‘COALESCE(i.sel_retail, 0)’,
),

‘cnt’ =>array(‘label’ => ‘На складе’,
‘db’ => ‘n.cnt’,
),

‘reserve’ =>array(‘label’ => ‘Резерв’,
‘db’ => ‘r.cnt_reserve’,
),

‘pubhouse’ =>array(‘label’ => ‘Издательство’,
‘db’ => ‘ph.pubhouse’,
‘width’ => 15,
‘align’ => ‘left’,
‘search_op’ => ‘like’,
),

‘client_name’ =>array(‘label’ => ‘Поставщик’,
‘db’ => ‘d.client_name’,
‘width’ => 15,
‘align’ => ‘left’,
),

‘contract_number’
=>array(‘label’ => ‘Номер’,
‘db’ => ‘d.contract_number’,
‘align’ => ‘left’,
),

‘contract_type_id’
=>array(‘label’ => ‘Вид’,
‘db’ => ‘d.contract_type_id’,
‘replace’ => $this->delivery_types,
‘stype’ => ‘select’,
‘searchoptions’ => array(‘value’ => new jqGrid_Data_Value($this->contract_types, ‘Все’)),
),

‘payment_conditions’
=>array(‘label’ => ‘Оплата’,
‘db’ => ‘d.payment_conditions’,
),

‘book_id’ =>array(‘hidden’ => true,
‘db’ => ‘n.book_id’,
),
);
}

protected function parseRow($r)
{
$r[‘period_name’] = $r[‘book_id’] ? «<a href=’https://example.com/id/{$r[‘book_id’]}/’ target=’_blank’ class=’tip’ book_id='{$r[‘book_id’]}’>{$r[‘period_name’]}</a>» : $r[‘period_name’];

$r[‘numbers_half’] = round($r[‘numbers_half’], 1);
$r[‘payment_conditions’] = $r[‘payment_conditions’] ? ($r[‘payment_conditions’] . ‘дн’) : ‘предоплата’;

$r[‘_class’] = array(
‘numbers_half’ => ‘lavender’,
‘numbers_full’ => ‘lavender’,
‘req_period’ => ‘mint’,
‘sel_total’ => ‘seashell’,
‘sel_period’ => ‘seashell’,
‘sel_retail’ => ‘seashell’,
‘cnt’ => ‘smoke’,
‘reserve’ => ‘smoke’,
);

return $r;
}

protected function opEdit($id, $upd)
{
list($period_id, $number, $year) = array_map(‘intval’, explode(‘:’, $id));

#Row exists?
$row = coreDB::dbLoadObj(«SELECT * FROM bnd_books_periodical WHERE period_id=’$period_id’ AND number=’$number’ AND year=’$year'»);

if($row)
{
coreDB::doUpdate(‘bnd_books_periodical’, array(‘number_supply_date’ => $upd[‘number_supply_date’]), $row[‘id’]);
}
else
{
$ins = array(
‘period_id’ => $period_id,
‘number’ => $number,
‘year’ => $year,
‘number_supply_date’ => $upd[‘number_supply_date’],
);

coreDB::doInsert(‘bnd_books_periodical’, $ins);
}
}

protected function buildOrderBy($sidx, $sord)
{
return «ORDER BY $sidx $sord, n.year ASC, n.number ASC»;
}

protected function getHalfYears()
{
……..
}

protected function searchOpNumber($c, $val)
{
list($year, $half) = array_map(‘intval’, explode(‘-‘, $val));

$op = ($half == 1) ? ‘<=’ : ‘>’;

return «(n.year = ‘$year’ AND (n.number — p.n_shift) $op (p.numbers::numeric / 2))»;
}
}

Источник

Введение

На мой взгляд, jqGrid — самый успешный и удобный на данный момент плагин для jQuery, работающий с таблицами БД через AJAX запросы и PHP (Так же существует версия для ASP.NET).

Все подробности в данной статье я опущу, акцентируя ваше внимание лишь на вопросе, как сделать сложный поиск по таблице, используя этот плагин.

Для начала советую познакомиться:

  • с самим плагином вот тут;
  • с примерами его работы вот здесь;
  • со статьей «Введение в jqGrid», в которой описано как связать jqGrid + php + Mysql (или иные БД).

Как получить данные БЕЗ условия «where» в этой статье описываться не будет. Предполагается, что вы прочли статью «Введение в jqGrid» и хотите теперь не просто сортировать результаты и разбивать их на страницы, а делать сложные поиски сразу по нескольким полям таблицы.

Прошу обратить особое внимание на пример, расположенный по ссылке выше, под названием «Searching (4.0) new» -> «Show query in search ».

И так, мы создали документ HTML:

<table id=»newapi»></table>
<div id=»pnewapi»></div>

Подключили JavaScript код:

jQuery(«#grps1»).jqGrid({ // Привязка плагина к таблице
url:’ajax/get.php’, // Скрипт — обработчик ваших запросов
datatype: «json», // Формат скрипта-обработчика
colNames:[‘Inv No’, ‘Date’, ‘Client’, ‘Amount’,’Tax’,’Total’,’Notes’],
colModel:[
{name:’id’, key : true, index:’id’, width:55, searchtype:»integer»},
{name:’invdate’,index:’invdate’, width:90},
{name:’name’, index:’name’, width:100},
{name:’amount’,index:’amount’, width:80, align:»right», searchtype:»number»},
{name:’tax’,index:’tax’, width:80, align:»right», searchtype:»number»},
{name:’total’,index:’total’, width:80,align:»right», searchtype:»number»},
{name:’note’,index:’note’, width:150, sortable:false}
],
rowNum:10,
width:700,
rowList:[10,20,30],
pager: ‘#pgrps1’, // Привязка к таблице тулбара
sortname: ‘invdate’,
viewrecords: true,
sortorder: «desc»
});

Читайте также:  Для спортсменов при головной боли

jQuery(«#grps1»).jqGrid(‘navGrid’,’#pgrps1′, // Управление тулбаром таблицы
{edit:false,add:false,del:false}, // Отключаем от тулбара редактирование, добавление и удаление записей. На тулбаре останутся только две кнопки: «Поиск» и «Обновить»
{}, // Опции окон редактирования
{}, // Опции окон добавления
{}, // Опции окон удаления
{
multipleSearch:true, // Поиск по нескольким полям
multipleGroup:true, // Сложный поиск с подгруппами условий
showQuery: true // Показывать превью условия
}
);

Подключили необходимые стили и скрипты (скачать можно тут):

<link href=»https://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/redmond/jquery-ui.css» rel=»stylesheet» type=»text/css»/>
<script src=»https://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js»></script>
<script src=»https://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js»></script>

<link rel=»stylesheet» type=»text/css» href=»css/ui.jqgrid.css»/>
<script type=»text/javascript» src=»src/grid.loader.js»></script>

Обратите внимание, что я не подключаю библиотеку одним файлом или отдельными частями, как это можно было сделать, а использую файл «grid.loader.js», который также поставляется с исходниками на оффициальном сайте плагина. Я его немного изменил и привожу измененный отрывок кода:


var pathtojsfiles = «src/»;
// set include to false if you do not want some modules to be included
var modules = [
{ include: true, incfile:’i18n/grid.locale-ru.js’}, // Вот тут я изменил локаль на ‘ru’

Используя этот файл удобно управлять компонентами этого модуля, а также выбирать его язык.

Расширенный поиск

Форма расширенного поиска:

Теперь самое сладкое. Что же нам передает jqGrid при поиске?
POST или GET параметры (в зависимости от настроек jqGrid):

  1. $_REQUEST[‘_search‘] — Булево значение, если запрос с условием поиска оно принимает истинное значение;
  2. $_REQUEST[‘filters‘] — Объект с условиями в представлении json;
  3. $_REQUEST[‘searchField‘] — Имя поля для поиска (если условие простое);
  4. $_REQUEST[‘searchOper‘] — Операция сравнения поля для поиска (если условие простое);
  5. $_REQUEST[‘searchString‘] — Значение поля для поиска (если условие простое);

Теперь зная эти данные, необходимо сгенерировать строку условий «where» и передать ее необходимой процедуре, которая раннее принимала только имя сортируемой колонки, направление сортировки, номер страницы и количество записей на одну страницу (для пагинации).

Вот код, который необходимо вставить перед запросом в БД (в примере используется POST-запрос):

if($_search){
if (isset($_POST[‘filters’])) $filters = $_POST[‘filters’];// Фильтры для поиска
if (isset($_POST[‘searchField’])) $searchField = $_POST[‘searchField’]; // Фильтр по одному полю (имя)
if (isset($_POST[‘searchOper’])) $searchOper = $_POST[‘searchOper’]; // Фильтр по одному полю (операция)
if (isset($_POST[‘searchString’])) $searchString = $_POST[‘searchString’]; // Фильтр по одному полю (значение)

$searchString = generateSearchString($filters, $searchField, $searchOper, $searchString);
}

Вот «сердце» данной статьи, функции генерации условия для поиска в БД.

Функция generateSearchString():

function generateSearchString($filters, $searchField, $searchOper, $searchString){
$where = »;
if($filters){
$filters = json_decode($filters);
$where .= self::generateSearchStringFromObj($filters);
}

return $where;
}

Рекурсивная функция generateSearchStringFromObj() генерации условий для выборки из БД:

function generateSearchStringFromObj($filters){
$where = »;

// Генерация условий группы фильтров
if(count($filters)) foreach($filters->rules as $index => $rule){
$rule->data = addslashes($rule->data);

$where .= «`».preg_replace(‘/-|’|»/’, », $rule->field).»`»;
switch($rule->op){ // В будущем будет больше вариантов для всех вохможных условий jqGrid
case ‘eq’: $where .= » = ‘».$rule->data.»‘»; break;
case ‘ne’: $where .= » != ‘».$rule->data.»‘»; break;
case ‘bw’: $where .= » LIKE ‘».$rule->data.»%'»; break;
case ‘bn’: $where .= » NOT LIKE ‘».$rule->data.»%'»; break;
case ‘ew’: $where .= » LIKE ‘%».$rule->data.»‘»; break;
case ‘en’: $where .= » NOT LIKE ‘%».$rule->data.»‘»; break;
case ‘cn’: $where .= » LIKE ‘%».$rule->data.»%'»; break;
case ‘nc’: $where .= » NOT LIKE ‘%».$rule->data.»%'»; break;
case ‘nu’: $where .= » IS NULL»; break;
case ‘nn’: $where .= » IS NOT NULL»; break;
case ‘in’: $where .= » IN (‘».str_replace(«,», «‘,'», $rule->data).»‘)»; break;
case ‘ni’: $where .= » NOT IN (‘».str_replace(«,», «‘,'», $rule->data).»‘)»; break;
}

// Добавить логику соединения, если это не последние условие
if(count($filters->rules) != ($index + 1))
$where .= » «.addslashes($filters->groupOp).» «;
}

// Генерация условий подгруппы фильтров
$isSubGroup = false;
if(isset($filters->groups))
foreach($filters->groups as $groupFilters){
$groupWhere = self::generateSearchStringFromObj($groupFilters);
// Если подгруппа фильтров содержит условия, то добавить их
if($groupWhere){
// Добавить логику соединения, если условия подгруппы фильтров добавляются после условий фильтров этой группы
// или после условий других подгрупп фильтров
if(count($filters->rules) or $isSubGroup) $where .= » «.addslashes($filters->groupOp).» «;
$where .= $groupWhere;
$isSubGroup = true; // Флаг, определяющий, что было хоть одно условие подгрупп фильтров
}
}

if($where)
return ‘(‘.$where.’)’;

return »; // Условий нет
}

P.S.

Форма inline-поиска:

ВНИМАНИЕ: данная формула не будет работать при inline-поиске. При inline-поиске jqGrid будет передавать в параметрах запроса имена колонок и их значения.

echo $_POST[‘id’]; // Выведет 3, если пользователь ввел в строку поиска под колонкой id цифру 3

Таким образом для реализации inline-поиска по `id` достаточно написать такой код:

$where = «`id` = » . (int)$_POST[‘id’];

Для поиска по нескольким полям к условию соответственно будут добавляться дополнительные строки, соединенные между собой «AND». Естественно вместо равенства можно использовать любой условие, позволительное для вашей БД.

Исходник файла-обработчика запросов AJAX от jqGrid. (Внимательно читайте комментарии, скрипт будет работать, только если вы настроете подключение к БД и впишите вместо моего обращение к модулю свой запроса к БД).

Источник

fandm

  • #181

Ну и пишете вот так внутри класса вашего наследника jqGrid:

PHP:

protected function init()
{
if (isset($this->input(‘table’))) {

}

}

~WR~

  • #182

Снова у меня заморочки с GET — cкажите пожалуйста как можно передать таблицу через GET . Например строка выглядит https://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 — жутковато.

  • #183

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

fandm

  • #184

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

~WR~

  • #185

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

  • #186

Здравствуйте, ув.-мые форумчанины.
У меня опять появились ламерские вопросы, на которые самостоятельно не смог найти ответа(( На этот раз связано с субгридами.
Посмотрел пример, и не могу понять как связали грид с субгридом. Если быть точнее , то как значение 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’)

??
Также еще второй вопрос, как можно сделать, чтоб в данном примере , по двойному клику по гриду (а не субгриду)как бы не входил в режим «редактирование», точнее в видео https://www.youtube.com/watch?feature=player_detailpage&v=G1yWOXGhDv4

fandm

  • #187

Также еще второй вопрос, как можно сделать, чтоб в данном примере , по двойному клику по гриду (а не субгриду)как бы не входил в режим «редактирование»

В этом примере переходим ниже на закладку JS и видим обработчик выделения записи (т.е. там не DblClick, а просто Click на записи):

PHP:

onSelectRow: function(id)
{
if(id && id!==lastsel)
{
$(this).jqGrid(‘restoreRow’,lastsel);
$(this).jqGrid(‘editRow’,id,true);
lastsel=id;
}
}

Уберите этот обработчик и запись не будет переходить в режим редактирования.

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

~WR~

  • #188

, но не совсем понимаю запись $this->input(‘row_id’), почему не $this->input(‘id’) и почему на другой стороне

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

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

Polina

  • #189

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

  • #190

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

походу туплю, даже не знаю как выразить мысль , по поводу

как значение tbl_customer.id отправляется в субгрид

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

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

Polina

  • #191

Jnas, пробовала по пример.не получилось

fandm

  • #192

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

Polina

  • #193

fandm
нужен при редактировании записи… посмотрела по коду страницы, при редактирование поле имеет значение

. пробовала как в примере писать

PHP:

‘editoptions’ => array(‘dataInit’ => new jqGrid_Data_Raw(‘$(function() {$( «#date_pic» ).datepicker(); });’)),

и пробовала писать

PHP:

$(function() {$( «#date_pic» ).datepicker(); });

Еще не поняла , как в каждой строке организовать кнопку, ну чтоб при нажатии на кнопку, она брала значение столбца допустим link и вызывала скрипт $.ajax({})

~WR~

  • #194

нигде не вижу переменную 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

  • #195

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

  • #196

Бился я тут давеча над 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-скрипт. Получается, что грид инициализируется не при загрузке страницы. Возможно поэтому ошибка и не проявляется.

  • #197

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

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

~WR~

  • #198

Возник иной вопрос, как в суффикс записать значение не первого столбца?

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

Любой пример из jqGridPHP, например, даже этот в IE8 вызывает ту же ошибку.

У меня не повторяется. Хотя винда сама апдейты ставит. Видимо, обновила уже свой несчастный браузер.

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

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

fandm

  • #199

Думаю зависит конкретно от билда именно IE8.

если jqGrid работает для внутренних админок

В том-то и дело, что нет. :) Да ещё и не один он, а штук 10 да увесистых, используемых в одном сеансе.

А в IE всё равно больше гриды тормозят…

Знаю, но, если в требованиях прописан и этот «несчастный браузер», то… Одно дело рекомендовать всё, что угодно, но не IE, и совсем другое — заявить, что он вообще не поддерживается. А там уже трава не расти. :) Пользователи сами увидят, что тормоз, и откажутся в пользу более прогрессивных вещей.

Зато инициализация от ready заметно откладывается, что раздражает.

Пусть уж лучше раздражает, зато стопудово работает даже в осле. ;)
Кстати, засекал суммарное время загрузки страницы в Firebug, так оно одинаковое примерно в обоих случаях. Единственное, грид в IE как бы появляется мгновенно в самом конце загрузки страницы. Но хоть ошибку не выдаёт и на том спасибо.

Источник