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

LorDEreTik

Новичок
Подскажите как сделать свой поиск в jqGrid.
Вот у меня есть поля для быстрого поиска и мне нужно что бы поиск работал по ним по нажатии кнопки.

PHP:
function fastSearch(){

		field = $("#fields").val();
		ifs = $("#ifs").val();
		data_search = $("#data_search").val();
		
		filter = "{\"groupOp\":\"AND\",\"rules\":[{\"field\":\""+field+"\",\"op\":\""+ifs+"\",\"data\":\""+data_search+"\"}]}";

		$.post(
			'getdata.php',         
			{_search: "true", filters: filter, page: 1, rows: 100, sidx: "id", sord: "asc"},
			function(json){
				jQuery("#list").trigger('reloadGrid');
			}
		);
		
		
}
Но у меня reloadGrid не подхватывает параметры. как сделать что бы отправлялись именно мои данные для поиска.
 

vergiliy_88

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

Пробывал узнать номер выбранного элемента в селекторе "стран", но что дальше с ним делать не придумал. вот код

'podr' => array('label' => 'Страны',
'width' => 0,
'editable' => true,
'editrules' => array('required' => true),
'edittype' => 'select',
'editoptions' => array('value'=> $country,'width' => 35,

'dataInit' => new jqGrid_Data_Raw('function(el){

$(el).change( function() {

tek=$(this).val() ;
alert(tek);
});

}')

),

),
 

it.dev

Новичок
Добрый день. Внимательно прочитал все 37 страниц топика, но так и не понял как правильно и эффективно передавать во вложенный грид значение ID родительской записи при использовании вложенных (subgrid) гридов.
Вот на 5-й странице топика ответ разработчика на похожий вопрос: ответ Но где и как должен быть использован этот код - не понятно.
В своей задаче я использую пример: пример subgrid. В этом примере метод renderComplete вообще не используется.

Соответственно вопрос: как необходимо доработать выше указанный пример с вики, чтобы при добавлении новой записи во вложенный грид в поле UnitID подставлялось ID родительской записи.
Моя реализация:
Мастер-грид:
PHP:
<?php

class jqUnit extends jqGrid
{
    protected function init()
    {
        require 'options.php';
        
        $this->table = 'Unit';
        
        $GridOptions['caption'] = 'Единицы измерения';
        
        $this->options = $GridOptions;
                        
 
        $this->cols = array(
            'ID'          => array('label' => 'ID',
                                   'width' => 50,
                                   'align' => 'center',
                                   ),
 
            'Name'  => array('label' => 'Наименование',
                                   'width' => 100,
                                   'editable' => true,
                                   'editrules' => array('required' => true),
                                   'editoptions' => array('size' => 26),
                                   ),
            'Measure'  => array('label' => 'Мера',
                                   'width' => 100,
                                   'editable' => true,
                                   'editrules' => array('required' => true),
                                   'editoptions' => array('size' => 26),
                                   ),
 
            'Comment'   => array('label' => 'Комментарий',
                                   'width' => 200,
                                   'editable' => true,
                                   'edittype' => 'textarea',
                                   'editoptions' => array('size' => 30),
                                   ),
 
        );
        
        #Set nav
        $NavOptions['prmAdd'] = array('width' => 310, 'viewPagerButtons' => false);
        $NavOptions['prmEdit'] = $NavOptions['prmAdd'];
        $this->nav = $NavOptions;

        #Add filter toolbar
        $this->render_filter_toolbar = true;
    }
    
    protected function opRenderSubgrid()
    {
        echo $this->Loader->render('jqUnitParameters', array('unitid' => $this->input('unitid')));
        exit;
    }
    
    protected function opEdit($id, $upd)
    {
        return true;
    }
}
Сабгрид:
PHP:
<?php

class jqUnitParameters extends jqGrid
{
    protected function init()
    {
        require 'options.php';
        
        
        $GridOptions['caption'] = 'Параметры';
        $GridOptions['rowNum'] = 5;
        $GridOptions['width'] = 500;
        $GridOptions['height'] = 120;
        
        $this->options = $GridOptions;
        
       // $this->options = array('rowNum' => 5, 'width' => 600, 'height' => 110);
        
        $this->render_extend = '{}';
        $this->render_suffix_col = 'unitid';

        #Set database table
        $this->table = 'UnitParameters';

        $this->query = "
            SELECT {fields}
            FROM UnitParameters up
            WHERE {where}
        ";

        $this->cols_default = array('align' => 'center');                
 
        $this->cols = array(
            'ID'          => array('label' => 'ID',
                                   'width' => 50,
                                   'align' => 'center',
                                   ),
            'UnitID'          => array('label' => 'UnitID',
                                   // 'hidden' => true,
                                   'width' => 50,
                                   'editable' => true,
                                   'editrules' => array('required' => true),
                                   'align' => 'center',
                                   'editoptions' => array('size' => 26)
                                   ),
 
            'Name'  => array('label' => 'Наименование',
                                   'width' => 100,
                                   'editable' => true,
                                   'editrules' => array('required' => true),
                                   'editoptions' => array('size' => 26),
                                   ),

 
            'Comment'   => array('label' => 'Комментарий',
                                   'width' => 200,
                                   'editable' => true,
                                   'edittype' => 'textarea',
                                   'editoptions' => array('size' => 30),
                                   ),
 
        );
        
        #Set essential condition
        $this->where[] = 'unitid = ' . intval($this->input['unitid']);
        
        #Set nav
        $NavOptions['prmAdd'] = array('width' => 310, 'viewPagerButtons' => false);
        $NavOptions['prmEdit'] = $NavOptions['prmAdd'];
        $this->nav = $NavOptions;

        #Add filter toolbar
        $this->render_filter_toolbar = false;
    }
    
   
    #prevent common html rendering
    protected function renderHtml($data)
    {
        return '';
    }

}
Просьба ногами сильно не пинать, я только осваиваю PHP и эту библиотеку.
 

~WR~

Новичок
По диагонали посмотрел.
Попробуйте вот так определить prmAdd:
PHP:
$NavOptions['prmAdd'] = array('width' => 310, 'viewPagerButtons' => false, 'editData' => array('unitid' => intval($this->input('unitid')));
 

Silentium

Новичок
Привет здесь!
1)Не подскажите как прикрутить в setGroupHeaders параметр useColSpanStyle: true?
2) Как сделать аналог beforeShowForm: function($form) {
$('#tr_modtime').hide(); } в окнах add\edit ?
3)в примере по добавлению файла изображения приведены примеры с jpg,png,gif. Можно как то настроить, допустим, проверку и обработку только архивных файлов с расширениями .tar.gz, .bz2 и обойти все параметры с расширением изображения и тд? Или нужно писать свой обработчик?
 
Последнее редактирование:

igor.old

Новичок
Имеется таблица:
PHP:
	$("#Projects").jqGrid({
        url:scriptName+'/default/project/getprojects',
        datatype: 'clientSide',
        mtype: 'POST',
        colNames: []
.......
Перегружаю таблицу через функцию:
PHP:
		var table = $('#Projects');
		table.setGridParam({datatype:'json'});
		table.trigger('reloadGrid');
При выполнении функции по URL, я проверяю авторизацию и если она истекла, то мне надо передать параметр, по которому выполнять функцию перерегистрации в системе.
Т.е. вместо json-данных передать что-то типа {"page":1, "event":"relogin"}
Как узнать - имеется ли параметр "event" в возвращаемых данных?

Даже не могу по 'alert' выдать - что приходит для построения таблицы ... где это взять?
На стороне php-функции я могу посмотреть, что передается, но как это отловить уже на стороне jqgrid?
 

igor.old

Новичок
Поставил новую версию jqgrid jquery.jqGrid-4.5.4 и получил сообщение, что setPostData - нет такой функции ... в дистрибутиве в файле plugins/grid.postext.js нашел такую функцию
Про то, что этот файл надо подключать к скрипту, ничего не написано ... какие там еще "пасхальные яйца" есть?
 

DimensionSlider

Новичок
День добрый. Можете подсказать, возможно ли в качестве фильтра по колонке использовать собственную конструкцию WHERE?
У меня в таблице несколько колонок, это результаты подзапроса.
В частности фильтровать по ним не выходит, т.к. таких колонок нет в исходной таблице.

Column not found: 1054 Unknown column 'from_name' in 'where clause'

PHP:
'from_name'         => array(
				'label'         => 'Имя',
				'width'         => 170,
				'align'         => 'center',
				'editable'      => false, 
				'search_op'     => 'like', 				
				'stype'         => "select",
				// 'stype' => "text",
				'searchoptions' => array(
						'value' => new jqGrid_Data_Value( $contact_names_from, 'Все' ),
						),		
				),
Пробовал сделать Вьюшку (View) и отбирать из неё, запрос работает вместо 1.5 сек, 59 сек.
Пробовал сделать SELECT {fields} FROM ( основной запрос как вложенный ) mainquery, время тоже увеличивается до 50 сек.

Решается так

jqGridPHP - WR (14:51:07 30/10/2013)
просто другие СУБД умеют хорошо оптимизировать такие вещи
переносить условия выше или ниже
тогда...
можно перегрузить search()
в него добавить особый код, который сделает

PHP:
$this->where[] = "id IN (SELECT id FROM ...)";
скорее всего, таких колонок одну-две
кстати... подумал
sub-select же можно делать через свойство 'db'
например:
PHP:
'foo' => array(
   ...
    'db' => '(SELECT something)',
),
по идее, при таком раскладе должен работать и поиск, и выборка
единственное, поиск будет только как =
для IN, возможно, нужно будет написать кастомный searchOp
но это ерунда - там две строчки
посмотрите, какой запрос он собрал
видно в firebug
в ответе есть ключ debug
в нем прямо запросы, которые посылались к серверу


jqGridPHP - WR (15:23:00 30/10/2013)
так.. идея search() в том, что он просто заполняет массив $this->where кусочками SQL
которые затем объединяются AND'ами и подставляются в запрос на место where
{where}
можно перегрузить эту функцию и написать какую угодно кастомную логику
главное, чтобы в конце $this->where был заполнен тем, чем нужно :)
хоть sub-select'ами, хоть чем


jqGridPHP - WR (15:37:28 30/10/2013)
можно сделать вот как
поставить таким колонкам 'search_op' => 'ignore'
они тогда не будут обрабатываться обычным search
после этого сделать вот такое

PHP:
protected function search()
{
    parent::search(); //обработать все обычные колонки

    if ($this->input('my_mega_col'))
    {
        $this->where[] = 'my_mega_col IN (SELECT ... ')';
    }
}
только аккуратнее с SQL-инъекциями)
есть метод $this->DB->quote()
он очищает строки и одевает их в кавычки
 
Последнее редактирование:

Mobel

Новичок
Наткнулся на проблему с постраничным выводом большого списка файлов в таблице.
Взял за основу пример загрузки из http://jqgrid-php.net/doku.php?id=wiki:data-other
При кликах на кнопки видно, что пагинатор устанавливает номер страницы и размер выборки, но в таблице выводятся всегда первые записи, которые должны быть на первой странице.
Как я понимаю, как-то надо дать знать общее количество записей в списке и что-то перегрузить для отбора нужной порции строк.
Подскажите, что искать?
 

drbr

Новичок
Здравствуйте, ребят, а может кто выложит архив с чистоустановленным jqGridPHP все никак не могу разобраться как ставить :( или за $ кто может поможет сделать обычную таблицу (база клиентов), нужно добавление/удаление/редактирование ячеек. А то уже неделю ковыряюсь никак не получается поставить, сначала просто с jqGrid мучался потом c jqGridPHP, так и не разобрался никак.
 

drbr

Новичок
Вроде немного разобрался, сейчас вылазит ошибка:

Fatal error: Class 'jqGrid_DB_Pdo' not found in Z:\home\****.net\www\jqGridLoader.php on line 126

Подскажите как решить, пожалуйста.
 
Последнее редактирование:

Silentium

Новичок
Добрый всем день! А может еще кто знает как настроить PDO для подключения к нескольким базам данных?
Например , есть параметр pdo_dsn в котором надо прописывать dbname параметр, но не понятно как в рамках этого плагина переключаться на другую базу данных или вообще выполнить например скрипт CREATE DATABASE
 

Silentium

Новичок
С этим я разобрался. Я имел ввиду как оперировать классами которые используются для описания PDO в PDO.php, DB.php. Т.е мне нужно в разных участках кода подключаться к разным бд, но сейчас конфиг настроен только на одну из них.
 

Silentium

Новичок
Пока мне это не очень понятно. Тогда еще вопрос, добавляю функцию opAdd
protected function opAdd($data)
{
//create empty data base;
$jq_loader = new jqGridLoader();
$jq_loader->set('grid_path', 'grids/');
$jq_loader->set('pdo_dsn', $_CONFIG['pdo_dsn']);
$jq_loader->set('pdo_user', $_CONFIG['pdo_user']);
$jq_loader->set('pdo_pass', $_CONFIG['pdo_pass']);
$jq_loader->set('debug_output', true);
require 'phases/phase1.php';
$lib = new load_map($jq_loader);
$lib->create_db($data['map_name']);
$lib->add_legacy();
$lib->add_legacy_gist();
return parent::eek:pAdd($data);
}
База создается, вместе с записью. Но перестало пропадать окно Add, т.е параметр 'closeAfterAdd' =>true, не отрабатывает.
Как выводить после нажатия на Submit сообщение что запись добавлена и после этого закрывать модальное окно с Add?
 

Silentium

Новичок
Задался еще одним вопросом, как повесить на кнопку delete, которая удаляет запись по id из таблицы, событие, которое будет проводить выборку типа "select name from mytable where id=$id" перед удалением и записывать куда нить в переменную результат
 

Nekton

Новичок
Нужно переопределить opDel.
PHP:
    protected function opDel($id)
    {
          # выполнить select и сохранить результат
          ...
          parent::opDel($id);
    }
 

demeshko

Новичок
Можно. Из-за особенностей CSS таблиц, проще всего в parseRow вызывать php-функцию wordwrap и явно переносить символом \n.
Есть и другие варианты, но с этим меньше всего проблем.

Здравствуйте!
Добавил в parseRow
protected function parseRow($r)
{
$r['dept_name']= wordwrap($r['dept_name'],10, "\n",true);
return $r;
}

но переноса нет, в title появился...может еще что-нибудь добавить...
 
Сверху