다음은 구성 가능한 제품에서 속성을 제거하기 위해 작동하는 이음새입니다.
이것이 시나리오입니다. 약 200 개의 간단한 관련 제품을 가진 약 50 개의 구성 가능한 제품에 대한 구성 가능한 속성으로서의
속성 brand
으로 모든 구성 가능한 제품이 잘못 작성 되었습니다.
구성 가능한 속성과 관련된 모든 단순 제품의 브랜드는 동일합니다. 아이디어는 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
가치 를 얻기 위해 구성 가능한 제품의 모든 간단한 제품을 얻을 필요 는 없지만 귀찮게하지 않았습니다.