Ein Bestsellermodul fehlt seit Jahr und Tag in Magento, was viele Shopbetreiber ärgert. Wer sich die Beispieldaten von Magento anschaut erblickt auf der Startseite eine kleine Bestsellerliste. Bei näherem Betrachten stellt sich jedoch heraus, dass diese Produkte fest im CMS System hinterlegt sind.
Sofort stellt sich die Frage, warum Magento kein Bestsellermodul von Haus aus anbietet, obwohl ein Bestsellermodul ein paar Vorteile für den Kunden bietet. Überraschenderweise war es sehr einfach dieses Modul in Magento zu realisieren, da alle benötigten Funktionen in Magento integriert sind.

Dieser Arikel umfasst eine Schritt für Schritt-Anleitung zur Erstellung eines einfachen Bestsellermodul unter “http://www.example.com/bestsellers”.
Wer bis jetzt noch kein Modul erstellt hat, sollte vorher unbedingt Extensions Tutorial: Teil 1 – “Hallo Magento” lesen.

1. Aufbau der Dateistruktur

app
   etc/
      modules/
         - Mxperts_Bestsellers.xml
   code/
      local/
         Mxperts/ (Oder Ihre Firmenname IhreFirme_All.xml)
            Bestsellers/ (Bezeichnung Ihrer Erweiterung)
               Block/
                  Product/
                     - List.php
               Model/
                  - Bestsellers.php
               controllers/
                  - IndexController.php
               etc/
                  - config.xml
   design/
      frontend/
         default/
            default/
               layout/
                  bestsellers.xml

2. Quellcode

Die “List.php” stellt alle Funktionen für das Template (list.phtml) zur Verfügung. Ein eigenes Templatefile wird nicht benötigt, wir nutzen das normale Produktlisting von Magento um die Bestseller anzuzeigen.

<?php
class Mxperts_Bestsellers_Block_Product_List extends Mage_Catalog_Block_Product_List {

    /**
     * Retrieve loaded category collection
     *
     * @return Mage_ProductCollection
     **/
    protected function _getProductCollection() {

        if (is_null($this->_productCollection)) {
            $this->_productCollection = Mage::getModel('bestsellers/bestsellers')->getBestsellers();
        }

        return $this->_productCollection;
    }
}

In der “Bestseller.php” befinden sich die Funktion zur Ermittlung der Bestsellers. Mittels “Mage::getResourceModel(‘reports/product_collection’)” erhalten wir eine Übersicht über alle bestellten Produkte, welche wir entsprechend sortieren und filtern.

class Mxperts_Bestsellers_Model_Bestsellers {

    /**
     * returns all bestsellers
     * @return <Mage_Reports_Model_Mysql4_Product_Collection> Collections of Bestsellers
     */
    function getBestsellers($showAllBestsellerProducts = false) {

        //get all bestsellers
        $result = Mage::getResourceModel('reports/product_collection')
                        ->addAttributeToSelect('*')
                        ->addOrderedQty()
                        ->setStoreId(Mage::app()->getStore()->getId())
                        ->addStoreFilter(Mage::app()->getStore()->getId())
                        ->setOrder('ordered_qty', 'desc');

        Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($result);
        Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($result);

        //return result
        return $result;
    }

}

Damit unser Modul von außen angesprochen werden kann, benötigen wir einen Controller, welcher das Layout lädt.

class Mxperts_Bestsellers_IndexController extends Mage_Core_Controller_Front_Action{

    public function indexAction(){
        $this->loadLayout();
        $this->_initLayoutMessages('catalog/session');
        $this->renderLayout();
    }
}

Wir definieren unsere “config.xml” und legen auf diese Weise die Konfiguration für unser Modul fest.

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Mxperts_Bestsellers>
            <version>1.0.2</version>
        </Mxperts_Bestsellers>
    </modules>
     <global>
        <blocks>
            <bestsellers>
                <class>Mxperts_Bestsellers_Block</class>
            </bestsellers>
        </blocks>
        <models>
            <bestsellers>
                <class>Mxperts_Bestsellers_Model</class>
            </bestsellers>
        </models>
    </global>
    <frontend>
        <routers>
            <bestsellers>
                <use>standard</use>
                <args>
                    <module>Mxperts_Bestsellers</module>
                    <frontName>bestsellers</frontName>
                </args>
            </bestsellers>
        </routers>
        <layout>
            <updates>
                <Mxperts_Bestsellers>
                    <file>bestsellers.xml</file>
                </Mxperts_Bestsellers>
            </updates>
        </layout>
    </frontend>
</config>

Mit Hilfe der “bestsellers.xml”-Datei benötigen wir keine Änderungen in der “local.xml” oder in den Core-Layout-Dateien.
bestseller.xml

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
    <bestsellers_index_index>
        <reference name="content">
            <block type="bestsellers/product_list" name="product_list" template="catalog/product/list.phtml">
                <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
                    <block type="page/html_pager" name="product_list_toolbar_pager"  template="page/html/pager.phtml" />
                </block>
                <action method="setToolbarBlockName">
                    <name>product_list_toolbar</name>
                </action>
            </block>
        </reference>
    </bestsellers_index_index>
</layout>

Dies wären alle Punkte des Bestseller Modul in Magento.