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

tyu

Новичок
Доброго дня всем!
Муки меня не покидают ) Скажите, можно ли использовать подгружаемые через ajax подтаблицы если данные основной таблицы загружаются локально? Просто я в такой локальной таблице добавил subGrid: true, subGridUrl, subGridModel. - появились "плюсики", но когда на них нажимаешь пишет "загрузка" и данные на сервер не отправляет.
 

sparkspb

Новичок
Добрый день!
Подскажите, пож-та, как реализовать добавление новых записей следующим образом: выбираем необходимую строку, жмем кнопку добавить и в форме добавления вставляются все данные выбранной строки (как при редактировании), где при необходимости можно их менять. Но при редактировании идет привязка к ID, а здесь необходимо, чтобы шел следующий порядковый номер ID.
 

~WR~

Новичок
и как результат "Object # has no method 'jqGrid'"
Логично. Через createElement создается простой элемент, а не jQuery объект. Чтобы работало, создать таблицу можно так:
PHP:
$('<table>').appendTo('контейнер для грида').jqGrid();
Append обязательно делать, иначе он не сможет посчитать размеры.

эта фишка в jqgridphp пока нету?
Frozen columns, как и многое другое - чисто клиентская фишка. Какой-то поддержки на стороне php не требуется. Возможно, нужна версия jqGrid поновее.

Скажите, можно ли использовать подгружаемые через ajax подтаблицы если данные основной таблицы загружаются локально?
Даже если по каким-то причинам не работает сразу из коробки, то всегда можно сделать на jQuery.
Снимите с "плюсиков" событие (unbind) и повесьте своё. В нем открывайте контейнер и загружайте в него то, что требуется.

Но, вообще, должно и так работать. Посмотрите в консоль на предмет ошибок JS.

Подскажите, пож-та, как реализовать добавление новых записей следующим образом
Самое простое решение - повесить событие на открытие формы. В нем проверять, что текущая операция - add, а также в таблице выбрана строка.
Если проверка успешна, то получать данные из строки и заполнять форму. Только те колонки, которые необходимо.

Операция приходит в аргумент события, либо зашифрована где-то в форме.
.getGridParam('selrow') - получить id выбранного ряда
.getRowData - получить данные ряда по его id

ну и потом что-нибудь в духе
PHP:
for(var i in data) {
    $form.find('#' + i).val(data[i]);
}
 

sparkspb

Новичок
Самое простое решение - повесить событие на открытие формы. В нем проверять, что текущая операция - add, а также в таблице выбрана строка.
Если проверка успешна, то получать данные из строки и заполнять форму. Только те колонки, которые необходимо.

Операция приходит в аргумент события, либо зашифрована где-то в форме.
.getGridParam('selrow') - получить id выбранного ряда
.getRowData - получить данные ряда по его id

ну и потом что-нибудь в духе
PHP:
for(var i in data) {
    $form.find('#' + i).val(data[i]);
}
Спасибо большое, буду пробовать, жаль, что нет какого-нибудь примера, чтобы вникнуть по-лучше, для меня это всё тяжко, никогда не программировал, а тут возникла необходимость.
Может что-нибудь получится))
 

tyu

Новичок
Спасибо! Еще вопрос. У меня в таблице есть кнопка. Как сделать чтоб по ее нажатию открывалась форма создания записи с еще одной строкой (которой нет в таблице)?
 

Nekton

Новичок
Здравствуйте! Подскажите, пожалуйста, как лучше раскрасить footerRow?
 

~WR~

Новичок
Спасибо! Еще вопрос. У меня в таблице есть кнопка. Как сделать чтоб по ее нажатию открывалась форма создания записи с еще одной строкой (которой нет в таблице)?
Всё же добавить эту колонку в таблицу. Поставить опции:
PHP:
'hidden' => true,
'editable' => true,
'editrules' => array('edithidden' => true),
hello, i need to have custom button for each row into grid header and subgrid item. is that possible?
Of course. There are many ways to do this.

1). Use custom formatter to generate HTML code for buttons.
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_formatter

2). Generate HTML in PHP in parseRow() function.
3). Create function in raw jQuery for 'gridComplete' event to make any last minute changes before grid rows are actually shown.
 

~WR~

Новичок
А как быть с деревьями типа nested?
То же самое, что adjacency, только дополнительные колонки будут для nested: level, lft, rgt, isLeaf, expanded
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:nested_set_model

Скажем так - на стороне PHP ничего особенного не делается для вывода деревьев. Просто ожидаются те параметры, которых просит сам jqGrid.

Здравствуйте! Подскажите, пожалуйста, как лучше раскрасить footerRow?
Можно прямо в PHP покрасить - он не делает htmlencode для footerrow.
Можно повесить функцию на событие gridComplete и в нем красить просто через jQuery.
 

rocket1

Новичок
Пример:
http://jqgrid-php.net/examples/?render=jqMiscSubgrid

Вместо:
PHP:
echo $this->Loader->render(...);
Пишем:
PHP:
echo '<div>My epic html!</div>';

Делал. Вместо субгрида показывается пустая строка.
И даже поиск по HTML содержимому не находит строки "My epic html"... она туда не выводится.
Вот код:
PHP:
    protected function opRenderSubgrid()
    {
//       echo $this->Loader->render('test_subgrid', array('id' => $this->input('id')));
         echo "<div>My epic html {$this->input('id')}</div>";
        exit;
    }
JavaScript (может здесь чего-то не так?):
PHP:
var opts = {
        subGrid:true,
        subGridRowExpanded:function (subgrid_id, row_id) {
            $('#' + subgrid_id)
                .append('<table id="test_subgrid' + row_id + '"></table>');
                .append('<div id="test_subgrid' + row_id + '_p"></div>');
            $.ajax({
                url:$(this).getGridParam('url'),
                dataType:'script',
                data:{'oper':'renderSubgrid', 'id':row_id}
            });
        }
    };
 

~WR~

Новичок
Мм, да. Попробуйте так:
PHP:
subGridRowExpanded: function(subgrid_id, row_id) 
{
    $('#'+subgrid_id).load($(this).getGridParam('url'), {'oper':'renderSubgrid', 'id':row_id});
}
 

@teandr

Новичок
Доброго времени суток !
Вопрос связан с размещением двух гридов на одной странице.
PHP:
<?
.................
$users_grid    = $loader->render('users');
$clients_grid  = $loader->render('clients');
..................

<html>
..................
<script>
    var opts = { 
        'gridComplete' : function(){...........}
    }
    <?= $users_grid ?>
</script>

<script>
    var opts = { 
        'gridComplete' : function(){...........}
    }
    <?= $clients_grid ?>
</script>
Как установить настройки для обеих таблиц таблиц на js ?

Та же ситуация с Subgrid - ами.
Если subgrid генерируется на серверной стороне
PHP:
protected function opRenderSubgrid()
{
........................
}

protected function renderHtml($data)
{
        return '';
}
Как сделать настройки для него на стороне клиента ?

В принципе, проблема решается в PHP.
Сейчас делаю настройки на серверной стороне.
PHP:
'gridComplete' => new jqGrid_Data_Raw("function() {........}");
Это работает, но как вы говорите, не рекомендуется и портит, на мой взгляд, читаемость php кода.
Как быть ?
 

~WR~

Новичок
Ну конкретно с gridComplete можно просто общее событие повесить.
PHP:
$('BODY').delegate('.ui-jqgrid-btable', 'jqGridGridComplete', function()
{
    alert('yarr!');
});
Код будет вызываться для всех гридов на странице - уже существующих и будущих.
 

@teandr

Новичок
Для всех гридов одно действие, при наступлении события ? Как правило, требуются разные действия для каждого, отдельно взятого грида.
Так понимаю, для отдельного грида, код будет :
PHP:
$('#users').delegate('.ui-jqgrid-btable', 'jqGridGridComplete', function()
{
    alert('yarr!');
});
?

И поддерживаются ли все стандартные события таким способом ?

PHP:
$('#users').delegate('.ui-jqgrid-btable', 'jqGridonSelectRow', function() {......}
$('#users').delegate('.ui-jqgrid-btable', 'jqGridondblClickRow', function() {......}
$('#users').delegate('.ui-jqgrid-btable', 'jqGridonRightClickRow', function() {......}
 

~WR~

Новичок
На один грид лучше так:
PHP:
$('#users').bind('jqGridGridComplete', function()
{
    ....
});
События поддерживаются очень многие, но имена у них чуть-чуть не такие. Возможно, где-то в документации есть полный список событий, но я обычно прямо в коде jqGrid смотрю.
jqGridSelectRow
jqGridDblClickRow
jqGridRightClickRow
 

@teandr

Новичок
Большое спасибо. Оказавается в документации это есть. Но все эти события новые.
List of triggered events (new in v4.3.2) Поэтому не знал о их существовании.
Все-же можно ли, сделать несколько
PHP:
var opts={...............}
на одной странице для разных таблиц ?
PHP:
<script>
    var opts = { 
        'subgrid': true,
    }
    <?= $users_grid ?>
</script>

<script>
    var opts = { 
       'width': 500,
    }
    <?= $clients_grid ?>
</script>
Почему-то у меня такой способ не работает.
 
Сверху