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

  • Автор темы Автор темы ~WR~
  • Дата начала Дата начала
Доброго дня всем!
Муки меня не покидают ) Скажите, можно ли использовать подгружаемые через ajax подтаблицы если данные основной таблицы загружаются локально? Просто я в такой локальной таблице добавил subGrid: true, subGridUrl, subGridModel. - появились "плюсики", но когда на них нажимаешь пишет "загрузка" и данные на сервер не отправляет.
 
Добрый день!
Подскажите, пож-та, как реализовать добавление новых записей следующим образом: выбираем необходимую строку, жмем кнопку добавить и в форме добавления вставляются все данные выбранной строки (как при редактировании), где при необходимости можно их менять. Но при редактировании идет привязка к ID, а здесь необходимо, чтобы шел следующий порядковый номер ID.
 
и как результат "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]);
}
 
Самое простое решение - повесить событие на открытие формы. В нем проверять, что текущая операция - add, а также в таблице выбрана строка.
Если проверка успешна, то получать данные из строки и заполнять форму. Только те колонки, которые необходимо.

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

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

Спасибо большое, буду пробовать, жаль, что нет какого-нибудь примера, чтобы вникнуть по-лучше, для меня это всё тяжко, никогда не программировал, а тут возникла необходимость.
Может что-нибудь получится))
 
Спасибо! Еще вопрос. У меня в таблице есть кнопка. Как сделать чтоб по ее нажатию открывалась форма создания записи с еще одной строкой (которой нет в таблице)?
 
Здравствуйте! Подскажите, пожалуйста, как лучше раскрасить footerRow?
 
Спасибо! Еще вопрос. У меня в таблице есть кнопка. Как сделать чтоб по ее нажатию открывалась форма создания записи с еще одной строкой (которой нет в таблице)?
Всё же добавить эту колонку в таблицу. Поставить опции:
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.
 
А как быть с деревьями типа 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.
 
Пример:
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}
            });
        }
    };
 
Мм, да. Попробуйте так:
PHP:
subGridRowExpanded: function(subgrid_id, row_id) 
{
    $('#'+subgrid_id).load($(this).getGridParam('url'), {'oper':'renderSubgrid', 'id':row_id});
}
 
Доброго времени суток !
Вопрос связан с размещением двух гридов на одной странице.
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 кода.
Как быть ?
 
Ну конкретно с gridComplete можно просто общее событие повесить.
PHP:
$('BODY').delegate('.ui-jqgrid-btable', 'jqGridGridComplete', function()
{
    alert('yarr!');
});

Код будет вызываться для всех гридов на странице - уже существующих и будущих.
 
Для всех гридов одно действие, при наступлении события ? Как правило, требуются разные действия для каждого, отдельно взятого грида.
Так понимаю, для отдельного грида, код будет :
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() {......}
 
На один грид лучше так:
PHP:
$('#users').bind('jqGridGridComplete', function()
{
    ....
});

События поддерживаются очень многие, но имена у них чуть-чуть не такие. Возможно, где-то в документации есть полный список событий, но я обычно прямо в коде jqGrid смотрю.
jqGridSelectRow
jqGridDblClickRow
jqGridRightClickRow
 
Большое спасибо. Оказавается в документации это есть. Но все эти события новые.
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>
Почему-то у меня такой способ не работает.
 
Сверху