PHP warning: Invalid argument supplied for foreach()

Здравия! Журнал ошибок кишит ошибками:

(ERROR @ /home/d/dreamt74/dreamt74.beget.tech/public_html/core/model/modx/modx.class.php: 748) PHP warning: Invalid argument supplied for foreach()

Строка 748
foreach ($resourceMap as $parentId => $mapNode) {
                if (array_search($id, $mapNode) !== false) {
                    $parents[]= $parentId;
                    break;
                }
            }
Что значат эти строки? Как исправить ошибку? Подскажите пожалуйста.
Константин
24 сентября 2022, 13:14
modx.pro
330
0

Комментарии: 23

Артур Шевченко
24 сентября 2022, 20:39
0
Это означает, что в цикл передан не итерируемый элемент, грубо говоря не массив.А чтобы исправить, надо смотреть стэк вызова, так как дело точно не в исходниках Modx.
    Константин
    25 сентября 2022, 09:27
    0
    Попробовал взять для примера карточку товара. Удалял все сниппеты, которые на странице, обновлял страницу и смотрел лог, ошибка сохранялась, отключал плагины, аналогично. Дошло до того, что удалил совершенно весь код страницы, обновил ошибка осталась…
    Александр
    25 сентября 2022, 16:49
    0
    $resourceMap это карта ресурсов modx. Она генерируется при первой инициализации контекста modx и сохраняется в кеш.
    Ошибка значит, что $resourceMap пустая. Проверьте кеш modx. Что там права на запись есть. Почистите кеш. И проверьте чтоб плагины $resourceMap не прибивали. Это иногда рекомендуют на больших сайтах.
      Александр
      25 сентября 2022, 17:44
      0
      файл кеша \core\cache\context_settings\web\context.cache.php
        Константин
        26 сентября 2022, 07:43
        0
        Спасибо, попробовал полностью удалить папку cache, ошибка остается, права на папку 0700
          Александр
          26 сентября 2022, 14:50
          0
          в файле \core\cache\context_settings\web\context.cache.php часть массива resourceMap присутствует?
          Только метод научного тыка. Смотреть по коду что вообще происходит. Пробовать убирать добавлять что-то и так пока не поймешь в чем причина.
          Или modx переставить или сайт заного переписать с обновленным модекс
            Константин
            26 сентября 2022, 18:06
            0
            По поиску прошел — отсутствует. Посмотрел на других сайтах, там есть. Что это значит? Куда копать?
              Александр
              26 сентября 2022, 20:48
              0
              resourceMap либо не генерируется либо его что-то прибивает. Не генерируется значит что то не так с модекс. Что-то прибивает вот здесь modx.pro/solutions/22267 рекомендуют плагин который прибивает
              Костыль OnMODXInit ниже может послужить хорошим решением данной проблемы, и будет надёжным подспорьем довольно долгое время.

              //  Resource map patch to reduce parse time
                if( ! empty( $modx->context->resourceMap ) ) {
                    $options = [ xPDO::OPT_CACHE_KEY => 'context_settings/' . $modx->context->key ];
                    if( $val = $modx->getCacheManager()->get( 'context', $options ) ) {
                        $val[ 'resourceMap' ] = [];
                        $modx->getCacheManager()->set( 'context', $val, 0, $options );
                    }
                }
                //--//
              Искушённый читатель предложит расширить стандартный класс менеджера кеширования и подменить его. На мой взгляд избавиться от плагина потом проще
                Константин
                29 сентября 2022, 08:45
                0
                Создал плагин с кодом выше на событие OnMODXInit, ошибка не ушла. Вариант переустановить modX?
                  Алексей Смирнов
                  29 сентября 2022, 09:55
                  0
                  А вы с нуля ставили MODX? Если так, то попробуйте накатить ту же версию или на 1 версию выше. Кстати, какая версия MODX? php?
                    Константин
                    29 сентября 2022, 10:03
                    0
                    modX: 2.8.4-pl
                    Версия PHP: 7.4

                    Сайт перенес с другого хостинга
                      Алексей Смирнов
                      29 сентября 2022, 10:09
                      0
                      Ну я бы проверил что все файлы перенеслись.
                      Или переустановил той же версией MODX 2 8 4.
                      Еще бы выставить всем папкам и файлам права верные для бегета папки 700, файлы 644.
                      Домен я так понимаю поменялся?
                        Константин
                        29 сентября 2022, 10:11
                        0
                        Да, домен другой, пробую переустановку запустить, почему-то не работает кнопка далее. По клику обновляется эта же страница. Не переходит на следующий шаг. disk.yandex.ru/i/UxY4HF5lwPYZIw
                          Алексей Смирнов
                          29 сентября 2022, 10:16
                          0
                          Вы 4 файла корректировали для нового домена-хоста?
                        Николай Савин
                        29 сентября 2022, 10:11
                        0
                        Корректные права на каталог 755
                          Константин
                          29 сентября 2022, 10:20
                          0
                          На папку setup 755 поставил, все равно кнопка не срабатывает
                  Александр
                  29 сентября 2022, 10:11
                  0
                  Так плагин не надо было создовать. Надо было проверить что похожего плагина нет
                    Константин
                    29 сентября 2022, 10:19
                    0
                    То есть нужно пройти по всем плагином и найти этот код?
                    //  Resource map patch to reduce parse time
                      if( ! empty( $modx->context->resourceMap ) ) {
                          $options = [ xPDO::OPT_CACHE_KEY => 'context_settings/' . $modx->context->key ];
                          if( $val = $modx->getCacheManager()->get( 'context', $options ) ) {
                              $val[ 'resourceMap' ] = [];
                              $modx->getCacheManager()->set( 'context', $val, 0, $options );
                          }
                      }
                      //--//
                      Александр
                      29 сентября 2022, 10:30
                      0
                      да
                        Константин
                        29 сентября 2022, 10:37
                        0
                        А можно поступить так, по очереди отключать каждый плагин и смотреть, исчезла ли ошибка?
                          Александр
                          29 сентября 2022, 10:40
                          0
                          можно. Вы наверно так и делали. Я просто подсказал с чем может быть связана ошибка. Что именно у вас мне не известно
                          Константин
                          29 сентября 2022, 10:46
                          0
                          Поотключал некоторые плагины. Странно, ошибка пропала, однако в \core\cache\context_settings\web\context.cache.php массива resourceMap по прежнему нет
                          Александр
                          29 сентября 2022, 10:50
                          0
                          Выяви на каком именно плагине и его код сюда.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      23