Класс модели в backende компонента ICMS v2

#1 13 апреля 2015 в 13:35
Добрый день Уважаемые Разработчики ICMSv 2!
У меня есть несколько вопросов.
1-вопрос.
Файл /system/core/controller.php
function __construct($request)
Не ясен метод подключения моделей в backende.
Примеры:
  1.  
  2. Конструктор форм (бесплатная версия) выбран для примера:
  3. $this->name = mb_strtolower(get_called_class());
  4. $this->name = 'backendiforms'
  5. $this->root_url = 'backendiforms'
  6. # Условие не выполняется- такого файла нет -> $model_file = '/system/controllers/backendiforms/model.php'
  7. #
  8. if (cmsCore::isModelExists($this->name)){
  9. $this->model = cmsCore::getModel($this->name);
  10. }
  11. Мой компонент /system/controllers/mycomponent - который не использует типы контента:
  12. $this->name = mb_strtolower(get_called_class());
  13. $this->name = 'backendmycomponent'
  14. $this->root_url = 'backendmycomponent'
  15. # Условие не выполняется- такого файла нет -> $model_file = '/system/controllers/backendmycomponent/model.php'
  16. if (cmsCore::isModelExists($this->name)){
  17. $this->model = cmsCore::getModel($this->name);
  18. }
  19. # А должно быть $model_file = '/system/controllers/mycomponent/model.php'
  20. Мой компонент 2 /system/controllers/mycomponent - который не использует типы контента:
  21. $this->name = mb_strtolower(get_called_class());
  22. $this->name = 'content'
  23. $this->root_url = 'content'
  24. # Условие выполняется не другим контроллером -> $model_file = '/system/controllers/content/model.php'
  25. if (cmsCore::isModelExists($this->name)){
  26. $this->model = cmsCore::getModel($this->name);
  27. }
  28. # А должно быть $model_file = '/system/controllers/mycomponent/model.php'
Вообще все компоненты-самоделки подключают не свою модель $this->name = 'content'.
не верно определяется имя директорий компонента (файл_модель.php) возвращаемые get_called_class() -
поэтому контроллер поумолчанию — content .

Поэтому в сторонних компонентах, модель вызываем в каждом экшене контроллера :
  1.  
  2. $iforms_model = cmsCore::getModel('iforms');
  3. $my_model = cmsCore::getModel('mycomponent');
И вызов методов обьекта $this->model-> недоступен.

Заменив строку:
  1. $this->name = mb_strtolower(get_called_class());
на
  1. $this->name = str_replace('backend', '', get_called_class());
  2. $this->name = mb_strtolower($this->name);
  3.  
Станет доступным текущая модель контроллера $this->model->

Функция get_called_class() будет возвращать имя класса backendNameComponent компонента
зачищаем вхождение backend, и определяем имя директории компонента $this->namе = NameComponent. имя файла модели текущего контроллера.
Становится доступным обращение к методам модели текущего контроллера компонента $this->model->,
в классах компонента class backendNameComponent. которое фактически и изначально заложено в функционал.
Но поскольку последний класс будет class cmsAction контроллера, то функция get_called_class() — вернет 'adminaction'
Естественно такого пути к модели нет, и контроллер подключит модель'content'

Очень хотелось что бы Контроллер компонента при инициализации обеспечил подключение файла класса модели, как в class backendNameComponent так и в классе class frontend class NameComponent, и классах cmsAction

2-вопрос.
Не ясно и при инициализации конструктора class cmsModel ,
определяем что возвращаемое имя класса, из которого был вызван метод:
  1. $this->name = str_replace('model_', '', get_called_class());
  2.  
содержит нижнее подчеркивание .
По факту, имена в backende получаем так :
$this->name = 'modelIforms'
$this->name = 'modelMenu'
$this->name = 'modelContent'
$this->name = 'modelMyComponent'
Логично что вхождение строки должно быть model без нижнего подчеркивания:
$this->name = str_replace('model', '', get_called_class());
В итоге имена классов будут
$this->name = 'Iforms'
$this->name = 'MyComponent'

PS//Дописал!
Оставляю текст в таком виде.А то переписывать без конца буду.
#2 13 апреля 2015 в 19:19
Если в админке выбрать ( свой ) контроллер и любой его экшен, то всегда — самый последний класс который обращается к cms Action,
будет класс хука onContentMenuContent.
Поэтому и такая беда — всегда модель 'content'

Убрав строку в файле манифеста //'menu_content',
И выполнив изменения
  1. $this->name = str_replace('backend', '', get_called_class());
  2. $this->name = mb_strtolower($this->name);
почти получил что хотел.
При вызове экшена получил в конструкторе
  1. => $this->controller = class backendMyComponent {
  2. public $useDefaultOptionsAction = TRUE;
  3. public $name = 'mycomponent';
  4. public $title = 'Мой компонент';
  5. public $model = class modelmycomponent { protected $approved_filtered = FALSE; public $name = 'modelmycomponent';
В конструкторе контроллера получил модель этого контроллера
  1. $this->name = 'MyComponent';
  2. $this->name = mb_strtolower($this->name);
  3. $this->name = 'mycomponent';
  4. $this->root_url = 'mycomponent';
  5. # system\core\core.php
  6. $model_file = '/system/controllers/mycomponent/model.php'
Методы модели доступны из контроллера и экшена компонента $this->model->метод модели!

Добавив в конструктор cmsAction
  1.  
  2. $this->name = str_replace('actionAdminControllersEdit', 'admin', get_called_class());
Получил полностью что хотел.
Из класса backendNameMyComponent — $this->model->method();
Из класса экшенов компонента class actionMyComponent extends cmsAction — $this->model->method();
Из класса class mycomponent extends cmsFrontend — $this->model->method();

Пожалуй только Вы Уважаемый R2 можете расставить все по местам.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.