Magmi 覆盖产品在类别中的位置
Posted
技术标签:
【中文标题】Magmi 覆盖产品在类别中的位置【英文标题】:Magmi overwriting position of products in category 【发布时间】:2014-11-27 12:59:15 【问题描述】:我正在使用 Magmi 将产品导入我的 Magento 商店。动态创建类别并导入产品。一切正常。
除了一件事:每次我运行 Magmi 导入时,产品在 Magento 类别中的位置设置为 0。这样我就无法按位置对产品进行排序。
我在 Magmi wiki 和 github 上搜索了遇到同样问题但没有找到任何东西的人。
任何人都熟悉这个问题,有没有办法避免它?
【问题讨论】:
这有点棘手。该格式允许使用 ::position 语法设置项目在类别中的位置。如果未设置和产品存在与未设置和新产品(这将强制为 0),我可能会区分行为。谢谢报告。 还有一点解释。我正在进口相同类别的相同产品。所以它们是存在的。导入前的位置我也填了比如1,2,3等,导入后位置重置为0。 我就是这么说的。对于 magmi no position = position 0.so 执行更新时,它会覆盖该位置。我应该添加差异测试或快速修复,在导入文件中使用定位语法。 好的,很酷。唯一的问题是:我们从没有存储位置的外部来源导入产品。我们只在 Magento 中添加位置。所以我们不能在 csv 文件中添加位置,因为我们还不知道它在那里。 我会尽快更新代码来处理这种情况 【参考方案1】:我等待答案太久,自己做,这里有一个解决方法:
我的修复方法是其他方式 - 只有添加 $item["category_reset"] == 1; 才能清除类别位置参数到产品参数。
:1280 sting(在当前 magmi 版本中)或在 magmi_productimportengine.php 中找到 public 函数 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)
...
【讨论】:
【参考方案2】:仅发表评论,但由于我是长期读者,但从未设置过帐户,也无法直接发表评论而没有代表。我知道这是一篇旧帖子,但我刚刚找到它并使用了上面 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();
这样它就不会覆盖存储类别中位置的数组
【讨论】:
【参考方案3】:不是一个实际的解决方案-
你可以试试这个插件
http://www.magentocommerce.com/magento-connect/c3-category-position-import-export-extension.html/
【讨论】:
【参考方案4】:如果存在,您可以忽略 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);
【讨论】:
【参考方案5】: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
sku 00001 将设置为类别中的第 3 位
结束引用
【讨论】:
是的,但您没有正确阅读问题。我无法导入具有正确位置的文件。所以我一直在寻找一种 Magmi 不会存储默认位置的方法。 AlexVegas 的回答对此有所帮助。 @Patrick Steenks,你说得对,我错过了上面的 cmets:“我们从外部来源导入产品,其中没有存储位置。”因此,您正在导入具有类别的产品,而这些产品已经存在于 Magento 中,并且项目位置在该类别中?你说“我也把导入前的位置填到了比如1,2,3等。”你的意思是填写Magento,还是填写Magmi文件?如果填写在Magento中,是否可以将Magento中已经存在的产品位置添加到Magmi csv中,然后导入?所以它用相同的数字覆盖位置,而不是 0?以上是关于Magmi 覆盖产品在类别中的位置的主要内容,如果未能解决你的问题,请参考以下文章