Zur Agentur-Website
03.10.2011

Magento: Artikelnummern automatisch vergeben

Shopbetreiber die Magento im Einsatz haben, kennen sicherlich das Problem: Magento vergibt standardmäßig keine automatische SKU (Artikelnummer) bzw. lässt sich diese Option auch nicht in der Systemkonfiguration einstellen.

Aus diesem Grund haben wir ein kleines Modul erstellt, das nichts anderes macht, als die saveAction() des ProductControllers im Backend zu überschreiben.

Im folgenden Beispiel verwendet das Modul den Namespace "Keynet" und bekommt den Namen "AutoSku". Wir erstellen also unter /app/code/local/Keynet/ einen Ordner mit diesem Namen. Weiters werden darin die Unterordner /controllers und /etc erzeugt.  Im Ordner /controllers wird weiters der Ordner /Catalog erstellt und darin die Datei ProductController.php gespeichert.

Anschließend erzeugen wir eine Kopie der saveAction-Methode von /app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php und erweitern diese um die Funktionalität der automatischen SKU-Vergabe. Die fertige Controller-Datei sieht wie folgt aus:


<?php
require_once 'Mage/Adminhtml/controllers/Catalog/ProductController.php';
class Keynet_AutoSku_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController
{

	/**
     * Save product action
     */
    public function saveAction()
    {
        $storeId        = $this->getRequest()->getParam('store');
        $redirectBack   = $this->getRequest()->getParam('back', false);
        $productId      = $this->getRequest()->getParam('id');
        $isEdit         = (int)($this->getRequest()->getParam('id') != null);

        $data = $this->getRequest()->getPost();

        if ($data) {
            if (!isset($data['product']['stock_data']['use_config_manage_stock'])) {
                $data['product']['stock_data']['use_config_manage_stock'] = 0;
            }
            $product = $this->_initProductSave();

            if($data['product']['sku']=="") {
				$write = Mage::getSingleton('core/resource')->getConnection('core_write');
				$res = $write->query("SELECT max(sku) AS maxSKU FROM catalog_product_entity");
				$row = $res->fetch();
				$prev_sku = $row['maxSKU'];
				$sku_val = (int)$prev_sku + 1;
				$product->setSku($sku_val);
			}

            try {
                $product->save();
                $productId = $product->getId();

                /**
                 * Do copying data to stores
                 */
                if (isset($data['copy_to_stores'])) {
                    foreach ($data['copy_to_stores'] as $storeTo=>$storeFrom) {
                        $newProduct = Mage::getModel('catalog/product')
                            ->setStoreId($storeFrom)
                            ->load($productId)
                            ->setStoreId($storeTo)
                            ->save();
                    }
                }

                Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId);

                $this->_getSession()->addSuccess($this->__('The product has been saved.'));
            }
            catch (Mage_Core_Exception $e) {
                $this->_getSession()->addError($e->getMessage())
                    ->setProductData($data);
                $redirectBack = true;
            }
            catch (Exception $e) {
                Mage::logException($e);
                $this->_getSession()->addError($e->getMessage());
                $redirectBack = true;
            }
        }

        if ($redirectBack) {
            $this->_redirect('*/*/edit', array(
                'id'    => $productId,
                '_current'=>true
            ));
        }
        else if($this->getRequest()->getParam('popup')) {
            $this->_redirect('*/*/created', array(
                '_current'   => true,
                'id'         => $productId,
                'edit'       => $isEdit
            ));
        }
        else {
            $this->_redirect('*/*/', array('store'=>$storeId));
        }
    }
}
Die erweiterte saveAction für automatische Artikelnummern in Magento

Der interessante Teil ist dabei die If-Anweisung von Zeile 24 bis 31. Hiermit wird geprüft, ob im SKU-Feld ein Wert vergeben wurde. Ist das Feld leer, wird aus der Datenbank die höchste Artikelnummer gesucht und diese um 1 erhöht. Anschließend wird dem zu speichernden Artikel diese neue Artikelnummer zugewiesen.

Wichtig ist zudem, die Verwendung des require_once Statements in Zeile 2. Weiters muss zuvor unter "Attribute verwalten" das SKU-Feld so eingestellt werden, dass es kein Pflichtfeld ist (Option "Werte erforderlich" auf "Nein" setzen).

Jetzt muss Magento noch darüber informiert werden, dass wir ab nun unsere saveAction-Methode  verwenden wollen. Das geschieht mit der Datei config.xml im Ordner /etc.


<?xml version="1.0"?>
<config>
    <modules>
        <Keynet_AutoSku>
            <version>0.1.0</version>
        </Keynet_AutoSku>
	</modules>
    <admin>
		<routers>
			<adminhtml>
				<args>
					<modules>
						<Keynet_AutoSku before="Mage_Adminhtml_Catalog_ProductController"> Keynet_AutoSku</Keynet_AutoSku>
					</modules>
				</args>
			</adminhtml>
		</routers>
	</admin>
</config>
AutoSku Modul in Magento

Hiermit weisen wir Magento an, dass ab nun unsere Action-Methode für die Speicherung von Artikeln im Backend zu verwenden ist. Das war's! Das Modul muss noch mit der Datei "Keynet_AutoSku.xml" in /app/etc/modules/ aktiviert werden. Wie diese Datei aussehen kann, zeigt unter anderem dieser Artikel hier im Blog.


  • 0 Kommentare

Mein Kommentar

Benachrichtige mich, wenn jemand einen Kommentar zu dieser Nachricht schreibt.

Zurück


RSS, Twitter & Facebook