В большинстве ситуаций ноды позволят другим нодам быть дочерними элементами, формируя отношения родитель-потомок друг с другом. Примером этого являются форумы, где форум может содержать под-форумы, которые могут содержать дополнительные подфорумы и т.д. Каждый форум является нодой, и выглядит в виде древовидной структуры с родительскими и дочерними форумами.
Чтобы поддерживать отношения родитель/потомок, модель вашей ноды просто должна определять родительское свойство (смотрите ниже). Это сделает ряд унаследованных методов доступными вашему классу. Кроме того, администраторы смогут изменять порядок отображения и родителя в админцентре (это поведение может быть настроено).
Настройка класса модели
public static $databaseColumnParent = 'string';
Просто определите это свойство в своем классе для реализации отношений родитель/потомок. Значение должно быть названием колонки базы данных (без префикса), которая содержит идентификационный номер родительской ноды.
public static $nodeSortable = boolean;
Если false (по умолчанию true), то ноды не смогут быть отсортированы администратором в админцентре.
Настройка класса вашей контроллера
По умолчанию контроллеры нод не нуждаются в каких-либо свойствах или методах, добавленных для поддержки отношений родитель/потомок. Однако, есть некоторые свойства, которые вы можете определить для контроля их поведения.
protected $lockParents = boolean;
Если true, ноды не смогут быть удалены из своих родительских нод. Они смогут быть переупорядочены только в рамках их настоящего родителя.
protected $protectRoots = boolean;
Если true, корневые ноды не смогут стать дочерними, соответственно, дочерние не смогут стать корневыми нодами.
Поддерживаемые методы
После реализации отношений родитель/потомок, в вашей модели будут доступны следующие методы.
public mixed parent()
Возвращает ближайший родительский узел или NULL, если это корневой элемент без родителя.
public \SplStack parents()
Возвращает стек всех родителей (непосредственная родительская нода, родитель этой ноды и т. д. вплоть до корневой ноды).
public boolean hasChildren( [string|null $permissionCheck='view' [, \IPS\Member|null $member=NULL [, boolean $subnodes=TRUE [, mixed $where=array() ]]]] )
Возвращает true или false, указывая, имеет ли эта нода дочерние ноды.
$permissionCheck
Ключ разрешения для проверки для подсчёта количества нод (передача null не будет проверять разрешения).
$member
Пользователь, для использования в качестве контекста при проверке разрешений (передача null позволит использовать текущего авторизованного пользователя).
$subnodes
Следует ли подсчитывать только потомков. Если false, все потомки ноды будут подсчитываться независимо от глубины вложенности.
$where
Дополнительные операторы where для передачи в запрос.
public int childrenCount( [string|null $permissionCheck='view' [, \IPS\Member|null $member=NULL [, boolean $subnodes=TRUE [, mixed$where=array() ]]]] )
Возвращает число дочерних нод. Принимает те же параметры, что и hasChildren, выше.
public array children( [string|null $permissionCheck='view' [, \IPS\Member|null $member=NULL [, boolean $subnodes=TRUE [, array|null $skip=NULL [, mixed $where=array() ]]]]] )
Возвращает массив дочерних нод.
$permissionCheck
Ключ разрешения для проверки для подсчёта количества нод (передача null не будет проверять разрешения).
$member
Пользователь, для использования в качестве контекста при проверке разрешений (передача null позволит использовать текущего авторизованного пользователя).
$subnodes
Следует ли подсчитывать только потомков. Если false, все потомки ноды будут подсчитываться независимо от глубины вложенности.
$skip
Массив дочерних идентификаторов для пропуска.
$where
Дополнительные операторы where для передачи в запрос.
public boolean isChildOf( \IPS\Node\Model $node )
Возвращает true или false, указывающий, является ли этот узел дочерним (на любой глубине вложенности) предоставленного $node.