2014-11-27 4 views
1

Я использую Magmi для импорта продуктов в магазин Magento. Категории создаются «на лету», а продукты импортируются. Все работает хорошо.Magmi, переписывающее положение продуктов в категории

За исключением одного: каждый раз, когда я запускаю импорт Magmi, положение продукта в категории Magento равно 0. Таким образом, я не могу сортировать свои товары в позиции.

Я искал Магию wiki и github для тех, кто столкнулся с той же проблемой, но ничего не нашел.

Кто-нибудь знаком с этой проблемой и есть ли способ избежать этого?

+0

Это немного сложно. формат позволяет установить положение позиции в категории, используя синтаксис позиции. я могу дифференцировать поведение, если не установлено & продукт существует vs not set & new product (который заставил бы 0). thx для отчетности. – dweeves

+0

Немного больше объяснений на месте. Я импортирую одни и те же продукты в той же категории. Таким образом, они существуют.Я также заполнил позицию перед импортом, например, 1,2,3 и т. Д. После импорта позиция сбрасывается до 0. –

+0

вот что я говорил. для magmi no position = position 0.so при выполнении обновления он перезаписывает позицию. я должен добавить дифференциальный тест или получить быстрое исправление, использовать синтаксис позиционирования в вашем файле импорта. – dweeves

ответ

1

Я слишком долго ждать ответа и сделать это сам, вот фикс:

мое исправление работает другим способом - позиции категории ясно, только если добавить $ пункт [ «category_reset»] == 1; param для параметров продукта.

: 1280 жала (в текущей версии magmi) или найти публичную функцию assignCategories ($ PID, $ запись) в magmi_productimportengine.php. Атера

$cce = $this->tablename("catalog_category_entity"); 

$ccpt = $this->tablename("catalog_category_product"); 

добавить следующий код:

$sql = "SELECT $ccpt.* 
      FROM $ccpt 
      JOIN $cce ON $cce.entity_id=$ccpt.category_id 
      WHERE product_id=?"; 
    $currentPositions = $this->selectAll($sql,$pid); 

затем изменить категорию сброса:

if (!isset($item["category_reset"]) || $item["category_reset"] == 1) 
{...} 

к

if (isset($item["category_reset"]) && $item["category_reset"] == 1) 
    { 
     $sql = "DELETE $ccpt.* 
     FROM $ccpt 
     JOIN $cce ON $cce.entity_id=$ccpt.category_id 
     WHERE product_id=?"; 
     $this->delete($sql, $pid); 
     $currentPositions = array(); 
    } 

после этого блока изменения с позиционированием

foreach ($catids as $catdef) 
     {...} 

к:

// find positive category assignments 

    if (is_array($currentPositions) && count($currentPositions)) { 
     foreach ($currentPositions as $currentPosition) { 
      $catPos[$currentPosition['category_id']] = $currentPosition['position']; 
     } 
    } 

    foreach ($catids as $catdef) 
    { 
     $a = explode("::", $catdef); 
     $catid = $a[0]; 
     if (count($a) > 1 && $a[1] != 0) { 
      $catpos = $a[1]; 
     } 
     else { 
      if (isset($catPos[$catid]) && $catPos[$catid] != 0) { 
       $catpos = $catPos[$catid]; 
      } 
      else { 
       $catpos = "0"; 
      } 
     } 
     $rel = getRelative($catid); 
     if ($rel == "-") 
     { 
      $ddata[] = $catid; 
     } 
     else 
     { 
      $cdata[$catid] = $catpos; 
     } 
    } 

если вы не позиция импорта, текущая позиция будет сохранить. Если бы это 0, то остаться 0.

для ясного фактического положения - добавить параметров для элемента продукта:

$item["category_reset"] == 1; 

или строка изменения обратно:

if ($item["category_reset"] == 1) 
     { ....} 

к:

if (!isset($item["category_reset"]) || $item["category_reset"] == 1) 
{...} 
-1

Вики-статья Magmi специально упоминает функциональность позиционирования позиции here См. Цитируемый текст ниже. Кажется, это точно описывает функциональность, которую вы ищете? Я не тестировал его сам.

Цитата:

позиционирование товара

С magmi 0.7.18, category_ids колонка была повышена с позиционированием пункт.Эта функция также поддерживается в категории импортера от версии 0.2+ (с категории импортер плагин грубо говоря, category_ids генератор)

Образец

store,sku,....,categories 
admin,00001,.....,cat name with \/ in the name and positioning::3 

< = здесь мы «убежали» разделитель дерева с обратной косой черты категория будет создана как «catname с/на имя и позиционирование»

СКУ 00001 будет установлен с позиции 3 в категории

Конец цитаты

+0

Да, но вы не правильно прочитали вопрос. Мне не удалось импортировать файл с правильными позициями. Поэтому я искал способ, которым Магми не сохранил позиции по умолчанию. Ответ AlexVegas помог в этом. –

+0

@Patrick Steenks, вы правы, я пропустил комментарии выше: «мы импортируем продукты из внешнего источника, где позиция не сохраняется». Итак, вы импортируете продукты с категориями, и эти продукты уже существуют в Magento с позиции позиции в категории? Вы говорите: «Я также заполнил позицию перед импортом, например, 1,2,3 и т. Д.» Вы имеете в виду заполнение в Magento или заполнение в файле Magmi? Если вы заполняете Magento, можете ли вы добавить позиции продукта, которые уже существуют в Magento, в Magmi csv, а затем импортировать? Таким образом, он перезаписывает позицию с таким же числом, а не 0? –

1

только комментарий, но так как я читатель долгое время, но никогда не настроить учетную запись и не может оставлять комментарий напрямую без комментариев. Я знаю, что это старый пост, но я только что нашел его и использовал код AlexVegas выше (спасибо!). Работала почти нормально для меня, но в моем случае я все еще хотел, чтобы категории полностью сбросились только на то, что было в моем импорте Magmi, но я хотел, чтобы позиции оставались нетронутыми. Как указано выше, категории добавляются только к существующим, если вы не используете столбец category_reset при импорте, и если вы это сделаете, он также сбрасывает позицию.

Если вы похожи на меня и хотят только положение, чтобы остаться нетронутыми, но позволяют Magmi перезаписать категорий каждый раз, используйте код Алекса выше, но настроить его немного

Где он говорит, чтобы изменить

if (!isset($item["category_reset"]) || $item["category_reset"] == 1) {...}

в

if (isset($item["category_reset"]) && $item["category_reset"] == 1) 
{ 
    $sql = "DELETE $ccpt.* 
    FROM $ccpt 
    JOIN $cce ON $cce.entity_id=$ccpt.category_id 
    WHERE product_id=?"; 
    $this->delete($sql, $pid); 
    $currentPositions = array(); 
} 

не меняйте его. Это так просто. В своем коде он предотвращает сброс категории, если не указан столбец, поэтому оператор if изменяется. Если столбец существует, он также уничтожает массив currentPositions, который хранит текущие позиции в категориях, чтобы те также были сброшены.

Если вы хотите добавить к категориям, если category_reset не находится в процессе импорта, но не хотите, чтобы перезаписать позиционирование, используйте код Алекса, как это выше в своем ответе, но оставить из

$currentPositions = array();

Таким образом, он не будет перезаписывать массив, который хранит позиции в категориях

0

Вы можете игнорировать позицию UPDATE, если существует

категории создатель/импортер v0.2.5 на линии 1248 заменить на

if (count($inserts) > 0) { 
    $sql = "INSERT IGNORE INTO $ccpt (`category_id`,`product_id`,`position`) VALUES "; 
    $sql .= implode(",", $inserts); 
    // $sql .= " ON DUPLICATE KEY IGNORE"; 
    $this->insert($sql, $data); 
    unset($data); 
    }