На этой странице рассмотрена только работа с моделью из контроллера, то есть ее подключение и вызов методов. Внутреннее устройство самой модели рассмотрено в соответствующем разделе.
При вызове контроллера компонент автоматически определяет наличие собственной модели. В случае если она обнаружена создается объект:
$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();
Обратите внимание! Подобные вызовы доступны из контекста контроллера, т.е. из его фронтэнда, бэкенда и экшенов.
Вы можете класс своей модели наследовать от других доступных контроллеров (по умолчанию все модели наследуются от 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.
К оглавлению раздела "Контроллеры"