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

fandm

Новичок
2) с аяксом пока не очень, как сделать сворачивание таблицы, как в примерах http://trirand.com/blog/jqgrid/jqgrid.html ?
Это не ajax. За это поведение отвечает опция грида hidegrid. По умолчанию в примерах jqGridPHP эта опция отключена. На стороне клиента есть код:
PHP:
	$.extend($.jgrid.defaults,
	{
		...		
		hidegrid: false,
		...
	});
Установите здесь hidegrid: true и эта кнопка появится во всех гридах. Или включите эту опцию в $this->options нужного грида. Но, конечно же, при условии, что caption грида не пуст. А вот упоминание об этой опции в документации (ищите фразу "Enables or disables the show/hide grid button").
 

~WR~

Новичок
А unformat-функцию на клиенте, получается, оставить?
It's all up to you. :) Вот как сделаете - так и будет.
Я видел реализации форматирования ячеек даже не на форматтерах, а в gridComplete. Потому что форматирование каждого ряда зависело от соседних рядов.

Все зависит от ситуации. Главное, что большинство фантазий легко реализуются.
Например, добавить ссылку или суффикс на базе formatoptions можно в одну строку. Просто сделайте это. :)

Кстати, попытка "стандартной" реализации поддержки formatter'ов для экспорта в XLS только мешала бы.
Появилось бы еще одно место в коде, где изменяется вывод. И тут уже разработчику надо включать голову и думать, что происходит и где.

А так - в XLS (HTML) пишется то же самое, что уходит с сервера в обычном ответе. Без сюрпризов.
Ну и конечно вы можете в любой момент сделать Adapter, в котором будет реализован экспорт в Excel так, как это нужно вам. И раскидает это поведение на все ваши гриды.
 

fandm

Новичок
Кстати, попытка "стандартной" реализации поддержки formatter'ов для экспорта в XLS только мешала бы.
Так я и изначально не связывал эти два понятия. Я сразу согласился, что конкретно для экспорта в XLS наилучшим вариантом будет форматирование на сервере. Вероятно, Вы меня недопоняли. Я говорил о другом, что крайне не хотелось иметь реализацию форматирования и на клиенте и на сервере, что, по сути, является в некотором роде дублированием одного и того же кода, но на разных языках программирования. И я думал, что, возможно, есть какой-то способ сделать форматирование на какой-то одной стороне (например, только на серверной), чтобы убить 2-х зайцев: и форматирование вывода в грид и форматирование экспорта в XLS. Но в данном конкретном случае вот так:
реализации форматирования ячеек даже не на форматтерах, а в gridComplete
у меня, как мне кажется, не получится, т.к. мне мало просто форматированного вывода в одну сторону, мне необходимо ещё и обратное преобразование из форматированного в исходное, когда на клиенте запись переводится в режим редактирования в моём custom-диалоге (ведь никакого обращения к серверу при этом не происходит, так зачем же мне из-за одного только un-форматирования это делать? Это уж точно было бы не разумно.).

Так что спасибо Вам большое за подсказку. Я, задавая уточняющие вопросы, которые, очевидно, имели для Вас совершенно однозначные ответы (что и вызвало у Вас, вероятно, недоумение:)), просто хотел ещё раз уточнить, что в данном конкретном случае это единственно разумный вариант.
Сейчас у меня так и получилось, что остался formatter с unformat для вывода в грид + добавил PHP-форматирование в parseRow исключительно для случая с экпортом в XLS (HTML).
Так что ещё раз спасибо за Ваши усилия! ;)
 

fandm

Новичок
Форматировать на сервере в parseRow.
И, всё-таки, остаётся одно НО.
Что делать, если обрабатывается значение столбца, для которого указан массив replace? Ведь в этом случае replace применится только в addRowCell, а addRowCell выполняется уже после parseRow. Т.е., в parseRow такой столбец ещё не имеет того значения, которое можно было бы проанализировать и выполнить соответствующее форматирование, как это делается в JS-функции, указанной в качестве formatter.

Подозреваю, что в таком случае надо выйти на настройки этого столбца, считать значение опции replace и самому предварительно выполнить код:
PHP:
		#Easy replace values
		if($c['replace']) $val = isset($c['replace'][$val]) ? $c['replace'][$val] : $val;
, затем выполнить форматирование, а после этого сбросить опцию replace, иначе моё форматирование позже затрётся значениями из replace.

Верно мыслю?

Вот только не скажется ли потом на дальнейшей работе грида то, что я очищу опцию replace у такого столбца? Или в colModel настройки такого столбца вместе с replace попадут раньше, чем будут выполнены мои манипуляции в parseRow? Я, конечно же, буду пробовать, но что-то... казалось бы, плёвый на первый взгляд вопрос превращается в "выкрутасы"...
 

~WR~

Новичок
Да. Просто не используйте replace. Напишите замену напрямую в parseRow.
PHP:
$this->foo_types = array(1 => 'Мур', 2 => 'Гав');
...
protected function parseRow($r)
{
    //аналог replace
    $r['foo'] = isset($this->foo_types[$r['foo']]) ? $this->foo_types[$r['foo']] : $r['foo'];

    //форматирование для xls
    if($this->out == 'export')
    {
        $r['foo'] = $this->formatForXls($r['foo']);
    }

    return $r;
}

На самом деле, replace был очень удобен на определенном этапе и оставлен в коде ради обратной совместимости. Сейчас в документации о нем ни слова. От него ничего больше не зависит.
 

fandm

Новичок
Да. Просто не используйте replace. Напишите замену напрямую в parseRow.
Ок, спасибо! :) Убирать replace полностью пока не буду, ибо уже широко используется базовый класс-наследник jgGrid, в котором плотно организованно форматирование на его основе, но буду пробовать с временным его убиранием и возвратом исключительно для случая с экспортом в XLS.
 

~WR~

Новичок
Посмотрите в документации редактирования serializeEditData.
В этой функции получайте id родителя из параметра postData и добавляйте его к запросу на редактирование.
 

Redjik

Джедай-мастер
К yii кто-нибудь пытался прикрутить, хочу попробовать.
 

~WR~

Новичок
Чтобы прикрутить к любому фреймворку, нужно сделать две вещи.

1. Добавить новый "драйвер" в DB. В нем прописать прямые вызовы функций фреймворка для работы с БД.
Имена функций такие же, как в PDO. Абстрактный класс подскажет, что ему нужно.

2. При необходимости, добавить новый "адаптер" (jqGrid_Adapter_Yii). В нем переопределить отдельные функции.
Например, если есть свой фильтр входящих переменных - прописать его в getInputData вместо стандартного $_REQUEST + iconv.
Если есть свой вывод JSON - заменить им стандартный.
И так далее, по аналогии.

Список функций с краткими пояснениями на русском есть здесь:
http://jqgrid-php.net/doku.php?id=wiki:ex-funclist

Наверняка пригодятся: renderGridUrl, getInputData, beforeInit, afterInit.

Чтобы передать дополнительный объект внутрь jqGrid, используйте jqGridLoader->set().
PHP:
$jq_loader = new jqGridLoader;
$jq_loader->set('registry', $my_registry);
Внутри класса грида обращаемся к нему как:
PHP:
$this->loader->get('registry');
Если всё получится - поделитесь кодом, я добавлю в git.
Если с чем-то будут сложности - спрашивайте.
 

Redjik

Джедай-мастер
1) Это самая простая часть, как раз с этого и думал начать делать по плану.
2) Спасибо, я примерно так и задумываю все сделать, теперь вдвойне убедился, что иду верным путем.

3) От себя добавлю, заключительная часть будет переопределение колонок, чтобы они автоматом из модели привязывались.
Если дело пойдет я ветку создам на гите.
 

yadenis

Новичок
~WR~, спасибо :) К сожалению не смог разобраться с serializeEditData, поэтому добавил id родителя в editurl в onSelectRow.
 

Jnas

Новичок
Здравствуйте. и опять я со своими ламерскими вопросами.

Как сделать перенос строки?, пробывал
PHP:
$r['_class'] = array('pr' => 'white-space: normal');
но без успеха...
 

fandm

Новичок
А что такое 'pr'?
В $r['_class'] надо указывать имя css-класса или серию css-классов через пробел.

Относительно переноса строки. Не думаю, что такой подход что-то изменит.

Вот Вам решение.

P.S. Вообще вот тут много чего по jqGrid есть. Можно воспользоваться поиском.
 

Jnas

Новичок
А что такое 'pr'?
Забыл указать ....
'pr' - это имя столбца. по примеру я понял что так можно http://jqgrid-php.net/doku.php?id=wiki:client-color&s[]=class
А Вы не пробовали напрямую в значение столбца добавить <br /> там, где Вам нужно?
то есть подсчитать кол.-во элементов и добавить , после определенного значения кол.-в элементов символ <br /> , предварительно выставив "encode" ?
 

fandm

Новичок
Вы неверно трактуете пример. В данном случае:
PHP:
$r['_class'] = array('_row' => 'red', 'name' => 'blue', 'discount' => 'purple');
red, blue, purple - это имена css-классов, а не сам CSS.

Попробуйте прописать css-класс:
PHP:
.your_css_class = {white-space: normal !important;}
, а уже его указать в $r['_class']:
PHP:
$r['_class'] = array('pr' => 'your_css_class');
А вообще, судя по примеру здесь, можно это сделать через cellattr. Просто в $this->cols['pr'] добавить вот это:
PHP:
cellattr => new jqGrid_Data_Raw('function (rowId, tv, rawObject, cm, rdata) { return \'style="white-space: normal;"\'; }')
 
  • Like
Реакции: Jnas

Jnas

Новичок
Спасибо за ответ, но не сработало.... в firebud в консоле при вводе $(".your_css_class") находит присвоенные значения, но не переводит строку
 

fandm

Новичок
при вводе $(".your_css_class")
Класс your_css_class надо было прописать в jqgrid-ext.css, а в PHP-классе прописать так, как я написал:
PHP:
$r['_class'] = array('pr' => 'your_css_class');
И ещё, как именно Вы прописали класс your_css_class? Вот так:
PHP:
.ui-jqgrid TR.jqgrow TD.your_css_class {white-space: normal !important;}
слово в слово? Изучите секцию "Additional highlight styles" в jqgrid-ext.css, там приведены примеры.

В крайнем случае, пробуйте реализовать через cellattr (см. выше).

P.S. Только что проверил у себя 1-й вариант, работает. И, разумеется, работает только если текст не помещается по ширине в колонке.
 
  • Like
Реакции: Jnas

Jnas

Новичок
Спасибо всё работает, тем и другим способом. про "Additional highlight styles" обязательно посмотрю {за это тоже спасибо}. оказалось , что внизу была строка из-за которой не получалось, на подобие $r['_class'] = 'green';
 
Сверху