2

我的 magento 商店中有大约 5,000 个属性。我已经通过 csv 上传了所有属性。现在我想通过 csv 更新一些属性。我可以通过此代码更新数量属性http://www.sonassi.com/知识库/magento-kb/mass-update-stock-levels-in-magento-fast/

现在我想更新我创建的另一个属性品牌。我找到了这段代码http://www.blog.magepsycho.com/updating-product-qty-in-magento-in-an-easier-faster-way/我更改为适合我的需要,但它不起作用

请帮忙。

提前致谢。

4

1 回答 1

0

您需要注意 2 个字段,SKU 和您将要更新的属性。在本例中,我将使用作为文本字段的颜色属性(如果您正在处理文本字段以外的任何内容,则代码会略有变化)。

首先,由于您可能不想构建一个完整的模块来处理导入,您需要在一个新的 PHP 文件中初始化 magento。除非您在 magento 根目录中运行此脚本,否则在 app/Mage.php 之前添加 magento 的完整路径。

require_once('app/Mage.php');
umask(0);
Mage::app();

接下来,您需要将 CSV 文件处理成一个数组。确保 CSV 的第一行包含列标题。此函数应负责将 CSV 处理为数组:https ://gist.github.com/jaywilliams/385876

包含该脚本后,您可以运行以下内容:

$csv_products = csv_to_array('path/to/your/csv/file.csv');

然后,您可以遍历每个产品,查找 SKU 并更新其颜色属性。这假定 SKU 属性为小写sku,颜色属性为小写color

for($i=0;$i<sizeof($csv_products);$i++) {
    $currentProduct = Mage::getModel('catalog/product')->loadByAttribute('sku',$csv_products[$i]['sku']);
    if($currentProduct) {
        $currentProduct->setColor($csv_products[$i]['color']);
        $currentProduct->save();
        //with 5,000 products you probably want to output something here so
        //that you can make sure the script is running.  Just make sure that
        //you don't lose track of Product not found output (from below).
        echo 'Success '.$i. ': ' . $csv_products[$i]['sku'] ."\n";
    } else {
        //we don't want to break the loop, but you'll probably want to record
        //that this sku can't be found in magento.  You can just echo this
        //since the script will probably be running in the console.
        echo 'Product not found: '.$csv_products[$i]['sku']."\n";
    }
}

您需要从命令行运行它,因为它可能需要很长时间。当我更新大约 4,000 种产品时,我花了大约 2 个小时(更多属性,并使用下拉菜单)。

要使用下拉列表(仍然使用颜色示例),您可以在循环浏览产品之前添加类似这样的内容:

$color_attribute = Mage::getModel('eav/entity_attribute')->loadByCode('catalog_product', 'color');
$loaded_colors = array();
$valuesCollection = Mage::getResourceModel('eav/entity_attribute_option_collection')->setAttributeFilter($color_attribute->getId())->setStoreFilter(Mage_Core_Model_App::ADMIN_STORE_ID, false)->load();   
foreach ($valuesCollection as $item) {
    $loaded_colors[strtolower($item->getValue())] = $item->getId();
}

然后你可以设置一个这样的颜色属性:

$currentProduct->setColor($loaded_colors[$csv_products[$i]['color']]);

使用多选时,您需要向 setColor 提供 CSV。这样的事情会起作用(假设您的 CSV 在单个字段中有一个逗号分隔的选项列表)。

$colorArray = explode(',',$csv_products[$i]['color']);
if(sizeof($colorArray) > 1) {
    for($k = 0;$k<sizeof($colorArray);$k++) {
        $colorArray[$k] = $loaded_colors[$colorArray[$k]];
    }
    $colorString = implode(',',$colorArray);
} else {
    $colorString = $csv_products[$i]['color'];
}
$currentProduct->setColor($colorString);

有一些方法可以避免在脚本开始运行之前构建属性标签和值的数组,但这需要额外的查找并减慢导入速度。

于 2013-06-06T00:48:54.340 回答