Byta ”attribute set” på befintliga produkter

Magento har ju klantat till sig vad det gäller att inte erbjuda möjligheten att byta ”attribute set” på befintliga produkter out-off-the-box, så att säga.

Som tur är finns där lösningar.

Det finns för det första ett tillägg värt att nämna:
http://www.magentocommerce.com/magento-connect/flagbit-change-attribute-set.html

Vill du lösa det hela själv utan att behöva klydda med Magentos oroväckande krångel för att lägga till ett tillägg så sammanfattar jag här lite kort.

Öppna och lägg till följande kod i filen på rad 253

app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php
$sets = Mage::getResourceModel(
    'eav/entity_attribute_set_collection')
        ->setEntityTypeFilter(
            Mage::getModel('catalog/product')
                ->getResource()
                    ->getTypeId())
        ->load()
        ->toOptionHash();

array_unshift($statuses, array('label'=>'', 'value'=>''));
$this->getMassactionBlock()->addItem(
    'attribute_set', 
    array(
        'label' => 
            Mage::helper('catalog')->__('Change attribute set'),
        'url' => 
            $this->getUrl(
                '*/*/massAttributeSet', 
                array( '_current'=>true )),
        'additional' => 
            array(
                'visibility'  => array(
                     'name'   => 'attribute_set',
                     'type'   => 'select',
                     'class'  => 'required-entry',
                     'label'  => Mage::helper('catalog')
                              -> __('Attribute Set'),
                     'values' => $sets))));

…och lägg till följande action funktion i controllern för samma modul

.../Adminhtml/controllers/Catalog/ProductController.php
public function massAttributeSetAction()
{
    $productIds = $this->getRequest()->getParam('product');
    $storeId = (int)$this->getRequest()->getParam('store', 0);
    if(!is_array($productIds))
    {
        $this->_getSession()->addError(
            $this->__('Please select product(s)'));
    }
    else
    {
        try
        {
            foreach ($productIds as $productId)
            {
                $product = Mage::getSingleton('catalog/product')
                    ->unsetData()
                    ->setStoreId($storeId)
                    ->load($productId)
                    ->setAttributeSetId(
                        $this->getRequest()->getParam(
                            'attribute_set'))
                    ->setIsMassupdate(true)
                    ->save();
            }
            Mage::dispatchEvent(
                'catalog_product_massupdate_after',
                array('products'=>$productIds));
            $this->_getSession()->addSuccess(
                $this->__(
                    'Total of %d record(s) were successfully '
                   .'updated', count($productIds)));
        }
        catch (Exception $e)
        {
            $this->_getSession()->addError($e->getMessage());
        }
    }
    $this->_redirect(
        '*/*/',
        array(
            'store'=>
                (int)$this->getRequest()->getParam('store', 0)));
}

Länkar

http://www.magentocommerce.com/boards/…
http://www.magentocommerce.com/magento-connect/…