<?php
class Magmi_ItemdisablerPlugin extends Magmi_ItemProcessor
{
protected $datasource_skus = array();
public function getPluginInfo()
{
return array("name"=>"Magmi Magento Item Disabler",
"author"=>"Axel Norvell (axelnorvell.com)",
"version"=>"1.0.6");
}
public function afterImport()
{
$this->log("Running Item Disabler Plugin","info");
$this->disableItems();
return true;
}
public function getPluginParams($params)
{
return array();
}
public function isRunnable()
{
return array(true,"");
}
public function initialize($params)
{
}
public function processItemAfterId(&$item,$params=null)
{
if(isset($item['sku']))
{
$this->datasource_skus[] = $item['sku'];
}
}
public function disableItems()
{
if(count($this->datasource_skus) <= 0)
{
$this->log('No items were found in datasource. Item Disabler will not run.', "info");
return false; /* Nothing to disable */
}
//Setup tables
$ea = $prefix!=""?$prefix."eav_attribute":"eav_attribute";
$eet = $prefix!=""?$prefix."eav_entity_type":"eav_entity_type";
$cpe = $prefix!=""?$prefix."catalog_product_entity":"catalog_product_entity";
$cpei = $prefix!=""?$prefix."catalog_product_entity_int":"catalog_product_entity_int";
//Get "status" attribute_id
$status_attr_id = "
SELECT ea.attribute_id FROM $ea ea
LEFT JOIN $eet eet ON ea.entity_type_id = eet.entity_type_id
WHERE ea.attribute_code = 'status'
AND eet.entity_type_code = 'catalog_product'";
$result = $this->selectAll($status_attr_id);
if (count($result) == 1) {
$attribute_id = $result[0]['attribute_id'];
}
unset($result);
//Get all active items
$sql = "SELECT e.sku, e.entity_id FROM $cpei i
INNER JOIN $cpe e ON
e.entity_id = i.entity_id
WHERE attribute_id=?
AND i.value = 1";
$all_magento_items = $this->selectAll($sql, array($attribute_id));
//Setup the magento_skus array for easy processing.
$magento_skus = array();
foreach($all_magento_items as $item)
{
$this->log("{$item['sku']} found in Mage", "info");
$magento_skus[$item['sku']] = $item['entity_id'];
}
//process the array, move anything thats in the datasource.
foreach($this->datasource_skus as $sku)
{
if(isset($magento_skus[$sku]))
{
unset($magento_skus[$sku]);
}
}
if(!empty($magento_skus))
{
foreach($magento_skus as $sku => $id)
{
$this->log("Disabling Item Id $id with SKU: $sku", "info");
$this->update("
UPDATE $cpei i
INNER JOIN $cpe e ON
e.entity_id = i.entity_id
SET VALUE = '2'
WHERE attribute_id = ?
AND i.value = 1
AND e.sku=?", array($attribute_id, $sku));
}
}
else
{
//If the Datasource contains all Magento's items.
$this->log('All items present in datasource. No items to disable.', "info");
}
}
}
5条答案
按热度按时间jfewjypa1#
我创建了一个插件,* 禁用 * 不在CSV中的文件。我更喜欢禁用项目,而不是实际删除他们的情况下出错(它不会擦除我的数据库)。
1.创建插件文件
magmi/plugins/extra/general/itemdisabler/magmi_itemdisabler_plugin.php
1.在文件中,粘贴以下内容并保存:
插件代码:
然后登录到Magmi,启用插件并运行导入。此插件将在导入完成后执行。它打开数据源,记录所有SKU,然后将它们与Magento数据库进行比较。任何在数据源中找不到的SKU都将被禁用。此插件可以优化得更好,但它现在的工作方式是这样的。
pokxtpni2#
我认为肯定删除比省略删除要好得多。修改转换适配器来解析列(例如“deleted”)并将
_isDeleted
属性设置为true
应该是很简单的。这将导致产品在保存时被删除。参考
Mage_Core_Model_Abstract
和Varien_Object
。f0ofjuux3#
这里有一个Magmi插件,它做的正是你正在寻找的imo:http://www.emvee-solutions.com/blog/magmi-delete-disable-products-missing-csv-source/
tzxcd3kk4#
我试过使用内置的产品删除器,但效果不太理想。它会删除旧产品,但当它再次添加时,会增加产品编号,所以在几次导入后,您的产品编号为1xxxxx。
如果我只有从CSV导入的产品,而没有“总是”在那里的产品,我实际上使用一个php脚本之前,magmi删除所有的产品:
希望能有所帮助。
kmbjn2e35#
我想我会提到,如果人们有一个非常大的产品列表,他们可能会遇到问题,他们试图运行这个disabler。我不是超级熟悉magmi,但它似乎更多的错误似乎显示当使用cli,所以如果你注意到disbling不起作用的话,试着用它来测试一下。它对我不起作用,我把它缩小到php内存限制。我不得不更改脚本以包含ini_set('memory_limit','512 M');在disableItems函数中。
所以,我的现在看起来像这样....
我希望这能帮助任何人,如果他们有问题的话。我还必须设置我的运行,只要它需要和一切。这可能是最好的设置在您的配置文件,但这是一个快速的解决方案,特别是如果你在一个共享主机上。