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