Türchen 21: Konfigurierbare Produkte anlegen

Türchen 21 ist ein besonderes Türchen, auch für uns. Es ist ein Gastbeitrag von Vinai Kopp, bekannt z.B. durch das Buch Magento - Das Handbuch für Entwickler. Vielen Dank an dieser Stelle an ihn! Nun zu seinem Beitrag: Einfache Produkte lassen sich in Magento auch einfach anlegen. Mit individuellen Optionen steht auch eine Möglichkeit zur Verfügung diese zu Individualisieren. Diese sind bei einer Anbindung an ein ERP-System aber meistens nicht sehr angenehm einsetzbar. Darum hier als eine alternative Code-Schnipsel zum Anlegen von konfigurierbaren Produkten.

Im Beispiel gehen ich davon aus das die Produkt-Attribute color und size schon existieren und jeweils alle benötigten Attribut-Werte angelegt wurden.

require_once 'app/Mage.php';

Mage::app('admin');

/*
 * Vorbereiten der Daten
 */
$varianten = array(
	array('color' => 'Rot',   'size' => 'S', 'price' => '10.00'),
	array('color' => 'Rot',   'size' => 'M', 'price' => '10.00'),
	array('color' => 'Rot',   'size' => 'L', 'price' => '10.00'),
	array('color' => 'Blau',  'size' => 'M', 'price' => '10.00'),
	array('color' => 'Blau',  'size' => 'L', 'price' => '10.00'),
	array('color' => 'Gold',  'size' => 'S', 'price' => '12.00'),
	array('color' => 'Gold',  'size' => 'L', 'price' => '12.00'),
);

$attributeModels = array(
	'color' => Mage::getModel('catalog/resource_eav_attribute')->loadByCode('catalog_product', 'color'),
	'size'  => Mage::getModel('catalog/resource_eav_attribute')->loadByCode('catalog_product', 'size')
);

$product = Mage::getModel('catalog/product');

/*
 * Anlegen der Simple Products
 */
foreach ($varianten as $i => $variante)
{
	$product->reset()
		->setData(array(
			'name' => sprintf('Shirt %s %s', $variante['color'], $variante['size']),
			'sku' => sprintf('shirt-%s-%s', $variante['color'], $variante['size']),
			'status' => true,
			'type_id' => Mage_Catalog_Model_Product_Type::TYPE_SIMPLE,
			'visibility' => Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE,
			'website_ids' => array_keys(Mage::app()->getWebsites()),
			'stock_data' => array(
				'qty' => 100,
				'is_in_stock' => 1
			),
			'attribute_set_id' => $product->getDefaultAttributeSetId(),
			'tax_class_id' => 2,
		));

	/*
	 * Setzen der Options Werte
	 */
	foreach ($variante as $code => $wert)
	{
		if (isset($attributeModels[$code]))
		{
			$wert = $attributeModels[$code]->getSource()->getOptionId($wert);
		}
		$product->setData($code, $wert);
	}

	$product->save();

	/*
	 * Merken der Simple Product ID für später
	 */
	$varianten[$i]['id'] = $product->getId();
}

/*
 * Vorbereiten des konfigurierbaren Produktes.
 * Verwenden eines frischen Product Models damit die Product Type Instance des
 * Simple Products nicht wiederverwendet wird.
 */
$product = Mage::getModel('catalog/product')
	->setData(array(
		'name' => 'Your next Shirt',
		'sku' => 'shirt',
		'category_ids' => '10',
		'status' => true,
		'type_id' => Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE,
		'visibility' => Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
		'website_ids' => array_keys(Mage::app()->getWebsites()),
		'stock_data' => array(
			'is_in_stock' => 1
		),
		'attribute_set_id' => $product->getDefaultAttributeSetId(),
		'tax_class_id' => 2,
		'price' => 10,
	));

/*
 * Setzen der Daten für die Varianten
 */
$simpleProductIds = array();
$attributeData = array('color' => array(), 'size' => array());

foreach ($varianten as $variante)
{
	$simpleProductIds[$variante['id']] = true;

	$priceDelta = $variante['price'] - $product->getPrice();
	foreach (array_keys($attributeData) as $code)
	{
		if (! $attributeData[$code])
		{
			$attributeData[$code] = array(
				'attribute_id' => $attributeModels[$code]->getId(),
				'label' => $attributeModels[$code]->getFrontendLabel(),
				'default_label' => $attributeModels[$code]->getFrontendLabel(),
				'store_label' => $attributeModels[$code]->getFrontendLabel(),
				'use_default' => true,
				'values' => array(),
			);
		}

		$optionValue = $attributeModels[$code]->getSource()->getOptionId($variante[$code]);

		/*
		 * Preisunterschiede an dem Attribut color festmachen
		 */
		$priceValue = ('color' === $code && 0 < $priceDelta) ? $priceDelta : '';

		$attributeData[$code]['values'][$variante[$code]] = array(
			'value_index'       => $optionValue,
			'label'             => $variante[$code],
			'is_percent'        => 0,
			'pricing_value'     => $priceValue,
			'use_default_value' => true
		);
	}
}

$product->setConfigurableProductsData($simpleProductIds)
	->setConfigurableAttributesData(array_values($attributeData))
	->setCanSaveConfigurableAttributes(true)
	->setCanSaveCustomOptions(true);

$product->save();



Ein Beitrag von Vinai Kopp
Vinai's avatar

Vinai Kopp arbeitet seit Oktober 2011 als Manager of Developer Education für Magento Inc. Vorher war er als freier Magento Entwickler und Berater tätig, mit dem Schwerpunkt Entwicklerschulung. Desweiteren ist er Co-Autor des Magento Entwicklerhandbuchs, erschienen im O'reilly Verlag.

Alle Beiträge von Vinai

Kommentare
Tobias Vogt am

Hey Chris,

english? what are you talking about? :D

Could you identify in which case error is thrown? May you haven't set up all attribute-data first? (you have to add colors like red,green,eg. manually)

nice greetings from germany

Tobi

Chris Richardson am

I'm hoping that you can read and speak English.

Thanks a lot for posting the above, it has helped me a lot.

For some reason when I run the code, I get the following error: 'Call to a member function getId() on a non-object in'.

Any ideas why?

Dein Kommentar