Bestseller für Magento

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.
Hallo!
wie kann man mit deinem Tutorial eben nicht das vorhandene Template nutzen sondern ein eigenes includen und wie kann man das dann per Inhalt einer Seite in dieser Form darstellen?
-{{block type=”mxperts/tutorial” name=”tutorial”}}-
MfG Chris
War diese Antwort hilfreich?
LikeDislikeHallo Chris,
ändere hier in Zeile 5 der Datei “bestseller.xml” den Templateeintrag ‘template=”catalog/product/list.phtml”‘ in deine gewünschte Templatedatei.
Auf einer Contentseite müsstest du die Bestseller wie folgt anzeigen können:
{{block type=”bestsellers/product_list” name=”bestsellers” as=”bestsellers” template=”catalog/product/list.phtml”}}
(Wichtig: Hier muss noch einmal explizit das Template angegeben werden, da dieses nicht aus der XML Datei gelesen wird.)
Gruß
War diese Antwort hilfreich?
LikeDislikeHi,
funktioniert das auch mit Magento 1.5.1.0? Ich bekomm das dort nicht zum laufen.
bei http://www.meinshop.de/bestsellers kommt nur Seite nicht gefunden und bei
{{block type=”mxperts/bestsellers” name=”bestsellers” as=”bestsellers”}} passiert auch nichts.
Wo wird denn eigentlich der block type definiert?
Vielen Dank.
War diese Antwort hilfreich?
LikeDislikeHallo Simon,
eigentlich sollte es auch mit 1.5.1.0 laufen, getestet habe ich es mit dieser Version noch nicht. Ich schaue es mir einmal an und melde mich dann wieder.
Gruß
War diese Antwort hilfreich?
LikeDislikeHallo Simon,
ich habe meinen vorherigen Beitrag korrigiert, bitte versuche es erneut.
Gruß
War diese Antwort hilfreich?
LikeDislikeHI,
tolles tutorial aber es funktioniert unter 1.5.1 Stable leider nicht:(
War diese Antwort hilfreich?
LikeDislikeHallo,
ich habe bei mir die Version 1.5.0.1 auf die Versin 1.5.1.0 aktualisiert. Anschließend funktionierte das Bestsellermodul noch ohne Probleme.
Kann mir jemand eventuell den Fehler von Magento schicken?
Gruß
War diese Antwort hilfreich?
LikeDislikeGreat tutorial, readable & easy to understand code regardless of German.
How do you develop your extensions? I mean in Magento all files of the extension is scattered around the directory tree, and one needs to constantly gather them to one exchangeable zip/folder.
I’m just learning Magento and I came up with following idea (not tested yet):
1. Create own directory “Bestsellers” and put all the files you mentioned there with the actual directory structure.
2. Now symlink all your files to Magento testing/production environment.
Any better ways?
War diese Antwort hilfreich?
LikeDislikeHello Ciantic,
Magento/Zend tells you where to put your files. If you like to link your files (will not work for template files) you have to put the links in the directories I worte above, or it will not work.
Best Regards
War diese Antwort hilfreich?
LikeDislikeHi,
leider zeigt das Modul unter 1.5.1 nichts an:(.
Daher kann ich leider kein fehlercode schicken….
Eine andere Frage wäre ob es möglich ist die Bestseller angenommen die besten 5 auch auf der Produktseite anzuzeigen?
War diese Antwort hilfreich?
LikeDislikeHi!
Bei mir läuft das Modul leider auch nicht unter 1.5.1.
Wäre echt cool, wenn das noch nachgebessert werden könnte.
Ansonsten, wiedereinmal sehr guter Artikel!
Gruß Timo
War diese Antwort hilfreich?
LikeDislikeHi,
funktioniert das Bestseller Modul auch unter 1.6.1?
Kannst du mir ne mail mit irgend einem nützlichen Link oder ähnlichem schreiben?
Danke
War diese Antwort hilfreich?
LikeDislike