Modulerstellung: Wie erstelle ich ein Modul (Funktion überschreiben)?

      Modulerstellung: Wie erstelle ich ein Modul (Funktion überschreiben)?

      Oft reichen für die normalen Magento-Funktionen zur Erstellung eines wirklich individuellen Onlineshops nicht aus. Dieses Tutorial zeigt, wie Magento "core-Klassen" richtig überschrieben und verändert werden.

      Die hier gezeigte Lösung funktioniert für Block- und Model-Klassen, Controller werden etwas anders behandelt und bekommen daher ein eigenes Tutorial.

      Ziel dieses Tutorials ist es, die Funktion der Datei "app/code/core/Mage/Catalog/Block/Breadcrumbs.php" zu überschreiben. Dazu haben wir zwei Möglichkeiten:

      1. Die schnelle Lösung

      Um schnell und unkompliziert eine Funktion zu verändern genügt es die Datei Breadcrumbs.php inkl. Verzeichnisbaum nach "app/code/local" zu kopieren.

      Der vollständige Pfad sollte am Ende so aussehen: "app/code/local/Mage/Catalog/Block/Breadcrumbs.php". - Jede Veränderung des Quellcodes wirkt sich, sofern der Cache deaktiviert wurde, sofort auf den Shop aus.

      2. Die saubere Lösung

      Da die 1. Lösung einige Nachteile mit sich bringt und nur schwer weiterzugeben ist, wollen wir nun ein Modul für die Änderungen erstellen. Dieses Modul kann später auch exportiert und über MagentoConnect der ganzen Comunity zugänglich gemacht werden.

      Als erstes erstellen wir unterhalb von "app/code/local" einen Arbeitsordner. Diesen Ordner nennen wir "Rackspeed", damit wir später wissen wo wir unsere Änderungen bzw. Module wiederfinden. - Wichtig hierbei ist die Schreibweise: 1. Buchstabe groß, der Rest klein.

      In diesem Ordner erstellen wir einen weiteren Order mit dem Namen unseres Moduls, z.B. "BreadStop". Als nächstes werden zwei weitere Ordner in dem soeben erstellten Ordner erstellt: "etc" und "Catalog".

      "etc" nimmt die Konfigurationsdatei "config.xml" unseres Moduls auf, "Catalog" leiten wir vom originalen Pfad der zu überschreibenden Funktion ab. Im "Catalog"-Ordner erstellen wir wiederum einen Ordner mit dem Namen "Blocks" welcher ebenfalls vom originalen Pfad abgeleitet wird. Abschließend kopieren wir die Datei "Breadcrumbs.php" in diesen Ordner.

      Das Ganze sollte nun wie folgt aussehen:

      Quellcode

      1. app/code/local/Rackspeed/BreadStop/Catalog/Block/Breadcrumbs.php
      2. app/code/local/Rackspeed/BreadStop/etc/config.xml
      Nun füllen wir die soeben erstellte leere Konfigurationsdatei wie folgt. - Sollte Ihr Modul einen anderen Namen haben, ist dieser entsprechend zu ersetzen:

      XML-Quellcode

      1. <?xml version="1.0"?>
      2. <config>
      3. <modules>
      4. <Rackspeed_BreadStop>
      5. <version>0.1.0</version>
      6. </Rackspeed_BreadStop>
      7. </modules>
      8. <global>
      9. <blocks>
      10. <catalog>
      11. <rewrite>
      12. <breadcrumbs>Rackspeed_BreadStop_Catalog_Block_Breadcrumbs</breadcrumbs>
      13. </rewrite>
      14. </catalog>
      15. </blocks>
      16. </global>
      17. </config>
      Als nächstes bearbeiten wir die "Breadcrumbs.php" Datei, dabei entfernen wir zunächst sämtlichen Quellcode den wir nicht benötigen und ändern den Namen der Klasse von:

      Quellcode

      1. class Mage_Catalog_Block_Breadcrumbs extends Mage_Core_Block_Template
      zu

      Quellcode

      1. class Rackspeed_Breadstop_Catalog_Block_Breadcrumbs extends Mage_Core_Block_Template
      Jetzt können wir die eigentliche Funktion anpassen und verändern. In diesem Beispiel werden wir den "Home"-Link ausblenden. Die veränderte Datei sieht nach der Bearbeitung (entsprechende Zeilen wurden auskommentiert) so aus:

      PHP-Quellcode

      1. <?php
      2. class Rackspeed_Breadstop_Catalog_Block_Breadcrumbs extends Mage_Core_Block_Template
      3. {
      4. protected function _prepareLayout()
      5. {
      6. if ($breadcrumbsBlock = $this->getLayout()->getBlock('breadcrumbs')) {
      7. /*$breadcrumbsBlock->addCrumb('home',
      8. array('label'=>Mage::helper('catalog')->__('Home'), 'title'=>Mage::helper('catalog')->__('Go to Home Page'), 'link'=>Mage::getBaseUrl())
      9. );*/
      10. $title = (string)Mage::getStoreConfig('system/store/name');
      11. $path = Mage::helper('catalog')->getBreadcrumbPath($this->getCategory());
      12. foreach ($path as $name=>$breadcrumb) {
      13. $breadcrumbsBlock->addCrumb($name, $breadcrumb);
      14. $title = $breadcrumb['label'].' '.Mage::getStoreConfig('catalog/seo/title_separator').' '.$title;
      15. }
      16. if ($headBlock = $this->getLayout()->getBlock('head')) {
      17. $headBlock->setTitle($title);
      18. }
      19. }
      20. return parent::_prepareLayout();
      21. }
      22. }
      23. ?>
      Bevor wir unsere Arbeit begutachten können müssen wir Magento noch mitteilen, dass ein neues Modul vorhanden ist und aktiviert werden soll. Dazu erstellen wir unter: "app/etc/modules/" eine neue Datei mit dem Namen "Rackspeed_BreadStop.xml". In diese Datei fügen wir nun folgenden Inhalt ein:

      XML-Quellcode

      1. <?xml version="1.0"?>
      2. <config>
      3. <modules>
      4. <Rackspeed_BreadStop>
      5. <active>true</active>
      6. <codePool>local</codePool>
      7. </Rackspeed_BreadStop>
      8. </modules>
      9. </config>
      Jetzt können wir das Frontend aufrufen und das Modul testen. Wenn alles geklappt hat sollte der Home-Link nicht mehr in der Breadcrumb-Navi angezeigt werden. - Zur Kontrolle kann in der Datei "app/etc/modules/Rackspeed_BreadStop.xml" der Schalter von "true" auf "false" geändert werden um das Modul zu deaktivieren.

      Das komplette Modul wurde als ZIP-Datei angehängt, und kann als Grundlage für neue Module genutzt werden, oder um die eigene Arbeit zu kontrollieren.

      Da dies mein erstes Tutorial ist freue ich mich über jede Art von Feedback.
      Dateien
      Magento Hosting | Cloud Server | Shopware Hosting | Elasticsearch Hosting
      Unsere Hosting-Lösungen nutzen ultraschnelle SSDs und sind jederzeit skalierbar.
      Einen kleinen Fehler hat das Tutorial:

      In dem Code-Abschnitt unter Punkt 2 muss es nicht

      Quellcode

      1. app/code/local/Rackspeed/BreadStop/catalog/etc/config.xml


      heißen, sondern

      Quellcode

      1. app/code/local/Rackspeed/BreadStop/etc/config.xml


      Ich habe zwar den Anhang heruntergeladen, aber wollte das Tut erstmal "zu Fuß" bearbeiten, da bin ich auf diesen Mini-Fehler gestoßen.

      Ansonsten ein hervorragendes Beispiel. Bin der Magento-Logik so einen großen Schritt näher gekommen.
      Gibt es eigentlich auch noch weiterführende Tutorials?

      Ich versuche z.B. gerade ein Modul zu erstellen, mit dem man per Eingabe der Bestellnummer und Angabe der Menge eine Schnellbestellung durchführen kann. Ich "frickel" mich hier gerade durch die Funktion Catalog_Search von Magento.

      Wenn jemand da Tipps hat, wäre ich sehr sehr dankbar!!!
      Ich habe ein Modul gefunden, welches genau dieses macht:

      Es nennt sich Karma Quickaddtocart. Ich bekomme folgende Fehlermeldung, wenn ich dieses Modul installieren möchte:

      Quellcode

      1. Failed to download magento-community/Karma_quickaddtocart within preferred state "beta", latest release is version 1.0, stability "alpha", use "channel://connect.magentocommerce.com/community/Karma_quickaddtocart-1.0" to install
      2. Cannot initialize 'channel://connect.magentocommerce.com/community/Karma_quickaddtocart', invalid or missing package file
      3. Install Errors
      4. Package "channel://connect.magentocommerce.com/community/Karma_quickaddtocart" is not valid
      5. PEAR ERROR: install failed


      Ich wäre für Hilfe sehr verbunden.
      hallo also ich versuche gerade einen eigenen Menü Punkt zu erstellen und in "Manage Products" ein neues Feld einzufügen in der Edit/Add Funktion und sie soll natürlich auch in der Übersicht angezeigt werden.

      Das Tutorial hilft mir fast ;)

      Und zwar in der etc/config.xml schreibst du folgendes:

      Quellcode

      1. <global>
      2. <blocks>
      3. <catalog>
      4. <rewrite>
      Wie kommst du den genau auf den Pfad?
      Das kann ich nocht nicht ganz nachvollziehen.

      Kann mir da jemand helfen?