Ось які шви мені працюють, щоб видалити атрибут із продукту, що настроюється.
Це сценарій.
Усі налаштовані продукти були створені неправильно з атрибутом 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
цінність, але я не турбувався.