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.