将产品列表的属性设置为“使用默认值”


10

我想将产品列表和商店视图列表的图像设置为“使用默认值”。我知道如何针对每种产品分别进行操作:setData(attributeName,false),因此我可以对我的产品列表进行循环。问题:真的太慢了​​。

$attrArray=array('thumbnail','small_image','image');
$products = array(170,171,172);
$stores = array(17,18,19);
foreach ($stores as $store_id) {
    foreach ($products as $product_id) {
        foreach ($attrArray as $attr) { 
            $product = Mage::getModel('catalog/product')
            ->load($product_id)->setStoreId($store_id)
            ->setData($attr, false)
            ->save();
        }
    }
}

所以我尝试使用Mage :: getSingleton('catalog / product_action')-> updateAttributes($ products,$ attrArray,$ store_id); 而是应该执行相同的操作,但要覆盖一系列产品。它实际上做了些什么:我的所有图像现在都设置为“无图像”,但没有按预期设置为“使用默认值”。

$attrArray = array('thumbnail'=>false,'small_image'=>false,'image'=>false);
$products = array(170,171,172);
$stores = array(17,18,19);
foreach ($stores as $store_id) {
    Mage::getSingleton('catalog/product_action')
    ->updateAttributes($products, $attrArray, $store_id);
}

如果周围的人有一个想法,它真的可以帮助我节省一些时间!谢谢。

Answers:


8

基本上,将属性值设置为“使用默认值”意味着必须删除数据库中该属性,特定产品,商店ID的行。
这是一个简单的解决方案。它需要直接更改数据库,有些人会说这是一个很大的“不行”,但它可以工作。

$attrArray=array('thumbnail','small_image','image');
$products = array(170,171,172);
$stores = array(17,18,19);
$productsAsString = implode(',', $products);
$storesAsString = implode(',', $stores);
//get access to the resource
$resource = Mage::getSingleton('core/resource');
//get access to the db write connection
$connection = $resource->getConnection('core_write');
//model for retrieving attributes
$eavConfig = Mage::getModel('eav/config');
$tables = array();
//get the association between attribute ids and the tables where their values are stored
//group them by table name so you will run a single query for each table
foreach ($attrArray as $attributeCode){
    $attribute = $eavConfig->getAttribute('catalog_product', $attributeCode);
    if ($attribute){
        $tableName = $resource->getTableName('catalog/product') . '_' . $attribute->getBackendType();
        $tables[$tableName][] = $attribute->getId();
    }
}
//for each table delete the attribute values in the specified store for the specified products
foreach ($tables as $tableName => $attributeIds){
    $attributeIdsAsString = implode(',', $attributeIds);
    $q = "DELETE FROM {$tableName}
                WHERE
                    attribute_id IN ({$attributeIdsAsString}) AND
                    entity_id IN ({$productsAsString}) AND
                    store_id IN ({$storesAsString})";
    $connection->query($q);
}

应该是这样。但是,如果我过于自信而这行不通,请首先备份您的数据库。


1
非常感谢,我还没有测试它,因为我不再需要它了,暂时也没有测试服务器,但是以后肯定会有用!
2013年

我保证代码。效果很好!
mpw

它运作良好且快速!
electroid

我想在Magento 2中为所有产品属性设置“使用默认值”选中,我对产品属性值有疑问,它们从默认商店视图中显示,但是很少有属性未设置为“使用默认值” 。因此,每当我更新所有产品视图的这些产品属性值时,这些值都不会反​​映在前端。
Himmat Paliwal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.