Документация InstantCMS

для администраторов и разработчиков

Инструменты пользователя

Инструменты сайта


dev:controllers:model

Работа с моделью

На этой странице рассмотрена только работа с моделью из контроллера, то есть ее подключение и вызов методов. Внутреннее устройство самой модели рассмотрено в соответствующем разделе.

Подключение собственной модели

При вызове контроллера компонент автоматически определяет наличие собственной модели. В случае если она обнаружена создается объект:

$this->model

Этот объект создается автоматически при запуске контроллера и доступен из любых его методов, а так же из экшенов расположенных в отдельных файлах.

Пример использования модели внутри контроллера:

$latest_posts = $this->model->orderBy('date_pub', 'desc')->limit(10)->getPosts();

Подключение чужой модели

Контроллер также может использовать модель другого компонента.

Для получения экземпляра чужой модели служит статический метод ядра cmsCore::getModel(). В качестве аргумента ему передается название компонента, чью модель необходимо получить.

Например, чтобы получить модель компонента users:

// Получаем модель компонента users
$users_model = cmsCore::getModel('users');
 
// Получаем данные из модели
$users = $users_model->getUsers();

В версиях InstantCMS выше 2.8.2, можно использовать обращением к динамическим свойствам $this→model_CONTROLLER_NAME, где CONTROLLER_NAME название требуемого контроллера, к модели которого нужно подключиться. Пример выше можно переписать вот так:

// Получаем данные из модели users
$users = $this->model_users->getUsers();

Обратите внимание! Подобные вызовы доступны из контекста контроллера, т.е. из его фронтэнда, бэкенда и экшенов.

Если требуемый контроллер имеет модель бэкенда, то обращаться к ней можно конструкцией:

// Начиная с версии InstantCMS 2.14.2
$ctype = $this->model_backend_content->getContentType($id);

Наследование чужой модели

Вы можете класс своей модели наследовать от других доступных контроллеров (по умолчанию все модели наследуются от cmsModel) или вовсе использовать модель чужого контроллера как основную, через свойство $this→model.

Для этого в своём контроллере вы должны определить свойство $outer_controller_model:

class mycontroller extends cmsFrontend {
    protected $outer_controller_model = 'content';
}

В этом случае движок, если своей модели у контроллера нет, подключит модель контроллера content, которая будет доступна через свойство $this→model. Если же есть своя модель, то логичным при такой конструкции, что она наследуется от модели контроллера content, в противном случае это не имеет смысла.

Можно подключать несколько моделей, если у вас цепочка наследования:

class mycontroller extends cmsFrontend {
    protected $outer_controller_model = ['content', 'other_controller'];
}

например, модель mycontroller наследуется от other_controller, а та, в свою очередь от модели контроллера content.

Начиная с версии InstantCMS 2.14 модели контроллеров подключаются автоматически через autoload, поэтому потребности в указании цепочки наследования больше нет. При необходимости, просто наследуйте свою модель от нужной вам.

Модели бэкендов (админки)

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

Например, в вашем контроллере mycontroller есть стандартная модель /system/controllers/mycontroller/model.php:

class modelMycontroller extends cmsModel {
 
}

Модель бэкенда может быть такой /system/controllers/mycontroller/backend/model.php:

class modelBackendMycontroller extends modelMycontroller {
 
}

Наличие основной модели необязательно, если не планируется её использовать в админке. И наоборот.

Важно понимать, что автоматически во фронтэнде подключается основная модель /system/controllers/mycontroller/model.php, а в бэкенде (админке) автоматически подключается модель админки /system/controllers/mycontroller/backend/model.php.


К оглавлению раздела "Контроллеры"


К оглавлению раздела "Модели"


К оглавлению документации для разработчиков

dev/controllers/model.txt · Последние изменения: 08.04.2021 12:35 — fuze