Базовый класс, который будут расширять классы вашей ноды, это \IPS\Node\Model. Этот класс предоставляет широкий набор специальных методов для работы с данными вашей ноды. \IPS\Node\Model в свою очередь расширяет \IPS\Patterns\ActiveRecord, предоставляя стандартные способы выборки и взаимодействия с основными данными в вашей базе данных.
<?php namespace IPS\yourApp; class _ExampleModel extends \IPS\Node\Model { //... }
Затем ваша модель может быть загружена в ваши контроллеры, например так:
$item = \IPS\yourApp\exampleModel::load( 1 );
Указание свойств класса
Классы нод требуют несколько статических свойств для настройки своего поведения. Многое наследуется от \IPS\Patterns\ActiveRecord.
protected static $multitons = array();
Обязательное свойство. Унаследовано от \IPS\Patterns\ActiveRecord. Просто должно быть определено подклассами \IPS\Patterns\ActiveRecord.
public static $nodeTitle = 'string';
Обязательное. Ключ языковой строки во множественном числе, определяющий сущность вашей ноды, например "Форумы" или "Категории".
public static $databaseTable = 'string';
Обязательное. Унаследовано от \IPS\Patterns\ActiveRecord. Задаёт таблицу базы данных, к которой относится паттерн ActiveRecord.
public static $databaseColumnOrder = 'string';
Обязательное. Должен быть столбец в вашей таблице базы данных (без префикса), который содержит номер позиции, в порядке которой будут выстроены ноды (центральный код будет обрабатывать настройку и использовать значение, но вам нужно создать для этого поле - столбец INT).
public static $databasePrefix = 'string';
Необязательное. Унаследовано от \IPS\Patterns\ActiveRecord. Указывает префикс поля, используемого этой таблицей.
public static $databaseColumnId = 'string';
Необязательное (по умолчанию: 'id'). Унаследовано от \IPS\Patterns\ActiveRecord. Задает поле первичного ключа для этой таблицы базы данных.
public static $nodeSortable = boolean;
Необязательное (по умолчанию: true)
Определяет, будут ли ноды сортироваться администраторами в админцентре.
public static $modalForms = boolean;
Необязательное (по умолчанию: false)
Определяет, будут ли формы редактирования/добавления нод в админцентре отображаться во всплывающем модельном окне.
Определение методов вашего класса
В дополнение к методам, унаследованным от \IPS\Patterns\ActiveRecord, класс \IPS\Node\Model также предоставляет дополнительные методы (некоторые из которых обязательны в вашем собственном классе).
public void url()
Обязательный. Должен вернуть объект \IPS\Http\Url, указывающий на местоположение во фронт-енде, где пользователи могут просматривать элементы контента в вашей ноде.
public void form( \IPS\Helpers\Form $form )
Обязательный.
Должен определять элементы формы в объекте $form, которые будут использованы для оображения формы для редактирования/добавления нод в админцентре.
public static array roots()
Возвращает массив нод. Если вы реализуете отношение с родитель-потомок, метод возвращает только те, у которых нет родителя.
public static array search( string $column, string $query, string $order=NULL, mixed $where=array() )
Возвращает массив нод, соответствующих поиску.
public array getButtons( string $url [, boolean $subnode=FALSE] )
Должен вернуть массив кнопок для отображения в дереве нод для нод в админцентре. Базовый класс определяет следующие кнопки автоматически (на основе конфигурации модели ноды):
- add
- edit
- permissions
- copy
- empty
- delete
Вы можете определить дополнительные кнопки. Обязательно вызовите parent::getButtons( $url ) в вашем классе для установки стандартных кнопок.
Геттеры и сеттеры
Поскольку \IPS\Node\Model расширяет \IPS\Patterns\ActiveRecord, могут быть определены геттеры и сеттеры для обработки определённых свойств нод. \IPS\Node\Model определил большинство из них, поэтому вам нужно только определить свои собственные, если хотите обрабатывать поля по-разному. Например, вы всегда определяете метод get__title(), но вам практически никогда не понадобится вручную определять метод get__id().
Свойство | Описание | Get | Set | Стандартное значение |
---|---|---|---|---|
$_id | Возвращает ID номер вашей ноды. | Значение столбца "id" в базе данных. | ||
$_title | Возвращает заголовок вашей ноды. | Пустая строка | ||
$_description | Возвращает описание ноды, или NULL если не применимо. | NULL | ||
$_badge | Может использоваться для возврата бэйджа, отображаемого при просмотре нод в админцентре. Смотрите phpDocs. | NULL | ||
$_icon | Может использоваться для возврата иконки в строке, отображаемой при просмотре нод в админцентре. Возвращает CSS класс для иконки. | NULL | ||
$_enabled | Если реализовано, добавит бэйдж "Включено" / "Отключено", на который можно кликнуть, чтобы переключить статус. Вы должны реализовать это, если у ваших нод есть концепция включения/отключения. | NULL | ||
$_locked | Если вы используете $_enabled, это можно использовать для указания того, что отдельная нода не может быть включена/отключена и заблокирована в текущем состоянии. | NULL | ||
$_position | Возвращает позицию ноды. | Значение столбца в базе данных, представленное $databaseColumnOrder | ||
$_items | Количество элементов контента в ноде | NULL | ||
$_comments | Количество комментариев к элементам контента в ноде | NULL | ||
$_reviews | Количество отзывов к элементам контента в ноде | NULL |
Формы модели
При просмотре нод в админцентре Invision Community автоматически строит формы для их добавления/изменения. Поэтому вы должны определить метод формы в вашей модели, которые должны строить элементы форм для отображения. Например:
public function form( \IPS\Helpers\Form $form )
{
$form->add( new \IPS\Helpers\Form\Translatable( 'category_title', NULL, TRUE, array( 'app' => 'yourApp', 'key' => ( $this->id ? "yourApp_category_{$this->id}" : NULL ) ) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'category_example', $this->example ) );
}
Этот код создаёт форму с двумя элементами - Переводимое поле, позволяющее администратору установить локализованное название вашей ноды, и поле ДаНет для другого (не существующего, в данном случае) свойства.
При сохранении формы, любые поля, соответствующие столбцам в таблице базы данных, будут установлены автоматически. Однако вам может потребоваться дополнительная работа. В этом примере, поскольку заголовок является переводимым, его нельзя хранить в определенном столбце базы данных, поэтому нам нужно сохранить его в языковой системе. Это можно сделать, переопределив метод saveForm(). Например так:
public function saveForm( $values )
{
// Need to do this as if we’re creating a new node, we
// won’t have an ID yet and the language system will need one to
// store the title.
if ( !$this->id )
{
$this->save();
}
\IPS\Lang::saveCustom( 'yourApp', "yourApp_category_{$this->id}", $values['category_title'] );
parent::saveForm( $values );
}