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

acanthis

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

~WR~

Новичок
Наверное потому, что путь к иконке неправильный.
Пропишите правильный buttonImage.
 

~WR~

Новичок
Debug it. :)

Открываем firebug, открываем форму, тыкаем на элемент, смотрим его id.
На вкладке console ручками пытаемся прицепить к нему datepicker с параметрами.
PHP:
$('#element_id').datepicker(....);

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

acanthis

Новичок
Debug it. :)

Открываем firebug, открываем форму, тыкаем на элемент, смотрим его id.
На вкладке console ручками пытаемся прицепить к нему datepicker с параметрами.
PHP:
$('#element_id').datepicker(....);



Если не получилось - пытаемся понять, в чем причина. Меняем параметры, пробуем снова.
Когда получится - прописываем их в окончательный код.
Пойдем другим путем :) Как изменить фокус при открытии окна ввода данных?
 

~WR~

Новичок
PHP:
$('#element_id').focus();
Только это не поможет, т.к. все равно при открытии формы фокус сперва встанет в первое поле, и datepicker покажется. :)
 

neiron

Новичок
Добрый день. Действительно, судя по описанию и справке вы разработали замечательную библиотеку, но что-то у меня никак не получается уяснить основной принцип ее работы.
Делаю, все по инструкции:
1. Устанавливаю jqGrid
2. Устанавливаю jqGridPHP
3. Корректно подключаю все CSS, JS и PHP скрипты
4. Создаю из примера таблицу в MySQL:
CREATE TABLE IF NOT EXISTS `tbl_customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` text NOT NULL,
`last_name` text,
`email` text NOT NULL,
`phone` text,
`discount` decimal(4,2) NOT NULL DEFAULT '0.00',
`date_register` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`date_birth` date DEFAULT NULL,
`contract_type` tinyint(4) unsigned NOT NULL,
PRIMARY KEY (`id`)
)
Добавляю туда вручную пару записей
5. Создаю файл-класс jqSimple.php (так же из примера про самую базовую таблицу)
PHP:
<?php

class jqSimple extends jqGrid
{
    protected function init()
    {
        #Set database table
        $this->table = 'tbl_customer';

        #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),
                                ),

            'email'     =>array('label' => 'Email',
                                'width' => 30,
                                'editrules' => array('email' => true),
                                ),

            'phone'     =>array('label' => 'Phone',
                                'width'	=> 25,
                                'align' => 'center',
                                ),

            'discount'	=>array('label' => 'Discount',
                                'width'	=> 15,
                                'formatter' => 'numeric',
                                'align'	=> 'center',
                                'editable' => false,
                                ),
        );

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

        #Add filter toolbar
        $this->render_filter_toolbar = true;
    }
}?>
6. Ну а дальше, собственно, и сам вопрос, как мне вытащить данные из моей таблицы (SELECT)
PHP:
require_once 'php/jqGridLoader.php';
$loader = new jqGridLoader;
$loader->set("db_driver", "PDO");
$loader->set("pdo_dsn"  , "mysql:dbname=jqgridphp;host=127.0.0.1");
$loader->set("pdo_user" , "jqgridphp");
$loader->set("pdo_pass" , "jqgridphp");
$jq_loader->autorun();
Далее в пример говориться про JS, но я так и не соображу, где его вызвать
<script>
<?= $rendered_grid ?>
</script>
Заранее спасибо.
 

acanthis

Новичок
Далее в пример говориться про JS, но я так и не соображу, где его вызвать
PHP:
<script>
<?= $rendered_grid ?>
</script>
Заранее спасибо.
По умолчанию этот скрипт прописывается в файлике, находящийся в папке templates (путь можно менять в файле _layout.php). В вашем случае это будет файл с именем jqSimple.php и содержать 3 строчки кода:
PHP:
<script>
<?= $rendered_grid ?>	
</script>
По дефолту запрашиваются все данные из таблицы, в противном случае пишите свой запрос в классе:
PHP:
$this->query = "Ваш запрос";
 

neiron

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

acanthis

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

~WR~

Новичок
По умолчанию не должно быть такого. Все корректно escape'ится и при записи, и при выводе.
Код в студию. :)
 

acanthis

Новичок
По умолчанию не должно быть такого. Все корректно escape'ится и при записи, и при выводе.
Код в студию. :)
Да, действительно, по умолчанию все ок. Но когда в ячейке стоит вот такой тип поиска:
PHP:
'stype' => 'select',
'searchoptions' => array(
              'value' => new jqGrid_Data_Value($delivery_types, 'All'),
         ),
то имея кавычки в записи, таблица не отображается.
 

~WR~

Новичок
Хм, интересно.

Попробуйте в jqGrid_Data_Value найти:
PHP:
return '"' . implode(';', $base) . '"';
Заменить на:
PHP:
return jqGrid_Utils::jsonEncode(implode(';', $base));

Вообще, это смешно, но в jqGrid нет нормального способа передать произвольные значения в select'ы.
В случае с объектом он теряет порядок в Chrome, Safari, Opera.
В случае со строкой он фейлится на разделителях (двоеточия, точка с запятой).

Надо бы добавить нормальный вариант: массив с объектами, содержащими ключ и значение.
И порядок сохранится, и разделители не будут мешать, и всё это пойдет через стандартный jsonEncode.

Сделаю pull request, как руки дойдут.
 

acanthis

Новичок
Хм, интересно.

Попробуйте в jqGrid_Data_Value найти:
PHP:
return '"' . implode(';', $base) . '"';
Заменить на:
PHP:
return jqGrid_Utils::jsonEncode(implode(';', $base));

Вообще, это смешно, но в jqGrid нет нормального способа передать произвольные значения в select'ы.
В случае с объектом он теряет порядок в Chrome, Safari, Opera.
В случае со строкой он фейлится на разделителях (двоеточия, точка с запятой).

Надо бы добавить нормальный вариант: массив с объектами, содержащими ключ и значение.
И порядок сохранится, и разделители не будут мешать, и всё это пойдет через стандартный jsonEncode.

Сделаю pull request, как руки дойдут.
Спасибо, это не так критично. Позже проверю ваш вариант.
У меня еще назрел такой вопрос: допустим у нас имеется таблица с фамилиями водителей, как можно организовать выпадающий список водителей в одном из полей добавления записи основной таблицы, т.е. в 2 словах делать выборку из таблицы и всовывать данные в select? Если можно, с примерчиком. Спасибо.
 

~WR~

Новичок
Тут есть опции dataUrl и buildSelect.
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules

В dataUrl прописываем url на операцию грида, которая вернет json с вариантами.
Просто добавляем к обычному url грида параметр: &oper=get_select

Делаем обработчик:
PHP:
protected function opGetSelect()
{
    $this->response['select'] = array(1 => 'Foo', 2 => 'Bar');
}
Потом в buildSelect разбираем пришедший json и формируем на его основании готовый select.
Пример писать лень. :)

Да, еще одно. Если используете редактирование через форму, то поставьте ей опцию recreateForm=true, иначе он только один раз запросит select и не будет обновлять его при каждом открытии.
 

acanthis

Новичок
Тут есть опции dataUrl и buildSelect.
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules

В dataUrl прописываем url на операцию грида, которая вернет json с вариантами.
Просто добавляем к обычному url грида параметр: &oper=get_select

Делаем обработчик:
PHP:
protected function opGetSelect()
{
    $this->response['select'] = array(1 => 'Foo', 2 => 'Bar');
}
Потом в buildSelect разбираем пришедший json и формируем на его основании готовый select.
Пример писать лень. :)

Да, еще одно. Если используете редактирование через форму, то поставьте ей опцию recreateForm=true, иначе он только один раз запросит select и не будет обновлять его при каждом открытии.
огромное спасибо. А можно ли в ячейках таблицы делать перенос по словам, если строка не умещается в ячейке?И есть ли в поле ввода данных возможность организовать автозаполнение?
 

~WR~

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

И есть ли в поле ввода данных возможность организовать автозаполнение?
Конечно - это же jQuery.
Через editoptions.dataInit вешаем jQuery UI Autocomplete или любой другой плагин на элемент формы.
 
Сверху