Как устранять сбой «Undefined offset» операции «list» некачественных сторонних модулей?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
  • Тема закрыта
#1 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

04.09.2014 13:49

Здравствуйте!
Был установлен модуль SEO Layered Navigation Plus от Manadev. После установки обновили кэш, пытаясь зайти на страницу категории с товарами (
http://natozulu.ru/naruchnie-chasy.html
), видим:
Прикрепленное изображение: Снимок экрана от 2014-09-04 14:44:31.png

Также в админке появилось сообщение:
Системный класс «core/store» типа «model» перекрывают конфиктующие между собой классы:
Mana_Seo_Rewrite_Store [используется]
Df_Core_Model_StoreM
Системный класс «core/url» типа «model» перекрывают конфиктующие между собой классы:
Mana_Seo_Rewrite_Url [используется]
Df_Core_Model_Url
Системный класс «catalog/navigation» типа «block» перекрывают конфиктующие между собой классы:
Megnor_AdvancedMenu_Block_Navigation [используется]
Df_Catalog_Block_Navigation

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

04.09.2014 13:51

Опубликуйте программный код на указанной проблемной строке (446) и вокруг неё (по 5 строк кода вверх и вниз)

#3 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

04.09.2014 14:02

     
        }
        else {
            $values = array(explode(',', $value));
        }
        foreach ($values as $singleValue) {
            list($from, $to) = $singleValue;
            if ($path) {
                $path .= $this->_schema->getMultipleValueSeparator();
            }
            if ($isSlider) {
                $path .= $from . $this->_schema->getPriceSeparator() . $to;
            


#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

04.09.2014 14:03

И какая именно строка является тут проблемной (446)?

#5 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

04.09.2014 14:10

list($from, $to) = $singleValue;


#6 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

04.09.2014 14:28

Это дефект разработчиков модуля.
Строка
$values = array(explode(',', $value));

означает, что разработчик говорит системе разбить строку, которая содержит разделитель ",", на две подстроки: текст слева и справа от разделителя.
Далее на строке
list($from, $to) = $singleValue;

разработчик пытается установить переменным $from и $to значения первой и второй подстроки соответственно.
Однако разработчик не счёл нужным учитывать тот факт, что исходная строка могла не содержать разделителя ",".
В такой ситуации у системы нет второй подстроки, и поэтому некачественный код разработчика завершается сбойно при такой операции list (Undefined offset 1).
1 - это как раз индекс второй подстроки, потому что индексация начинается с 0.
Для исправления такого кода надо проверять, действительно ли данные существуют.
Вместо
list($from, $to) = $singleValue;

можно написать:
$from = isset($singleValue[0]) ? $singleValue[0] : null; 
$to = isset($singleValue[1]) ? $singleValue[1] : null; 


В Российской сборке Magento то же самое можно записать короче:
$from = df_a($singleValue, 0); 
$to = df_a($singleValue, 1]);


Поделиться темой: