Переопределение контроллеров

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО

Проблема с переопределением контроллеров

У Вас наблюдается такая проблема?

Обязательно убедитесь в этом! Если заработало пришлите содержание файла custom и в каком компоненте пробовали.

Да, так же не работает :(
У меня заработало :-)
Другой случай, опишу в теме!
Всего 2 голоса Опрос завершён
#1 28 января 2016 в 21:59
На основании документации мы можем переопределить любое действие описанное в frontend или в папке. Но это не работает, стоит создать этот файл и прописать в нем как по инструкции, компонент перестает работать полностью. Мне важно понять это у меня только или все же баг движка?!
#2 28 января 2016 в 23:10

компонент перестает работать полностью

Андрей
без подробностей, кода, текста ошибки и так далее никто ничего не подскажет.

instantcms.ru/rules.html
#3 29 января 2016 в 08:50
Создайте в папке компонента users custom.php

  1.  
  2. <?php
  3. class users_custom extends users {
  4. public function test() {
  5. return false;
  6. }
  7. }
  8.  
Пройдите по ссылке site.ru/users и вот она 404(Страница не найдена). Компонент users полностью не работоспособен стал.
#4 29 января 2016 в 11:03
Нужно определить конструктор, где сделать небольшой финт (добавим в документацию)

  1. class users_custom extends users {
  2.  
  3. public function __construct($request) {
  4.  
  5. $this->name = str_replace('_custom', '', strtolower(get_called_class()));
  6.  
  7. parent::__construct($request);
  8. }
  9.  
  10. public function test() {
  11. return false;
  12. }
  13.  
  14. }

Имя файла должно быть users_custom.php

Геннадий Иванович
Имя файла НЕ должно быть с таким названием.
#5 29 января 2016 в 11:38

Геннадий Иванович:
Имя файла должно быть users_custom.php
Имя файла НЕ должно быть с таким названием.

Да просто сначала была непонятна 270 строка core.php
И сейчас получается так $custom_file = '/system/controllers/users_custom/custom.php'
строки отладчика
  1.  
  2. -> autoLoadCoreClass() \system\core\core.php:0
  3. -> mb_strtolower() \system\config\autoload.php:10
  4. => $class_name = 'users_custom' \system\config\autoload.php:10
  5. => $class_file = FALSE \system\config\autoload.php:11
  6. -> mb_substr() \system\config\autoload.php:13
  7. -> mb_substr() \system\config\autoload.php:18
  8. -> cmsConfig->__get() \system\core\core.php:270
  9. => $custom_file = '/system/controllers/users_custom/custom.php' C:\usr\domains\204.icms\system\core\core.php:270
  10. -> file_exists() \system\core\core.php:272
  11. => $controller_class = 'users_custom' \system\core\core.php:273
  12. => $controller_name = 'users_custom' \system\core\core.php:282
И на выходе при вызове /users или /users_custom получается
Warning: include_once(/system/controllers/users_custom/frontend.php)
Fatal error: Class 'users_custom' not found in \system\core\core.php on line 286
Сейчас пробую Ваше решение!
#6 29 января 2016 в 11:43

Создаем файл system/controllers/custom.php

Геннадий Иванович
Зачем?
Вы прочитали документацию?
#7 29 января 2016 в 12:00
Да! Все нормально после Вашего изменения получается !
  1.  
  2. $custom_file = '/system/controllers/users/custom.php' \system\core\core.php:270
  3. -> file_exists() \system\core\core.php:272
  4. => $controller_class = 'users_custom' \system\core\core.php:275
  5. -> class_exists() \system\core\core.php:276
  6. -> autoLoadCoreClass() \system\core\core.php:0
  7. -> mb_strtolower() \system\config\autoload.php:10
  8. => $class_name = 'users_custom' \system\config\autoload.php:10
  9. => $class_file = FALSE \system\config\autoload.php:11
  10. -> mb_substr() C:\usr\domains\204.icms\system\config\autoload.php:13
  11. -> mb_substr() C:\usr\domains\204.icms\system\config\autoload.php:18
  12. -> include_once(C:\usr\domains\204.icms\system\controllers\users\custom.php)
#8 29 января 2016 в 12:04

Геннадий Иванович:
Создаем файл system/controllers/custom.php ???????
Зачем?

Fuze
? zst
Да это при цитировании накладка получилась.
#9 29 января 2016 в 19:43
Не переопределяет ни чего. Ни чего не происходит(
#10 29 января 2016 в 23:38
А точнее, новые методы добавляются(экшены). Но при попытке переопределить существующий метод не дает результатов
#11 30 января 2016 в 20:06
Уважаемые разработчики, прошу, решите проблему.
#12 31 января 2016 в 22:15
Андрей, без нормального контакта с вашей стороны, описаний того, что вы делаете, примеров никто вам не сможет помочь. Прочитайте еще раз второе сообщение этой темы.

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

p.s. в документации неточности видимо, которые будут исправлены.
#13 31 января 2016 в 22:18
А что если нужно переопределить простую функцию(метод) в frontend.php. Как в этом случае быть?
Простое дублирование в ее в custom.php не дает результатов.
#14 31 января 2016 в 22:37
Андрей, вы читаете мои ответы? С каждым сообщением энтузиазм вам отвечать уменьшается.

  1. <?php
  2.  
  3. class users_custom extends users {
  4.  
  5. public function __construct($request) {
  6.  
  7. $this->name = str_replace('_custom', '', strtolower(get_called_class()));
  8.  
  9. parent::__construct($request);
  10.  
  11. }
  12. // этот метод определен в frontend.php, здесь мы его переопределяем
  13. // при просмотре профиля на экране видим вывод функции dump
  14. public function getProfileMenu($profile){
  15. dump($profile);
  16. }
  17.  
  18. }
#15 1 февраля 2016 в 21:47
Вопрос решил, спасибо!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.