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 版本中)或在 ma​​gmi_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 覆盖产品在类别中的位置的主要内容,如果未能解决你的问题,请参考以下文章

是否有 Magmi 插件可以删除不在 CSV 文件中的产品?

PHP 根据类别覆盖theme_links中的特定链接。

将图像覆盖添加到特定类别的缩略图 - wordpress

Magmi 不更新产品

使用 Magmi Datapump 删除产品

如果两个 ObjC 类别覆盖相同的方法会发生啥?