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

~WR~

Новичок
А что есть? JSON? Какой? Заголовки?
Если пустота, то это ошибка php с выключенным display_errors.
 

Serhij Blotskyy

Новичок
На днях сделал несколько таблиц для админки сайта в jqGrid, при этом серверную часть на PHP писал свою. Когда завершил работу и задался целью обеспечить еще экспорт в EXCEL, наткнулся на Вашу разработку. Как по мне, стоящая вещь. Пока, правда, не вник во все детали, а посему пара вопросов:
1. Обеспечивается ли поддержка подтаблиц (subgrid)?
2. Если да, то, по-моему, модуль ExcelHtml.php необходимо модифицировать.
3. Можно ли обойтись без обрамления табличных данных в HTML разметку с целью преобразования в .xls формат? В моем исполнении данные таблицы содержатся на пользовательской стороне и я перешлю их на сервер в json формате, например, затем преобразую в объект, затем еще обрамлять в html-теги. Есть ли путь покороче?

p.s. Кстати, мне кажется, в строке 78 указанного файла вместо $t .= '</table></body></html>'; необходимо $t .= '</table>'; поскольку в последующем вызове функции output() эти теги будут добавлены.
 

~WR~

Новичок
1. Обеспечивается ли поддержка подтаблиц (subgrid)?
Каких-то особых функций для этого нет, но несложно сделать самостоятельно.
Простой subgrid делается через custom-операцию, которая возвращает json в нужном формате.

Для grid as subgrid добавляем операцию, которая вернет результат ->render для класса subgrid'а с нужными параметрами.
Оборачиваем его в теги <script> и вставляем на страницу, как в примерах на trirand.com.

2. Если да, то, по-моему, модуль ExcelHtml.php необходимо модифицировать.
Да, в excel по умолчанию будут экспортироваться только голые данные из getDataRows(). Для более сложного поведения следует писать код.
На мой взгляд, это нормально, т.к. в принципе нельзя сделать вариант экспорта, который удовлетворит всех. У меня даже в рамках одного проекта к каждому гриду разные требования. :)

3. Можно ли обойтись без обрамления табличных данных в HTML разметку с целью преобразования в .xls формат?
Все остальные способы намного сложнее. Например, известная библиотека PHPExcel требует тонкой настройки форматирования колонок, медленно работает, жрет тонны памяти и падает на больших data set'ах.
Или COM-объекты. Требуют сервер с виндой и, опять же, тонкого форматирования.

А вот HTML наоборот очень прост и понятен, а также Excel берет на себя целую кучу работы. Например, сам подстраивает ширину колонок под контент.
Передавать JSON - плохая идея. Как правило в таблицах используется постраничная навигация, и передаваться будет только текущая страница. Практически во всех случаях, которые встречались мне, заказчик хочет экспорт всех страниц сразу.
И тут весь вопрос в объемах. Если документ получается на 100 Мб, то при использовании JSON все повиснет. А напрямую с сервера отдастся без проблем.

p.s. Кстати, мне кажется, в строке 78 указанного файла вместо $t .= '</table></body></html>'; необходимо $t .= '</table>'; поскольку в последующем вызове функции output() эти теги будут добавлены.
Ага, спасибо, fixed. Видимо никаких проблем у excel'а это не вызывало, потому никто не жаловался.
 

Serhij Blotskyy

Новичок
При "продвинутом" (advanced) поиске на сервер ajax'ом засылается объект filters. Разобрав его, я сформировал конструкцию where для запроса к базе и результат выборки отослал назад браузеру. Тут у меня отрисовалась отфильтрованная таблица и все довольны.
Теперь я повесил на панель навигации при помощи navButtonAdd дополнительную кнопку экспорта в excel, присоединил к ней два input поля для ввода номеров записей "с" и "до". К кнопке привязал обработчик click'а, который ajax'ом шлет на сервер указанные нач и конечн номера записей для экспорта и перечень полей для отбора из базы. Дальше результаты выборки SELECT'а я успешно оберну в html-теги (сформирую документ), задам соответствующие заголовки, что можно подсмотреть в ExcelHtml.php и перешлю табличные данные MS EXCEL. ТОЛЬКО ВОТ У МЕНЯ НЕЗАДАЧА. Откуда в параметрах таблицы вытянуть данные о примененных фильтрах? Объект filters существовал на момент запроса к серверу на выборку данных, был успешно POST'ом отправлен, серверным скриптом отработан и до свидания. Как я могу на клиентской стороне из параметров Grid'а раздобыть правила фильтрации? Запросом getGridParam('sFilter') и getGridParam('filters') я получаю undefined. Но где-то же эти правила фильтрации хранятся, ведь приперелистывании страниц таблицы серверному скрипту прекрасно отсылается объект filters. ГДЕ ЖЕ ОН в промежутках между запросами? Мне он нужен для экспорта отфильтрованных данных так же, как и отображено на экране.
 

Serhij Blotskyy

Новичок
Вопрос снялся сам по себе. Данные о начальной и конечной записях для экспорта, имя таблицы, перечень полей и т.д. я сформировал в json, дедовским способом (даже без jQuery) создал XMLHttpRequest и указав метод POST send'анул json'а ajax'ом. И, о чудо (!) firebug'ом обнаруживаю в числе отправленных данных объект filters. Я НЕ ОБРАЩАЛСЯ для отправки данных на сервер к Grid'овским методам! Только new XMLHttpRequest, callback на readystatechange, open с url моего php скрипта, setRequestHeader'ы, json.stringify объекта с данными и send. Как в POST'е очутился filters? Таблица в этот момент действительно была предварительно отфильтрована, но ведь явно я нигде не цеплял к отправке правил фильтрации. Конечно, я доволен, но КАК ЭТО ПРОИЗОШЛО?
 

~WR~

Новичок
Ээ, надо код смотреть. :)

Если повезет, то 'filters' будет в getGridParam('postData').filters.
Но не удивлюсь, если он каждый раз формирует с нуля перед отправкой запроса.
 

Serhij Blotskyy

Новичок
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=".$filename.";");
file_put_contents($path, $content);

НЕ ПРОИСХОДИТ НИЧЕГО. Ничто никуда у меня не пишется, никто ни о чем не спрашивает.

При этом $path='php://output'; $filename='test.xls';

$content сформирован в виде
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<table border="1"><tr><td>Frosch</td><td>frosch.jpg</td></tr><tr><td>Mr.Muscle</td><td>mrmuscul.jpg</td></tr></table>
</body>
(Взято из firebug'а )

Что может быть не так?
 

Serhij Blotskyy

Новичок
Отказываюсь от диалога относительно сохранения файла и выбрасываю заголовок Content-Disposition (так как он никакого диалога почему-то и не предлагал и файл не сохранялся И ВООБЩЕ НИЧЕГО). Заголовок убрал, в file_put_contents вместо выходного потока явно вписал имя файла (скажем, test.xls). Содержимое переменной $content теперь сохраняется в указанном файле, но никакого преобразования формата данных в экселевский не произошло. В файле в точности содержится хтмлевская разметка. Можно спокойно менять расширение файла на .html. Excel, естественно, таких данных не воспринимает.
Почему-то не трабатываются заголовки. Все, что касается ввода-вывода на данный момент - это то, что я перед этим считывал сырые POST данные, присланные от пользователя из потока php://input. Но почему это может как-то влиять на вывод в php://output?
 

~WR~

Новичок
Там экспорт должен открываться в скрытом iframe, либо в отдельном окне.
Просто в ответ ajax бесполезно передавать такие заголовки.

Есть функция, которая сама все это делает. Кажется, extExport.
Файл действительно в html. Но Excel вполне в состоянии его прочитать. Попробуйте принудительно его открыть и убедитесь сами. :)
 

Serhij Blotskyy

Новичок
Реализовал простейший способ экспорта в EXCEL. Данные сформировал в CSV формат, но разделителем дал ";" (оказывается, русифицированный EXCEL его по умолчанию воспринимает в качестве разделителя). Приклеил в начале строки данных BOM, указывающий, что дальше utf-8: chr(hexdec("EF")).chr(hexdec("BB")).chr(hexdec("BF")) (поленился вручную определить десятичные значения для трех байтов BOM). Сохраняю в файл .csv. Теперь нет нужды в EXCEL выбирать режим "импортирования данных": в правильной кодировке и с разбивкой по столбцам данные отображаются после обычного двойного клика по имени .csv файла.
 

~WR~

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

P.S. Посмотрите PHPExcel. Он выдает документы в родном формате для любой версии офиса.
 

Sema

Новичок
На счет jqGridPHP и oracle. В моем случае, дело не в гриде, а в соединении с базой.
try {
$dbh = new PDO('OCI:dbname=base', 'user', 'pass');
} catch (PDOException $e) {
echo 'Failed to obtain database handle: ' . $e->getMessage();
}

Failed to obtain database handle: could not find driver.
 

xxxpinoxxx

Новичок
А как изменить тему оформления, ну например под twitter bootstrap? Как я понимаю jqgrid интегрирован с ui-themes, и максимум что можно, поменять стили не выходя за рамки ui? А если требуется изменть имена классов, то получается, что необходимо писать либо скрипт, который будет удалять ui-стили и добавлять свои, либо придется ковыряться в самом плагине... Может кому приходилось решать эту проблему?
 

~WR~

Новичок
Насчет PDO - специально есть ссылка в документации по установке.
http://php.net/manual/en/pdo.installation.php

Здесь описано, как подключить нужные драйверы.

Насчет темы оформления. У jQuery UI есть отличная вещь, в которой можно создать свой собственный стиль:
http://jqueryui.com/themeroller/

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

MaklauT

Новичок
Доброго времени суток! интересует вопрос интеграции jqgridphp c CMS, в частности с е107.
Вообщем проблема состоит в том, что при подключении хедеров движка
PHP:
require_once(HEADERF);
перестает работать выборка из базы.
предполагаю что это изза того , что е107 использует собственное апи для работы с базой. хотя с другой стороны при подключении файлов самого движка ничего подозрительного не происходит, данные загружаются таблица работает нормально.
Так вот сам вопрос: Как подружить jqgridphp с е107?
 

morozzz

Новичок
Делаю обработку ошибок через исключения в операциях редактирования, добавления, удаления так:
PHP:
throw new jqGrid_Exception('Ошибка!!!');
При редактировании возвращается корректный json c ошибкой в 'error_msg'
Но окно закрывается и я не вижу этих ошибок на экране.
Как мне отобризить полученные от сервера ошибки в модальном окне? И почему оно закрывается если есть ошибки?

Прошу прощения, данный код не показывает ошибки только при использовании в методе opDel. Почему то ни в какую не хочет показывать ошибку, а закрывает модальное окно и обновляет грид...
Что это может быть?
 

~WR~

Новичок
На стороне php все правильно. Ищем проблемы на стороне клиента.
Возможно, не подключен jqgrid-ext.js, либо еще каким-то способом переопределен errorHander.

Also, есть маленькая вероятность, что tony как-то поменял обработку ошибок в последней версии.
На всякий случай - какая версия jqGrid используется?
 

morozzz

Новичок
На стороне php все правильно. Ищем проблемы на стороне клиента.
Возможно, не подключен jqgrid-ext.js, либо еще каким-то способом переопределен errorHander.

Also, есть маленькая вероятность, что tony как-то поменял обработку ошибок в последней версии.
На всякий случай - какая версия jqGrid используется?
jqgrid-ext.js подключен. да и ведь через opEdit, opAdd, operData всё срабатывает

Как узнать какая версия используется?
 
Сверху