Đây là những đường nối hoạt động với tôi để loại bỏ một thuộc tính khỏi sản phẩm có thể định cấu hình.
Đây là kịch bản.
Tất cả các sản phẩm có thể định cấu hình được tạo sai với thuộc tính brand
là thuộc tính có thể định cấu hình cho khoảng 50 sản phẩm có thể định cấu hình có khoảng 200 sản phẩm được liên kết đơn giản.
Tất cả các sản phẩm đơn giản liên quan đến một thuộc tính cấu hình có cùng một thương hiệu. Ý tưởng là loại bỏ brand
khỏi các thuộc tính có thể cấu hình và gán nó như một thuộc tính đơn giản cho sản phẩm có thể định cấu hình với giá trị của một trong những sản phẩm đơn giản.
Đây là mã làm điều này. Mã chỉ được chạy một lần. Nó có thể được thêm vào trong một kịch bản nâng cấp hoặc một tệp php đơn giản.
<?php
//==>this is required only if you use a simple php file
error_reporting(E_ALL | E_STRICT);
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app();
//<==
$brand = 'brand';
//get the attribute instance
$brandAttribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $brand);
//if this attribute exists
if ($brandAttribute->getId()){
//make the attribute apply to al types of products in case it's not
$brandAttribute->setApplyTo(null);
$brandAttribute->save();
$resource = Mage::getSingleton('core/resource');
//get an object with access to direct queries
$connection = $resource->getConnection('core_write');
//get all configurable products - you can specify additional filters here
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('type_id', 'configurable');
foreach ($collection as $product){
//the configurable attributes are stored in the table 'catalog_product_super_attribute'
//remove the attribute references from that table.
//The constraints will take care of the cleanup.
$q = "DELETE FROM {$resource->getTableName('catalog_product_super_attribute')}
WHERE attribute_id = {$brandAttribute->getId()} AND product_id = {$product->getId()}";
$connection->query($q);
//get the simple products in the configurable product
$usedProducts = $product->getTypeInstance(true)->getUsedProducts(null, $product);
foreach ($usedProducts as $p){
//identify the first simple product that has a value for brand
//set that value to the configurable product.
if ($brandValue = $p->getData($brand)){
Mage::getSingleton('catalog/product_action')
->updateAttributes(array($product->getId()), array($brand=>$brandValue), 0);
break;
}
}
}
}
Đối với các số được liệt kê ở trên, việc này mất khoảng 15 giây để chạy trên máy cục bộ của tôi (không phải là số mạnh). Tôi chắc chắn rằng điều này có thể được tối ưu hóa. Hầu hết có lẽ không cần phải lấy tất cả các sản phẩm đơn giản của một sản phẩm có thể định cấu hình để nhận được brand
giá trị, nhưng tôi không bận tâm.