TreeGrid Nested Set Model в jqGrid

Цикл статей «Документация jqGrid на русском».

Следующая статья — «TreeGrid Adjacency Model в jqGrid».
Предыдущая статья — «Настройка TreeGrid в jqGrid».

Как было сказано в предыдущей статье «Настройка TreeGrid в jqGrid», одной из важных частей является свойство treeReader. Настройка этого свойства и понимание основных принципов Nested Set Model позволит облегчить вашу жизнь.

Настройка treeReader по умолчанию при использовании Nested Set Model выглядит так:

treeReader автоматически расширяет colModel этими полями, которые добавляются скрытыми в конец colModel. Данные, возвращаемые сервером, должны включать эти поля для построения таблицы. treeReader может быть расширен так, чтобы эти поля удовлетворяли вашим потребностям.

Свойство: level_field
Тип: number
Это поле определяет уровень в иерархии элемента. Обычно корневой элемент имеет уровень 0. Первый дочерний элемент имеет уровень 1 и так далее. Эта информации нужна таблице для задания отступов каждого элемента.

Свойство: left_field
Тип: number
rowid поля слева.

Свойство: right_field
Тип: number
rowid поля справа.

Свойство: leaf_field
Тип: boolean
Это поле указывает таблице, что этот элемент является листом. Возможные значения: true, false. К элементу-листу присоединяется картинка, и этот элемент может быть развёрнут или свёрнут.

Свойство: expanded_field
Тип: boolean
Указывает таблице, должен ли этот элемент развёртываться при загрузке (true или false). Если этот элемент не имеет значений, то устанавливается false. Данные могут быть пусты для этого элемента, но этот элемент не может быть удалён.

Другое свойство, которое может быть изменено, это tree_root_level. По умолчанию оно имеет значение 0. Это свойство указывает, какой уровень имеет корневой элемент.

Что отправляется на сервер

В случае автозагружаемых узлов отправляются следующие параметры. Расширяется массив postData. Смотрите статью «Настройка TreeGrid в jqGrid».

  • nodeid — это id текущей развёрнутой записи.
  • n_left — содержит левое значение для текущей развёрнутой строки.
  • n_right — содержит значение справа для текущей развёрнутой строки.
  • n_level — содержит уровень текущей развёрнутой строки.

Пример

Для того чтобы понимать процесс настройки treeGrid, здесь представлен полный пример:

Подготовка данных

Предположим, что мы имеем таблицу account, где некоторые счета являются дочерними к основным счетам, и некоторые счета не имеют дочерних счетов. В NestedSetModel таблица может выглядеть так:

account_id, name, account_number, Debit, Credit, Balance, lft, rgt

где:

  • account_id — уникальный id счета (в нашей таблице это должен быть rowid)
  • lft — указывает на поле слева.
  • rgt — указывает на поле справа.

В MySQL эта таблица может выглядеть так:

Добавим данные:

С этой информацией мы можем построить treeGrid.

Подготовка таблицы

Так как jqGrid сейчас не поддерживает постраничную навигацию, то при использовании treeGrid элементы постраничной навигации будут заблокированы автоматически.

Серверный код — загружаем один раз

Загрузка всех узлов сразу — это упрощение, используемое когда в таблице мало элементов. Для этого наш SQL-запрос может быть таким:

В Nested Set model определение, является ли узел листом очень простое. Для этого нужно просто выполнить сравнение rgt = lft+1 .

Теперь мы готовы для написания серверного кода. Ниже примеры кодов на PHP и MySql для xml и JSON. Смотрите коды, чтобы увидеть, где добавлены дополнительные элементы.

С использованием XML:

Используя JSON:

Если нужно, чтобы все узлы были развёрнуты после загрузки данных, то нужно установить последнее значение в true.

Серверный код — автоматическая подгрузка дерева

Если есть относительно большие данные с глубокой структурой, то лучше загружать данные только те, которые нужны сейчас, а остальные только при клике на родительскую запись. Поэтому сначала отображаем только корневые элементы. При клике на корневой элемент таблица автоматически пытается загрузить нужную информацию, передавая необходимые параметры на сервер. Здесь level_field и isLeaf очень важны.
В этом случае мы можем использовать предыдущий запрос, которые возвращает только элементы запрошенного уровня. Запрос может быть оптимизирован, но это выходит за рамки этого объяснения.

С помощью JSON:

Цикл статей «Документация jqGrid на русском».

Следующая статья — «TreeGrid Adjacency Model в jqGrid».
Предыдущая статья — «Настройка TreeGrid в jqGrid».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *