При сохранении записи контента типа "Страница" после повторного редактирования получаю Notice: Trying to access array offset on value of type bool in public_html/system/controllers/activity/frontend.php on line 71

ЕСТЬ РЕШЕНИЕ
#1 10 октября 2022 в 21:00

Сайт на версии 2.15.2

Включал режим отладки (обновлялся с 2.15.1). Обновлялся стандартно, по инструкции, все как обычно. Прошло успешно.

Но через день при работе сайта при обычном редактировании ранее созданных страниц стал видеть предупреждение т.к. режим отладки остался включенным.

Notice: Trying to access array offset on value of type bool in ..../public_html/system/controllers/activity/frontend.php on line 71 Warning: Cannot modify header information — headers already sent by (output started at .../public_html/system/controllers/activity/frontend.php:71) in ..../public_html/system/core/controller.php on line 1216

Стал разбираться. При создании новой страницы — все нормально. При повторном редактировании и сохранении только что созданной — предупреждение появляется, при этом страница все же обновляется. Посмотрел в код frontend.php. Функция updateEntry(). 71 строка — это return

Вставил вывод переменной и получил, что переменная $type равна bool(false). Что же тогда получается может быть в $type['id']? Получаю NULL и этот же Notice

  1. public function updateEntry($controller, $name, $subject_id, $entry){
  2.  
  3. $type = $this->model->getType($controller, $name);
  4.  
  5. list($type, $subject_id, $entry) = cmsEventsManager::hook('activity_before_update_entry', [$type, $subject_id, $entry]);
  6.  
  7. return $this->model->updateEntry($type['id'], $subject_id, $entry);
  8. }

Методом научного «тыка» нашел, что если включен стандартный компонент «Лента активности», то при редактировании страницы получаю предупреждение. Если отключаю этот компонент — предупреждение исчезает. Причем в настройках Ленты активности не стоит галка на контенте «Страницы». Впрочем, установка этой галки в этих опциях не меняет ситуацию.

Подскажите, пожалуйста, как можно исправить данную проблему не отключая компонент «Лента активности»?

#2 11 октября 2022 в 00:44

Идёт обращение к ячейке массива ($type['id']) без проверки наличия этой ячейки, да и массив ли это вообще.

Попробуйте таким образом переписать этот метод:

  1. public function updateEntry($controller, $name, $subject_id, $entry){
  2.  
  3. if($type = $this->model->getType($controller, $name)) {
  4.  
  5. list($type, $subject_id, $entry) = cmsEventsManager::hook('activity_before_update_entry', [$type, $subject_id, $entry]);
  6.  
  7. return $this->model->updateEntry($type['id'], $subject_id, $entry);
  8. }
  9. }

Или так:

  1. public function updateEntry($controller, $name, $subject_id, $entry){
  2.  
  3. $type = $this->model->getType($controller, $name);
  4.  
  5. list($type, $subject_id, $entry) = cmsEventsManager::hook('activity_before_update_entry', [$type, $subject_id, $entry]);
  6.  
  7. return $type ? $this->model->updateEntry($type['id'], $subject_id, $entry) : null;
  8. }
#3 11 октября 2022 в 09:47

 bestit, надо смотреть в базе данных в таблице cms_activity_types, есть ли там запись у которой controller = content и name = add.системное_имя_вашего_типа_контента. Если нет, то надо добавить, выглядит это примерно так

Изображение
#4 11 октября 2022 в 12:27

 bestit, надо смотреть в базе данных в таблице cms_activity_types, есть ли там запись у которой controller = content и name = add.системное_имя_вашего_типа_контента. Если нет, то надо добавить, выглядит это примерно так

Loadырь

Спасибо, Loadырь! Вы и здесь успеваете помогать 😉

Прикладываю мои значения.

Изображение

Сравним две таблицы. Стандартные Страницы ('pages') здесь отображены в первой строке. У них свой одноименный контроллер. А все новые создаваемые типы контента проходят контроллер 'content' и автоматом сюда попадают при создании. При редактировании в мною созданных типах контента Notice не возникает. Также Notice не возникает при создании новой страницы. Возникает только при последующих ее редактированиях.

Второй момент, эта таблица меняется через настройки компонента 'Лента активности'. В столбце 'is_enabled' прописывается '1'. Но управлять можно почему-то только методом добавления контента 'add'. 

Изображение

Можно, конечно, попробовать вставить в БД такую строку: 

  1. INSERT cms_activity_types(is_enabled, controller, name, title, description)
  2. VALUES (0, 'pages', 'update.pages', 'Редактирование страниц', 'редактирует страницу %s');

Здесь я не уверен какое именно значение нужно прописать в столбец 'name': 'update.pages' или 'edit.pages'

Но, в целом, мне кажется, что это не совсем то, что в данной ситуации правильно делать. Ведь то, что редактируется и проходит контроллер 'content не вызывает этот Notice.

Поэтому то, что предлагает Сергей Сергеевич в моем случае мне кажется более правильным. И получается, что логическая ошибка присутствует где-то  в обработке контроллера 'pages' в самой InstantCMS.

Сергей Сергеевич, благодарю! Ваше решение помогло.

#5 11 октября 2022 в 12:53

Тогда встречный вопрос. В админке в Компоненты — Управление событиями, если отфильтровать события по названию «activity_before_update_entry» у вас в списке, что-то покажет?

Изображение
#6 11 октября 2022 в 13:09

Пусто

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