[Помогите] Total Import Pro и oCStore - ошибка при импорте

Тема в разделе "OpenCart", создана пользователем sonicking, 12 апр 2016.

  1. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    436
    Симпатии:
    114
    добрый день.использую (вернее пытаюсь использовать) для импорта товаров Total Import Pro

    при импорте выскакивает ошибка:

    The server returned an error. If you believe this is a bug then get in touch and attach the following error message:
    Notice: Undefined offset: 0 in D:\11042016\OpenServer\domains\xxxxxxx\admin\model\catalog\product.php on line 228{"updated":51,"added":0}

    думал какой то vqmod мешает. поставил чистый магазин на локалке (версия 15512), ошибка пристутствует.

    если закоментировать в product.php строку с ошибкой ( $this->db->query("UPDATE " . DB_PREFIX . "product_to_category SET main_category = 1 WHERE product_id = '" . (int)$product_id . "' AND category_id = '" . (int)$data['product_category'][0] . "'"); ) - то импорт проходит нормально, но за что то ведь закоментированная строка отвечает :о)

    не хотелось бы тут избавится от ошибки, а где то получить новую...

    в оригинальном opencarte этих строк в файле product.php вообще нет (код со строки 224)
    Код:
     
            if (isset($data['main_category_id']) && $data['main_category_id'] > 0) { 
     
                $this->db->query("DELETE FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "' AND category_id = '" . (int)$data['main_category_id'] . "'"); 
     
                $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . (int)$data['main_category_id'] . "', main_category = 1"); 
     
            } elseif (isset($data['product_category'])) { 
     
                $this->db->query("UPDATE " . DB_PREFIX . "product_to_category SET main_category = 1 WHERE product_id = '" . (int)$product_id . "' AND category_id = '" . (int)$data['product_category'][0] . "'"); 
     
            } 
    
    подскажите, за что он отвечает и как избавится от ошибки

    заранее спасибо
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Проблема здесь:
    PHP:
    (int)$data['product_category'][0]
    Ошибка говорит о том, что в этой переменной нет элемента с индексом 0 (скорее всего, там вообще не массив).
    А сама строка отвечает за то, чтоб указать у существующего товара главную категорию.

    Для начала советую вписать перед этой строкой это:
    PHP:
    $this->log->write($data['product_category']);
    Сделать импорт, а затем в журнале ошибок посмотреть, что же всё-таки внутри этой переменной.
    А потом просто удалить из кода [0]. В принципе, это можно сделать и сразу, но лучше всё же убедиться, что в этой переменной таки есть id категории.
     
  3. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    436
    Симпатии:
    114
    приветствую!
    если поставить строку, то импорт вылетает с ошибкой, в журнале следующее
    если закомментировать [0] - то импорт проходит, вот только бы быть уверенным, что этот [0] ни на что не влияет...
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Мда, судя по Гитхабу ОпенКарта там только в 1.5.6.3 сделали нормальное логирование массивов, я почему-то был уверен, что это произошло ещё в 1.5.5.
    Впишите так:
    PHP:
     $this->log->write(print_r($data['product_category'], true)); 
    И смотрите журнал после импорта.
     
  5. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    436
    Симпатии:
    114
    теперь так
     
    Последнее редактирование: 14 апр 2016
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Теперь понятно - там не всегда есть id категории.
    Замените это
    PHP:
    } elseif (isset($data['product_category'])) { 
    на это
    PHP:
    } elseif (isset($data['product_category']) && !empty($data['product_category'])) { 
     
    sonicking нравится это.
  7. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    436
    Симпатии:
    114
    так вроде импорт проходит без ошибок

    как оказалось, этот код в файле встречается дважды
    только в первом варианте эта строка выглядит так - } elseif (isset($data['product_category'][0])) {
    а во втором варианте так - } elseif (isset($data['product_category'])) {
    если сделать второй вариант аналогичным первому - то импорт то же проходит

    чем ваш вариант } elseif (isset($data['product_category']) && !empty($data['product_category'])) {
    отличяется от этого } elseif (isset($data['product_category'][0])) {
    ?
     
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Мой вариант проверяет, что содержимое $data['product_category'] не пустое. Тот вариант проверяет существование конкретного индекса внутри этого массива. В принципе, особой разницы нет, если предположить, что в этом массиве либо ничего нет, либо есть то, что надо. Но, если, например, значение будет не в нулевой ячейке, а в первой, то оба варианта не помогут.

    Вообще, это всё гавнокод изначально. Если не выходить за рамки текущего файла (и не задаваться вопросом зачем там вообще массив, если он либо пустой, либо содержит только одно значение), то вместо $data['product_category'][0] нужно использовать reset($data['product_category']). Таким образом, всегда обращаться к первому элементу не привязываясь к индексам.

    PHP:
    } elseif (isset($data['product_category']) && !empty(reset($data['product_category']))) { 
    и дальше вместо $data['product_category'][0] - reset($data['product_category']).
     
    sonicking нравится это.