To Update massive amounts of data in magento without going directly into the database I found an interesting piece of code under http://www.mydons.com/writing-custom-magento-shell-script/:
<?php require_once 'abstract.php'; /** * Mydons Inventoryupdate Shell Script * * @author Mydons */ class Mydons_Shell_Inventory extends Mage_Shell_Abstract { /** * Run script * */ public function run() { Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); $file_handle = fopen("Inventory.csv", "r"); while (!feof($file_handle)) { $line_of_text = fgetcsv($file_handle, 1024); $productSku = $line_of_text[0]; $qty = $line_of_text[1]; $product = Mage::getModel('catalog/product') ->loadByAttribute('sku', $productSku); if ($Product) { $stockItem = Mage::getModel('cataloginventory/stock_item') ->loadByProduct($product); // Set Product Stock Data Here $stockItem->setData('is_in_stock', 1); $stockItem->setData('qty', $qty); $stockItem->save(); echo "Updated Inventory for product " . $productSku . "\n"; } else { echo "Product " . $productSku . " Doesnt Exist \n"; } } fclose($file_handle); } /** * Retrieve Usage Help Message * */ public function usageHelp() { return <<<USAGE Usage: php -f inventory.php -- [options] php -f inventory.php USAGE; } } $shell = new Mydons_Shell_Inventory(); $shell->run();
I adopted this file to simply print the sku of all products in the shop and count them:
<?php require_once 'abstract.php'; /** * SkuPrinter * * @author manuel */ class Update extends Mage_Shell_Abstract { /** * Run script */ public function run() { Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); $collection = Mage::getResourceModel('catalog/product_collection'); $i=0; foreach ($collection as $product) { echo $product->getSku() . "\n"; $i++; } print "#products: $i\n"; } /** * Retrieve Usage Help Message */ public function usageHelp() { return <<<USAGE Usage: php -f update.php -- [options] php -f update.php USAGE; } } $shell = new Update(); $shell->run();
These two examples show how to iterate over all products and how to get a specific product by sku. They have to be placed in ${magento_root}/shell
To speed up updates a bit magento provides the ability to update single fields instead of the whole product as in code snippet one:
$product->setAttributeCode($newValue) $product->getResource()->saveAttribute($product, 'attribute_Code');
Of course the fastest way is to write SQL queries. Therefor please read into the magento EAV model.