Magmi覆盖产品类别的位置

时间:2014-11-27 12:59:16

标签: magento magmi

我正在使用Magmi将产品导入我的Magento商店。即时创建类别并导入产品。一切都运作良好。

除了一件事:每次我运行Magmi导入时,Magento类别中产品的位置都设置为0.这样我就无法对我的产品进行排序。

我搜索过Magmi wiki和github,找到遇到同样问题的人,但没找到任何东西。

任何熟悉这个问题的人都有办法避免这个问题吗?

5 个答案:

答案 0 :(得分:1)

我等了很长时间回答并自己做,这是一个修复:

我的修正工作方式不同 - 仅当您添加$ item [" category_reset"] == 1时,类别位置才会清除;产品参数的参数。

:1280 sting(在当前的magmi版本中)或在 magmi_productimportengine.php 中找到公共函数assignCategories($ pid,$ item)。 亚特

$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 :(得分:1)

只有评论,但由于我是一位长期读者但从未设置过帐户,因此无法直接发表评论而无需代表。我知道这是一个老帖子,但我刚刚找到它并使用了AlexVegas的代码(谢谢!)。工作对我来说几乎没问题,但在我的情况下,我仍然希望类别完全重置为我的Magmi导入中的内容,但我希望这些位置保持不变。如上所述,除非您在导入中使用category_reset列,否则类别仅附加到现有类别,如果您这样做,它也会重置位置。

如果你像我一样,只希望保持完整位置,但每次允许Magmi覆盖类别,请使用上面的Alex代码,但稍微调整一下

他说改变的地方

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,但又不想覆盖定位,请在答案中使用Alex的代码,但不要理会

$currentPositions = array();

这样它就不会覆盖存储类别中位置的数组

答案 2 :(得分:0)

答案 3 :(得分: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);
   }

答案 4 :(得分:-1)

Magmi wiki专门提到了项目定位功能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 

&lt; =这里我们&#34;逃脱&#34;带有反斜杠的树分隔符,该类别将被创建为&#34; catname,其名称和位置为&#34;

sku 00001将在类别

中设置位置3

结束语