Вот что мне нужно для удаления атрибута из настраиваемого продукта.
Это сценарий.
Все настраиваемые продукты были созданы неправильно с атрибутом brand
в качестве настраиваемого атрибута для примерно 50 настраиваемых продуктов, имеющих около 200 простых связанных продуктов.
Все простые продукты, связанные с настраиваемым атрибутом, имеют одну и ту же марку. Идея состоит в том, чтобы удалить brand
из настраиваемых атрибутов и назначить его в качестве простого атрибута для настраиваемого продукта со значением одного из простых продуктов.
Вот код, который делает это. Код запускается только один раз. Его можно добавить в сценарии обновления или в простом php-файле.
<?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;
}
}
}
}
Для чисел, перечисленных выше, это заняло около 15 секунд для запуска на моем локальном компьютере (не мощный). Я уверен, что это можно оптимизировать. Скорее всего, нет необходимости получать все простые продукты настраиваемого продукта, чтобы получить brand
значение, но я не стал беспокоиться.