Recently I had to associate all products of a shop to newly created websites in a setup shell script (Associate products to all websites).
This could have been implemented like that:
<?php
/**
* Associates products to the newly created websites
*/
private function _associateProducts()
{
$aWebsiteIDs = Mage::getModel('core/website')
->getResourceCollection()
->getAllIds();
//remove default website
array_shift($aWebsiteIDs);
// bad way would have been:
foreach (Mage::getModel('catalog/product')->getCollection() as
$oProduct){
$oProduct->setWebsiteIds($aWebsiteIDs)->save();
}
}
A much better approach was it to use class Mage_Catalog_Model_Product_Action like that:
<?php
/**
* Associates products to the newly created websites
*/
private function _associateProducts()
{
$aWebsiteIDs = Mage::getModel('core/website')
->getResourceCollection()
->getAllIds();
//remove default website
array_shift($aWebsiteIDs);
//getAllIds();
$aProductIds = Mage::getModel('catalog/product')
->getResourceCollection()
->getAllIds();
// good way (better performance) @see Mage_Catalog_Model_Product_Action
$oProductActionModdel = Mage::getSingleton('catalog/product_action');
$oProductActionModdel->updateWebsites(
$aProductIds,
$aWebsiteIDs,
'add'
);
}
This was much more performant, than saving each product all the time.
By the way: The class Mage_Catalog_Model_Product_Action is really worth a glimpse., because it is really useful to update product attributes too!
