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

~WR~

Новичок
Может, не хватает точки с запятой после закрывающей фигурной скобки.
 

XDeveloper

Новичок
~WR~
Подскажите пожалуйста с formatter. Вот у меня есть колонка, и мне нужно что бы я сам форматировал отображаемое её содержимое в функции. Если я это делаю в методе parseRow то у меня в результате не правильно работает поиск. Как сделать что бы всё было нормально? (мне нужно в начало поля добавить картинку которая зависит от содержимого поля).
Вроде как то можно предавать функцию в эту оптицию, но не как не пойму. Дайте пожалуйста с примером ответ.

И ещё такой вопрос.У меня есть поле: 'sToCurrency' => array(
'label' => 'Валюта',
'db' => "CONCAT(tb.sTitle, ' ', tc.sEquivalent)",
'editable' => true,
'edittype' => 'select',
'editoptions' => array(
'value' => $aSelectOptions
),
'formatter' => 'ToCurrencyFormmater'
),

Мне нужно сделать что бы его нельзя было изменять при редактировании, что бы можно было при создании создавать его а изменять в процессе нельзя было. как сделать?
 

DeepNN

Новичок
~WR~
Доброго времени суток !
Обновил файлы библиотеки до последней версии, чтобы можно было работать с Primary key.
В случае, когда грид основан на одной таблице - Primary key редактируется и все остальное работает замечательно.
А вот в главном гриде, основанном на запросе из нескольких таблиц, перестали отрисовываться данные.
Т.е. от сервера они приходят, это видно в Firebug, но грид остается пустой.
Если под новый PHP-код подложить старую jqgrid-ext.js, то тогда данные в гриде отображаются, но перестают отображаться данные при разворачивании соответствующих subgrid-ов.

Из-за чего это может быть ?
 

XDeveloper

Новичок
~WR~
Подскажите пожалуйста, вот я включил опцию cellEdit = true, а в обработчике jqEdit выбрасываю исключение вида throw new jqGrid_Exception( 'сообщение' ) но при изменении поля не вылазит ошибок. Подскажите, как сделать что бы я мог следить за тем что редактируют и выбрасывать исключения тексты которых будут показываться?
 

Nekton

Новичок
PHP:
<script>
    var opts = { 
        'subgrid': true,
    }
    <?= $users_grid ?>
</script>

<script>
    var opts = { 
       'width': 500,
    }
    <?= $clients_grid ?>
</script>
Почему-то у меня такой способ не работает.
Возможно, причина в запятых после значений. Это в PHP можно после последнего значения в массивах ставить запятую, а JS после запятой ищет еще значение и не находит.
 

Nekton

Новичок
PHP:
ondblClickRow: function(id)
{
    $(this).editGridRow(id);
}
Если вы меняли в Pager параметры формы, например, ширину
PHP:
 $this->nav = array(
    'edit' => true,
    'prmEdit' => array(
        'width' => 400,
    ),
);
то нужно эти же параметры задать в ondblClickRow:
PHP:
ondblClickRow: function(id)
{
    $(this).editGridRow(id, {"width":"400"});
}
 

~WR~

Новичок
Если я это делаю в методе parseRow то у меня в результате не правильно работает поиск.
По идее, parseRow никак не влияет на поиск, только на вывод. Грубо говоря, если сделать вот так:
PHP:
protected function init()
{
    $this->cols = array(
        ...
        'my_col' => array(
            'encode' => false,
        ...
    );
}

protected function parseRow($r)
{
    $r['my_col'] = '<img src="/images/lalala.png">' . $r['my_col'];
    return $r;
}
- то поиск по-прежнему будет идти по чистому my_col, а вывод будет с картинкой.
Encode = false для того, чтобы чистый html пропустило с сервера.

Мне нужно сделать что бы его нельзя было изменять при редактировании, что бы можно было при создании создавать его а изменять в процессе нельзя было. как сделать?
Можно повесить событие на показ формы. Один из его аргументов - тип операции (add или edit). Если тип edit, то скрываем ненужные поля. Примерно так:
PHP:
$grid.bind('jqGridAddEditBeforeShowForm', function(e, $form, type)
{
    if(type == 'edit') {
        $form.find('#my_col').closest('TR').hide();
    }
});
 

~WR~

Новичок
DeepNN, это интересный вопрос. Прицепите пример ответа от сервера, и как определен primary_key.
По большому счёту, эта правка никак не должна влиять на client side, за исключением одной маленькой детали: при редактировании id теперь передается как _id (с подчеркиванием). Но эта настройка тоже с сервера приходит.
 

~WR~

Новичок
Насчет ошибок при cellEdit. Тоже интересный момент. Помню, когда-то давно я забил на эту тему, т.к. этот тип редактирования работал странно. Но теперь есть события.
Попробуйте вот так:
PHP:
$grid.bind('jqGridAfterSubmitCell', function(e, res)
{
    if (res.error) {
        return [false, res.error_msg];
    }

    retun [true, ''];
});
 

XDeveloper

Новичок
Ещё вопрос, я вот хочу сделать что бы поле нельзя было редактировать, но при добавлении записи оно было. Как сделать?
 

XDeveloper

Новичок
Насчет ошибок при cellEdit. Тоже интересный момент. Помню, когда-то давно я забил на эту тему, т.к. этот тип редактирования работал странно. Но теперь есть события.
Попробуйте вот так:
PHP:
$grid.bind('jqGridAfterSubmitCell', function(e, res)
{
    if (res.error) {
        return [false, res.error_msg];
    }

    retun [true, ''];
});
Не работает, в res нет error :-( Хотя в методе optEdit делаю throw new jqGrid_Exception('test');
 

~WR~

Новичок
А что есть?) Там аж 7 аргументов, по-моему.
Можно посмотреть через консоль firebug как-то так:

PHP:
$grid.bind('jqGridAfterSubmitCell', function(e, res)
{
    console.dir(arguments);
    retun [true, ''];
});
 

DeepNN

Новичок
~WR~ написал(а):
DeepNN, это интересный вопрос. Прицепите пример ответа от сервера, и как определен primary_key.
Вот один из тестовых гридов.

Ответ от сервера :
PHP:
{ "page": "1", "total": "1", "records": "3", 
   "rows":
     [{ "id": "122", "cell": [ "122", "2012-07-11", "Выдана", "МАЛЬЦЕВ", "ВАСИЛИЙ", "НИКОЛАЕВИЧ", "2201", "", "ДО1", "2012-07-16", "2012-07-16" ] }, 
      { "id": "812", "cell": [ "812", "2012-08-04", "Выдана", "МАЛЬЦЕВ", "АЛЕКСАНДР", "АЛЕКСЕЕВИЧ", "42527", "", "ДО1", "2012-08-30", "2012-08-30" ] }, 
      { "id": "3042", "cell": [ "3042", "2012-11-30", "Выдана", "МАЛЬЦЕВ", "АЛЕКСАНДР", "АЛЕКСАНДРОВИЧ", "42577", "", "ДО1", "2012-12-03", "2012-12-03" ] }
     ], 
   "userdata": { "agg": { "_count": "3" } }, 
   "debug": 
     { "query_agg": "\n\t\t\t\t\t\tSELECT \tcount(*) AS _count\n\t\t\t\t\t\tFROM production_list \n\t\t\t\t\t\t\t\t\tLEFT JOIN prod_statuses ON production_list.STATUS_ID=prod_statuses.STATUS_ID \n\t\t\t\t\t\t\t\t\tLEFT JOIN bank_offices AS BO1 ON production_list.LOCATION_OFFICE_ID=BO1.OFFICE_ID \n \t\t\t\t\t\tWHERE LAST_NAM LIKE '%мальцев%'\n\t\t\n\t\t", 
       "query_rows": "\n\t\t\t\t\t\tSELECT \tRECORD_ID, PROD_DATE, STATUS_NAME, LAST_NAM, FIRST_NAM, FATHER_S_NAM, DEPART_CODE, NOTE, BO1.OFFICE_NAME AS LOCATION, LAST_MOD_DATE, OUT_DATE\n\t\t\t\t\t\tFROM production_list \n\t\t\t\t\t\t\t\t\tLEFT JOIN prod_statuses ON production_list.STATUS_ID=prod_statuses.STATUS_ID \n\t\t\t\t\t\t\t\t\tLEFT JOIN bank_offices AS BO1 ON production_list.LOCATION_OFFICE_ID=BO1.OFFICE_ID \n \t\t\t\t\t\tWHERE LAST_NAM LIKE '%мальцев%'\n\t\t\n\t\tORDER BY RECORD_ID asc\nLIMIT 100 OFFSET 0\n" }
 }
Primary_key в таблице в БД - это поле RECORD_ID.
Пробовал определять как
PHP:
$this->primary_key = 'RECORD_ID';
а также не указывать эту строку, на результат это не влияет -
грид пустой.
 

XDeveloper

Новичок
Подскажите пожалуйста, как мне на клиентской части сделать так что бы при редактировании колонки (в событии jqGridAfterSubmitCell) у нас обновлялась полностью строчка где это изменение произошло (соседние колонки заново скачивались с сервера)?
 

XDeveloper

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

~WR~

Новичок
Насчет пустого грида. Я в пятницу столкнулся с одним любопытным случаев.
В двух словах, попробуйте в jqGrid.php найти (2 раза):
PHP:
echo jqGrid_Utils::jsonEncode($obj);
Заменить на:
PHP:
echo json_encode($obj);
Если сработает, то так и оставьте.

Подскажите пожалуйста, как мне на клиентской части сделать так что бы при редактировании колонки (в событии jqGridAfterSubmitCell) у нас обновлялась полностью строчка где это изменение произошло (соседние колонки заново скачивались с сервера)?
Специально чтобы не думать об этом, стараюсь делать полный рефреш страницы грида после редактирования. Удобно, голова не болит.
PHP:
$grid.trigger("reloadGrid", [{current:true}]);
Без полного обновления тоже можно сделать, но больше мороки. Нужно вернуть от сервера изменившиеся значения и проставить их в конкретные ячейки через $grid.setCell.
 

~WR~

Новичок
Подскажите пожалуйста, при выпрыгавании окна редактирования, как сделать его по центру экрана и в размерах побольше?
В init() прописать:
PHP:
$this->nav = array(
    'edit' => true,
    'editttext' => 'edit',
    'prmEdit' => array(
        'width' => 700,
        'left' => 400,
        'top' => 300,
    ),
);
Для формы добавления новой записи будет 'prmAdd'.
Полный список параметров живёт здесь: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing

Можно то же самое сделать на стороне клиента:
PHP:
$.extend($.jgrid.edit, {
    width: 700,
    left: 400,
    top: 300
});
 

BeerDrinkings

Новичок
Здравствуйте уважаемый Wild -=R@ID=
Пока мои успехи сводятся к тому, что удалось открывать окно по клику в INPUT, и в него вывести <select>
следующим кодом:
PHP:
$('#gs_city').bind('click', function() {$($('<div id="gs_sel1"><select id="gs_sel2" style="width: 100px; height: 60px;">
</select></div>').appendTo('body')).dialog()});
но данные из массива в <select> не выводятся и он пустой
PHP:
$grid.extRequest({
    oper: 'get_city_list',
    letter: 'a'
}, {
    success: function(ret)
    {
        $('#gs_sel2 OPTIONS').remove();

        for(var i in ret.list)
        {
            $('#gs_sel2').append(ret.list[i].city_name);
        }
    }
});
Подскажите пожалуйста, что я делаю не так. И подробнее о том как работает функция $grid.extRequest.
Заранее благодарен.
 

vasill9

Новичок
Уважаемый ~WR~ помогите пожалуйста

Создаю таблицу
PHP:
<?php

class jqOutSearch2 extends jqGrid
{
    protected function init()
    {
        $this->nav = array(

            'edit' => true,
            'del' => true,
            'view' => true,
			'add' => true,

            'prmEdit' => array('width' => 400,
                'bottominfo' => 'Custom info came from PHP!',
                'viewPagerButtons' => false),
        );
        $user_country = $this->getCountry();
        $user_city = $this->getCity();
        $this->table = 'user';
        $this->cols = array(

            'id' => array('label' => 'ID',
                'db' => 'id',
                'width' => 5,
                'align' => 'center',
                'formatter' => 'integer',
                'editable' => true,
                'editrules' => array('required' => true),
                'search_op' => 'in', 
            ),

           'username' => array('label' => 'Имя',
                'db' => 'username',
                'width' => 10,
                'align' => 'center',
                'editable' => true,
                'editrules' => array('required' => true),
                'search_op' => 'like', 
            ),


             'id_country' => array('label' => 'Страна',
                'db' => 'id_country',
                'width' => 20,

                'replace' => $user_country,

                'stype' => 'select',
                'searchoptions' => array(
                    'value' => new jqGrid_Data_Value($user_country, 'All'),
                ),

                'editable' => true,
                'editrules' => array('required' => true),
                'edittype' => 'select',
                'editoptions' =>  array(
                    'value' => new jqGrid_Data_Value($user_country, 'All'),
                ),
                'search_op' => 'equal', 
            ),

            'id_city' => array('label' => 'Город',
                'db' => 'id_city',
                'width' => 20,
                 'replace' => $user_city,

                'stype' => 'select',
                'searchoptions' => array(
                    'value' => new jqGrid_Data_Value($user_city, 'All'),
                ),

                'editable' => true,
                'editrules' => array('required' => true),
                'edittype' => 'select',
                'editoptions' =>  array(
                    'value' => new jqGrid_Data_Value($user_city, 'All'),
                ),
                'search_op' => 'equal', 
            ),
        );

        $this->render_filter_toolbar = true;
    }

    #Custom search operation

    protected function getCountry()
    {
        $result = $this->DB->query("SELECT * FROM country");

        $rows = array();
        while($r = $this->DB->fetch($result))
        {
            $rows[$r['id']] = $r['country'];
        }

        return $rows;
    }
    protected function getCity()
    {
        $result = $this->DB->query("SELECT * FROM city");

        $rows = array();
        while($r = $this->DB->fetch($result))
        {
            $rows[$r['id']] = $r['city'];
        }

        return $rows;
    }

}
дамп базы
PHP:
CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `id_city` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  `id_country` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `username` (`username`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Дамп данных таблицы `user`
--

INSERT INTO `user` (`id`, `username`, `id_city`, `id_country`) VALUES
(1, 'ivan', '1', '1'),
(2, 'petr', '3', '2'),
(3, 'vasy', '5', '3'),



-- Структура таблицы `country`
--

CREATE TABLE IF NOT EXISTS `country` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `country` char(64) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `country` (`country`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Дамп данных таблицы `country`
--

INSERT INTO `country` (`id`, `country`) VALUES
(1, 'Беларусь'),
(2, 'Россия'),
(3, 'Украина')



CREATE TABLE IF NOT EXISTS `city` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_country` int(10) NOT NULL DEFAULT '0',
  `city` char(64) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `city` (`city`,`id_country`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Дамп данных таблицы `city`
--

INSERT INTO `city` (`id`, `id_country`, `city`) VALUES
(1, 1, 'Минск'),
(2, 1, 'Витебск'),
(3, 2, 'Москва'),
(4, 2, 'Казань'),
(5, 3, 'Днепропетровск'),
(6, 3, 'Киев')
все впринципе работает,
Подскажите как после выбора страны в функцию getCity передать id_country , чтоб список городов был отфильтрован по выбранной стране?
 

~WR~

Новичок
Здесь можно сделать небольшой ход конём.

При каждом изменении фильтра по стране будет запрос на серверную часть за новыми данными.
В ответ можно добавить любые дополнительные данные через userdata. Например, список городов. И он будет каждый раз перестраиваться.

PHP:
PHP:
protected function getDataUser($userdata)
{
    if($this->input('id_country'))
    {
        $userdata['city_list'] = $this->getCity($this->input('id_country'));
    }

    return $userdata;
}
JS:
PHP:
$grid.bind('jqGridGridComplete', function() {
    var userdata = $grid.getGridParam('userdata');
    var orig_val = $('#gs_id_city').val();

    if (!userdata.city_list) return;

    $('#gs_id_city').empty();

    for (id in userdata.city_list) {
        $('#gs_id_city').append('<option value="' + id + '">' + userdata.city_list[id] + '</option>');
    }

    $('#gs_id_city').val(orig_val);
});
Единственное, лучше города передавать чуть по-другому. Вот так: [{id: 1, city: 'Москва'}, {id: 2, city: 'Санкт-Петербург'}];
При передаче в простом объекте в некоторых браузерах потеряется порядок.
 
Сверху