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

anion

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

BaluSer

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

anion

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

selselena

Новичок
Здравствуйте! Возникла проблема при использовании subGrid. Дело в том, что необходимо, чтобы плюсики subGridа появлялись не на каждой строке, а определённой, можно ли это как то реализовать?
 

demeshko

Новичок
Измените пример "вложенные таблицы"

PHP:
<script>
    var opts = {
        subGrid:true,
        subGridRowExpanded:function (subgrid_id, row_id) {
            $('#' + subgrid_id)
                .append('<table id="jqMiscSubgrid2' + row_id + '"></table>')
                .append('<div id="jqMiscSubgrid2' + row_id + '_p"></div>');

            $.ajax({
                url:$(this).getGridParam('url'),
                dataType:'script',
                data:{'oper':'renderSubgrid', 'customer_id':row_id}
            });
        },
        'gridComplete' : function()
        {
          $("tr.jqgrow td.ui-sgcollapsed").each(function(index,ele)
            {
              var idr=$(this).parent("tr.ui-row-ltr").children("td").eq(2).html();

              idr=parseInt(idr);
              if(idr==0) {
                  $(this).find("a").removeAttr("href");
                  $(this).find("span").removeClass("ui-icon-plus ui-icon");
                  $(this).removeClass("sgcollapsed ui-sgcollapsed");
                }
             }
          );
        }
    };

    <?= $rendered_grid ?>
</script>
в классе добавить...
PHP:
class jqMiscSubgrid extends jqGrid
{
    protected function init()
    {
        #Set database table
        $this->table = 'tbl_customer';

        $this->where[] = 'o.customer_id = c.id ';
        $this->query = "
          SELECT {fields}
            FROM tbl_customer c, (SELECT oi.customer_id, count(b.id) AS cn
                                                 FROM  tbl_order_item oi
                                                 LEFT JOIN tbl_books b ON (oi.book_id=b.id)
                                                 GROUP BY oi.customer_id) o
            WHERE {where}
        ";

        #Set columns
        $this->cols = array(

            'id' => array('label' => 'ID',
                'db' => 'c.id',
                'width' => 10,
                'align' => 'center',
            ),
            'cn' => array('label' => 'count',
                'db' => 'o.cn',
                'width' => 10,
                'hidden' => true,
            ),
//      - -- -----
Тогда в примере вложенные таблице не будет "плюсиков" там где пустой субгрид....
 

selselena

Новичок
Спасибо большое за ответ!! буду разбираться..
Я хотела сравнивать значения ячеек и если не совпадает, то + не ставится..subgrid-пустой
 

mictor1973

Новичок
Добрый день!
Помогите разобраться: решил вставить таблицу jqgrid в свой сайт. Таблица выводится, но без данных! Заголовки столбцов есть! Внешний вид нормальный.
Методом научного тыка на упрощенном примере выяснил, что если перед $jq_loader->autorun(); сделать вывод на экран (например echo "123"), то пустая таблица, если после то всё нормально! Найти на сайте где я что-то вывожу до этого $jq_loader->autorun(); у меня мозгов не хватает. Как-нибудь можно это обойти?
вот кусок упрошенного варианта, который выдаёт таблицу без данных:
<?php
require 'config_jqgrid.php';
require $_CONFIG['root_path']."jqGridLoader.php";
header("Content-Type: text/html; charset={$_CONFIG['encoding']};");
$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']);

echo "123"; # будет пустая таблица
$jq_loader->autorun();
$jq_loader->set('debug_output', true);
$grid="jqMembers";
$rendered_grid = $jq_loader->render($grid);
?>

<html ...............................
 

~WR~

Новичок
Грид выводится в два этапа.

1). Рендеринг. Когда на странице создается пустой грид с нужной структурой колонок. Это работает.
2). Загрузка первой страницы данных. Это не работает.

Откройте Firebug или отладчик в Google Chrome и посмотрите, что возвращается в ответ на второй запрос.
Там и будет ответ :)
 

anion

Новичок
~WR~, подскажи как сделать проверку перед удалением в opDel есть только id, мне надо проверить наличие записи в определённой колонке.

что-то типо этого, "$this->row[$id]['test']" я для примера написал, не знаю как правильно, либо знаю но не догадываюсь
PHP:
protected function opDel($id)
{
    if(empty($this->row[$id]['test']))
    {
        удаляем строку
    }
    else
    {
        throw new jqGrid_Exception('Нельзя удалять строку');
    }
}
 

~WR~

Новичок
Сначала получить ряд, затем проверить.
Как-то так.

PHP:
$row = $this->DB->getRow("SELECT * FROM {$this->table} WHERE id=" . intval($id));

if ($row and empty($row['test'])) {
    return parent::opDel($id);
} else {
    throw new jqGrid_Exception('Нельзя удалять строку');
}
 

anion

Новичок
не хочет getRow воспринимать

да и "throw new jqGrid_Exception('Нельзя удалять строку');" в opDel не хочет работать
 
Последнее редактирование:

~WR~

Новичок
Тогда по старинке.
Код:
$result = $this->DB->query("....");
$row = $this->DB->fetch($result);
Насчёт throw очень странно. Что в firebug'е пишет?
 

anion

Новичок
про throw в opDel вроде даже в теме говорили уже, но историю не припомню
Код:
error: "1"
error_code: "0"
error_data: null
error_msg: "Нельзя удалять строку"
error_string: "exception 'jqGrid_Exception' with message 'Нельзя удалять строку' in /volume1/web/modeling/grids/jqConcept.php:313↵Stack trace:↵#0 /volume1/web/modeling/php/jqGrid.php(309): jqConcept->opDel('27')↵#1 [internal function]: jqGrid->oper('del')↵#2 /volume1/web/modeling/php/jqGridLoader.php(60): call_user_func_array(Array, Array)↵#3 /volume1/web/modeling/php/jqGridLoader.php(179): jqGridLoader->__call('oper', Array)↵#4 /volume1/web/modeling/php/jqGridLoader.php(179): jqGridLoader->oper('jqConcept', 'del')↵#5 /volume1/web/modeling/index.php(39): jqGridLoader->autorun()↵#6 {main}"
error_type: "common"
 

~WR~

Новичок
А добавьте вот такую штуку в JS.

Код:
$.extend($.jgrid.del,
{
    afterSubmit: function(data)
    {
      var json = $.jgrid.parse(data.responseText);
  
       if(typeof(json.error_msg) != 'undefined')
       {
           return [false, json.error_msg];
       }

       return [true, null];
   }
});
 

anion

Новичок
А добавьте вот такую штуку в JS.

Код:
$.extend($.jgrid.del,
{
    afterSubmit: function(data)
    {
      var json = $.jgrid.parse(data.responseText);

       if(typeof(json.error_msg) != 'undefined')
       {
           return [false, json.error_msg];
       }

       return [true, null];
   }
});
увы ничего не изменилось, и вообще в jqgrid-ext есть "$.extend($.jgrid.del ..."
 

~WR~

Новичок
Да. И есть подозрение, что они поправили проблему в исходном jqGrid.
А добавьте это после подключения jqgrid-ext.js, но перед гридом. Вот так могло бы сработать.
 

~WR~

Новичок
Размышляю над тем, чтобы сделать вторую major версию библиотеки.

А именно:
1). Добавить неймспейсы, всё переложить и переименовать для PSR-4.
2). Создать package для Composer.
3). Оставить поддержку только для utf-8.
4). Выбросить половину редко используемых функций. Код похудеет на треть. При необходимости, всегда можно добавить свою логику через адаптеры и перегрузку методов.
5). Добавить поддержку большого количества конфигов для баз. Сейчас там как в детском саду - одна база по умолчанию.

Есть ещё мысли, что может захотеться? Кроме рабочего $.jgrid.del :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
5) Описать API слоя для работы с базой через интерфейс, чтобы не писать запросы под синтаксис твоего драйвера, а реализовать поток данных, например, на генераторах.
Сделать поддержку множества баз и репликации толком невозможно, это даже Доктрина не может.
6) Поменьше неявных вызовов и соглашений, как в https://github.com/wildraid/jqGridPHP/blob/master/examples/grids/jqCols.php#L12 - поле объявляется, но где и как используется - хрен знает.
Вот здесь так и хочется заменить инициализацию поля массивом на Состояние, и выставлять его вызовом сеттера.
7) Интеграция с symfony/laravel/yii - без интеграции с фреймворком использовать либу не очень хочется.
8) Перенести вики на github хотя бы ради подсветки синтаксиса.
 
Последнее редактирование:

~WR~

Новичок
5) Описать API слоя для работы с базой через интерфейс, чтобы не писать запросы под синтаксис твоего драйвера, а реализовать поток данных, например, на генераторах.
Драйверы даны скорее как пример того, как можно работать с базами в простых случаях.
Если есть генераторы или любые другие уровни абстракции над данными, то лучше сделать адаптер и в нём перегрузить функции:
  • getDataAgg - для count'ов, общего кол-ва рядов
  • getDataRows - для получения конкретной страницы с рядами
На практике масса примеров, когда грид, вместо базы, ходит в файлы, в API, в мемкеш, на какой-нибудь другой хост по SSH и т.п.

7) Интеграция с symfony/laravel/yii - без интеграции с фреймворком использовать либу не очень хочется.
Здесь ужас ситуации в том, что я совсем не пользуюсь популярными фреймворками. И даже неймспейсы не очень люблю. Упрощаю всё настолько, насколько позволяют другие участники проекта.

Но.. интеграция в любой фреймворк, в моём понимании, должна быть относительно простой. Шаги вижу следующие:
  1. В контроллерах вызываем render() для гридов, вставляем получившийся JS-код в нужное место на странице. Получаем грид.
  2. Создаём entry-point для обработки AJAX-запросов от гридов. В ней три строчки кода - подключение jqGridLoader и вызов autorun().
  3. Перегружаем getInput(), передаём в него "очищенные" входящие переменные от фреймворка вместо обычных $_GET, $_POST.
  4. Создаём "драйвер" для базы. В него заворачиваем обращения к драйверу фреймворка.
  5. Перегружаем функции для вывода JSON, если необходимо. Это если важно не мешать фреймворку свои header() посылать.
В классах конкретных гридов используем функции фреймворка на полную катушку. Там уже каких-то ограничений не должно быть.

Кстати, для Laravel и Yii есть готовые пакеты для jqGrid от других авторов. Там всё целиком сделано как компонент фреймворка. Не знаю, насколько легко там делать extend, но люди пользуются. Думаю, всё хорошо там :)

8) Перенести вики на github хотя бы ради подсветки синтаксиса.
Good point. На момент первичного релиза у гитхаба ещё не было функций wiki.
Ещё хотелось поддержать тот же стиль документации, что используется для jqGrid JS. Её всё равно придётся читать, а так вроде меньше переключений на другой стиль.
 
Сверху