TreeGrid Adjacency Model в jqGrid

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

Следующая статья — «Непрокручиваемые колонки в jqGrid (Frozen columns)».
Предыдущая статья — «TreeGrid Nested Set Model в jqGrid».

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

Настройка treeGrid

Настройка treeReader по умолчанию при использовании treeGrid с Adjacency Model:

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

Единственное отличие от Nested Set Model в том, что left_field и right_field заменены parent_id_field. Этот элемент указывает, что запись имеет родительскую запись с id равным parent_id_field. Если родительский id равен NULL, то элемент является корневым элементом.

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

Свойство: parent_id_field
Тип: смешанный
Указывает, что запись родительскую запись с id равным parent_id_field. Если id родительской записи NULL, то этот элемент является корневым элементом.

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

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

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

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

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

Пример

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

Давайте предположим, что у нас есть таблица account, где некоторые счета являются дочерними к главным счетам, и некоторые счета не имеют дочерних счетов. В Adjacency model таблица может выглядеть так:
account_id, name, account_number, Debit, Credit, Balance, parent_id
где:

  • account_id — уникальный id счёта (в нашей таблице это должен быть rowid).
  • parent_id — id родительского счёта, то есть для нас свойство parent_id_field.

В синтаксисе MySQL эта таблица будет выглядеть так:

Добавление данных:

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

Настройка таблицы

Серверный код. Загрузка всех узлов сразу

Загрузка всех узлов сразу работает хорошо при относительно небольшом количестве элементов и небольшом количестве уровней дерева.
Загрузка данных в Adjacency model немного более сложная, так как она требует рекурсии, и при большой глубине дерева может потребовать большого количества времени. Есть некоторые технологии, решающие эту проблему, но в нашем случае мы будем использовать стандартный способ. Автоматическая загрузка узлов дерева (описана ниже) более проста и не требует рекурсии.

Используя XML

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

Автоматическая загрузка дерева рекомендуется при использовании adjacency model в jqGrid. Здесь можно сделать простой запрос без всяких рекурсий.

Используя XML

adjacency [əˈdʒeɪs(ə)nsɪ] — соседство, смежность, примыкание, близость

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

Следующая статья — «Непрокручиваемые колонки в jqGrid (Frozen columns)».
Предыдущая статья — «TreeGrid Nested Set Model в jqGrid».

TreeGrid Adjacency Model в jqGrid: 2 комментария

  1. Добрый день! Пробовал пример, описанный в документации и здесь adjacency модель. Но дерево не раскрывается. Пробовал оба примера из вашей статьи. Раскрывается только первый уровень, второй уровень не раскрывается, даже запрос не отправляется. В чем может быть проблема? Использую jqgrid 4.7.

    1. Я бы порекомендовал попробовать обновить jqGrid и проверить там. Вполне возможно, что в в вашей версии можно было использовать только один уровень. Но так особых проблем не должно возникать, вроде.

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

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