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

klev2004

Новичок
morozzz
PHP:
            'id'      =>array('label' => 'Id',
                                'width' => 100,
                                'hidden'=> true,
                                'editable' => true,
                                'editrules' => array('edithidden' => true),
                                ),
 

~WR~

Новичок
Добрый день. Подскажите как реализовать: есть столбец с раскрывающемся списком сортировки (Все, 1996, 1997, и т.д.). Необходимо что бы при первоначальном выводе таблицы отображалось только одно значение (например "1996"), а затем пользователь мог выбирать любое другое значение из раскрывающегося списка.
Спасибо.
Вот действительно нетривиальная задача, как ни странно.
Самый простой, но чуток костыльный вариант:

1. Ставим defaultValue в свойства выпадающего списка.
PHP:
'searchoptions' => array('value' => ..., 'defaultValue' => '1996'),
2. Добавляем принудительную передачу параметра при обновлении грида:
PHP:
'searializeGridData' : function(data)
{
    data.year = $('#gs_year').val();
    return data;
}
Так будет работать.
Главная проблема в том, что первый запрос рядов таблицы обязательно происходит без поиска.
Повлиять на этот процесс можно в нескольких местах, но хук serializeGridData - самый простой и короткий путь.
 

Jnas

Новичок
Добрый день. Подскажите как реализовать: есть столбец с раскрывающемся списком сортировки (Все, 1996, 1997, и т.д.). Необходимо что бы при первоначальном выводе таблицы отображалось только одно значение (например "1996"), а затем пользователь мог выбирать любое другое значение из раскрывающегося списка.
Спасибо.
В прошлой версии я делал так, к примеру
PHP:
			'status'   =>array('label' => 'Статус',
								'width' => 2,
								'align' => 'center',
								'db' => "po4ta_status.status_zakaza",
								'stype' => 'select',
								'searchoptions' => array('value'=> new jqGrid_Data_Value(array("FALSE" => "В пути" , "TRUE" => "Доставлен"))),
								'editable' => false, //id is non-editable
								),
и в настройках grid , где указываем базу данных ,$jq_loader и т.д. указывал добавлял строку
PHP:
$_REQUEST['status'] = "FALSE";
чуть коряво конечно, но работает))
 

morozzz

Новичок
А как я могу добавить в начале и/или в конце ячейки некий код html в зависимости от значения этой или иной ячейки.
Т.е. у меня есть ячейка с checkbox при редактировании, мне нужно вывести графическое изображение рядом с ним в зависимости от его состояния!
Такое возможно?
 

Slavko

Новичок
А как я могу добавить в начале и/или в конце ячейки некий код html в зависимости от значения этой или иной ячейки.
Т.е. у меня есть ячейка с checkbox при редактировании, мне нужно вывести графическое изображение рядом с ним в зависимости от его состояния!
Такое возможно?
Можно js-ивент beforeShowForm использовать.
var opts = { 'beforeShowForm' : function(formid) {…} };
 

klev2004

Новичок
А как я могу добавить в начале и/или в конце ячейки некий код html в зависимости от значения этой или иной ячейки.
Т.е. у меня есть ячейка с checkbox при редактировании, мне нужно вывести графическое изображение рядом с ним в зависимости от его состояния!
Такое возможно?
Если я правильно понял вопрос, тогда попробуйте так:

PHP:
'Name'      =>array('label' => 'Name',
                                ...
                                'formoptions' => array('elmsuffix' => '<img src="http://..." title="..." alt="..." >'),                                
                                ),
 

morozzz

Новичок
Если я правильно понял вопрос, тогда попробуйте так:

PHP:
'Name'      =>array('label' => 'Name',
                                ...
                                'formoptions' => array('elmsuffix' => '<img src="http://..." title="..." alt="..." >'),                                
                                ),
Всё правильно поняли, спасибо, работает.
Но если мне допустим нужно вывести различное изображение в зависимости от значения данного параметра.
Я подставил в 'elmsuffix' нужную мне функцию которая возвращает данные в html, это работает. Но не могу понять как мне получить в этой функции значение данной ячейки, чтобы от него разрулить что мне возвращать?
 

klev2004

Новичок
Всё правильно поняли, спасибо, работает.
Но если мне допустим нужно вывести различное изображение в зависимости от значения данного параметра.
Я подставил в 'elmsuffix' нужную мне функцию которая возвращает данные в html, это работает. Но не могу понять как мне получить в этой функции значение данной ячейки, чтобы от него разрулить что мне возвращать?
Можно попробовать напрямую обращаться к значению в ячейке:

PHP:
'Name'      =>array('label' => 'Name',
                                ...
                                'formoptions' => array('elmsuffix' => '<input type="button" onClick="document.FormPost.Имя_Ячейки_С_Информацией.value = Function(); >'),                                
                                ),
Не знаю как у вас организовано, но смысл должен быть понятен.
 

~WR~

Новичок
Самый простой вариант - вызвать:
PHP:
$('.ui-jqdialog').find('#col_name').val();
Или, действительно, в beforeShowForm. Там передается объект формы в аргументе.
PHP:
beforeShowForm: function($form)
{
    var value = $form.find('#col_name').val();
    $form.find('#col_name').after('My fancy suffix for value: ' + value);
}
Если реально какие-то сложные случаи - не нужно стесняться простого jQuery.
В этом всегда будет принципиального отличие от того же ExtJS, где если для чего-то нет выделенной функции, то тушите свет.
 

morozzz

Новичок
Самый простой вариант - вызвать:
PHP:
$('.ui-jqdialog').find('#col_name').val();
Или, действительно, в beforeShowForm. Там передается объект формы в аргументе.
PHP:
beforeShowForm: function($form)
{
    var value = $form.find('#col_name').val();
    $form.find('#col_name').after('My fancy suffix for value: ' + value);
}
Если реально какие-то сложные случаи - не нужно стесняться простого jQuery.
В этом всегда будет принципиального отличие от того же ExtJS, где если для чего-то нет выделенной функции, то тушите свет.
Прошу прощения, но никак не могу сообразить куда я должен поместить код beforeShowForm... к сожалению в jQuery не силен.
Пробовал сделать так для примера
PHP:
var opts = {beforeShowForm: function($form)
		{
		    var value = $form.find('#show_object').val();
		    $form.find('#show_object').append('My fancy suffix for value: ' + value);
		}};
что-то не сработало :(
размещал в месте перед выводом $loader->render($grid_name);
Насколько я понял он получает значение ячейки, тока в каком виде? Как в базе или html (если например у меня значение ячейки checkbox).

Было бы неплохо на серверной стороне иметь возможность получать значения для каждой ячейки из базы как они есть и на основе его подставлять нужное в 'elmsuffix'.
Интересует оба варианта решения, поэтому обрисую что конкретно нужно:
Есть поле в базе с названием show_i значение 1 или 0,
нужно в форме редактирования вывести её в виде checkbox,
делаю модель
PHP:
'show_object'  => array('label' => 'Показать',
                                   'db' => 'object.show_i',
                                   'width' => 50,
                                   'hidden' => true,
                                   'editable' => true,
                                   'encode' => false,
                                   'edittype' => "checkbox",                                   
                                   'editrules' => array('required' => true,
                                                     'edithidden' => true,

                                                    ),
                                   'formoptions' => array('elmsuffix' => '<img src="/assets/img/button_red.gif'"),
                                   ),
а в 'elmsuffix' мне нужно в зависимости от значения 1 или 0 добавить картинку с 'button_green.gif' или 'button_red.gif' соответственно.
Если не сложно опишите на jquery как сделать и куда разместить. Или нужен метод или т.п. как через PHP получить данные если такое существует...
 

~WR~

Новичок
1. Добавляем колонку show_i в colModel с флагом hidden=true.

2. Добавляем JS-код после $rendered_grid.
PHP:
$grid.bind('jqGridAddEditBeforeShowForm', function(event, $form)
{
    var row_id = $(this).getGridParam('selrow');
    var color = $(this).getCell(row_id, 'show_i') ? 'green' : 'red';

    $form.find('#show_object').after('<img src="/asserts/img/button_ ' + color + '.gif">');
});
3. Profit!

Форма целиком формируется на стороне клиента и использует те данные, которые уже были загружены.
Если данных из основных колонок не хватает, то их можно добавить через скрытые колонки.
Реально удобнее и проще, чем ajax-запросы за каждой мелочью.
 

neiron

Новичок
Прошу помощи так сказать в азах:
1. Установку проводил по инструкции http://jqgrid-php.net/doku.php?id=wiki:install
2. Проект имеет следующую структуру:

3. Создан класс для таблицы User:
PHP:
class User extends jqGrid
{
    protected function init()
    {
        #Set database table
        $this->table = 'User';

        #Make all columns editable by default
        $this->cols_default = array('editable' => true);

        #Set columns
        $this->cols = array(
            
            'id'        =>array('label' => 'ID',
                                'width' => 10,
                                'align' => 'center',
                                'editable' => false, //id is non-editable
                                ),

            'first_name'=>array('label' => 'First name',
                                'width'	=> 35,
                                'editrules' => array('required' => true),
                                ),

            'last_name' =>array('label' => 'Last name',
                                'width' => 35,
                                'editrules' => array('required' => true),
                                ),
        );

        #Set nav
        $this->nav = array('add' => true, 'edit' => true, 'del' => true);

        #Add filter toolbar
        $this->render_filter_toolbar = true;
    }
4. Содержимое основного index.php файла:
PHP:
require "php/jqGridLoader.php";
	$loader = new jqGridLoader;
	$loader->set("grid_path", 'grids');
	$loader->set("db_driver", "PDO");
	$loader->set("pdo_dsn"  , "mysql:dbname=ХХХХХХХХ;host=localhost");
	$loader->set("pdo_user" , "ХХХХХХХХ");
	$loader->set("pdo_pass" , "ХХХХХХХХ");
	$loader->set('debug_output', true);
	$loader->autorun();
5. Ну и собственно сам вопрос, как же вывести на экран эту самую таблицу User?
Перечитал всю ветку, понимаю, что вопрос детский, но самому никак не получается разобраться. Спасибо.
 

Вложения

morozzz

Новичок
Форма целиком формируется на стороне клиента и использует те данные, которые уже были загружены.
Если данных из основных колонок не хватает, то их можно добавить через скрытые колонки.
Реально удобнее и проще, чем ajax-запросы за каждой мелочью.
Да, отлично, то что нужно.
сделал так же, тока вывел в js уже готовую форму колонки, а саму форму разрулил через parseRow().
Через colModel я так понял не получится, т.к. значения ещё не получены при формирования моделей колонок!

Ещё что-то немогу найти как поставить значение колонки по умолчанию выделенной строки в форме добавления.
Параметр 'defaultValue' даёт возможность указать это только статически.
Или это опять только через jQuery?
 

4aki.zp

Новичок
Доброго времени суток, помогите пожалуйста с экспортом в excel.
Делаю так:

Добавляю кнопку:
PHP:
jQuery("#list").jqGrid('navButtonAdd', '#pager', {
        caption: "", buttonicon: "ui-icon-print", title: "Export",
        onClickButton: function(){
exportExcel();
                                }
});
Сама функция exportExcel() :
PHP:
var mya=new Array();
            mya=$("#list").getDataIDs();
            var data=$("#list").getRowData(mya[0]); 
            var colNames=new Array(); 
            var ii=0;
            for (var i in data){colNames[ii++]=i;}
            var html="";
            for(i=0;i<mya.length;i++)
                {
                data=$("#list").getRowData(mya[i]);
                for(j=0;j<colNames.length;j++)
                    {
                    html=html+data[colNames[j]]+"\\t";
                    }
                html=html+"\\n"; 

                }
            html=html+"\\n"; 
            document.forms[0].csvBuffer.value=html;
            document.forms[0].method='POST';
            document.forms[0].action='Export.php';
            document.forms[0].target='_blank';
            document.forms[0].submit();
Файл Export.php:
PHP:
header('Content-type: application/vnd.ms-excel');
header("Content-Disposition: attachment; filename=file.xls");
header("Pragma: no-cache");

$buffer = $_POST['csvBuffer'];

try{
    echo $buffer;
}catch(Exception $e){

}
проблема в том, что не могу понять где ошибка, т.к. по нажатию кнопки ничего не происходит. До самого скрипта дело даже не доходит. Ошибка как мне кажется где то в этом месте - document.forms[0].csvBuffer.value=html;(потому что тут ничего не определяется), но как с ней бороться я не понимаю.
Спасибо.
 

~WR~

Новичок
Зачем такой геморрой?)

Добавьте в init:
PHP:
$this->nav = array(
    'excel' => true
);
Любой экспорт, в котором участвует клиент, будет неполноценным по определению, т.к. сможет отдать только текущую страницу. А, как правило, хочется все.
 

morozzz

Новичок
Тут уже задавался подобный вопрос пользователем "4aki.zp".
При редактировании записи выдает ошибку "parsererror Status: 'OK'. Error code: 200", в таблице все меняет нормально, но что б увидить надо обновить таблицу... и еще проблема в том что после изменения (нажатия кнопки "Сохранить") данных автоматически не исчезает окно редактирования.
Вы писали что что-то неправильно с возвращаемыми данными, но у меня вроде нет постороннего текста...

Возвращает след ответ:
{ "success": "1" }{ "page": "1", "total": null, "count": "1", "rows": [ { "id": "4", "cell": [ "4", "1", "<img src=\"\/assets\/default\/public\/img\/admin\/button_green.gif\">", "20", "Коттеджи", "тест" ] } ], "userdata": { "agg": { "_count": "1" } } }
Заголовок ответа:
Connection Keep-Alive
Content-Length 264
Content-Type application/json; charset=utf-8;
Date Wed, 26 Sep 2012 20:28:30 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4
X-Powered-By PHP/5.2.4
В firebug отсутствует вкладка JSON, хотя при выводе таблице она есть.

Что я делаю не так?
 
Сверху