Einzelnen Beitrag anzeigen
Alt 26.10.2008   #1 (permalink)
rack::SPEED
rack::SPEED Support
 
Benutzerbild von rack::SPEED
 
Registriert seit: 19.10.2008
Ort: Meerbusch
Beiträge: 920
Renommee-Modifikator: 10
rack::SPEED hat die Renommee-Anzeige deaktiviert
Standard 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:

Code:
app/code/local/Rackspeed/BreadStop/Catalog/Block/Breadcrumbs.php
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:

Code:
<?xml version="1.0"?>
<config>
    <modules>
        <Rackspeed_BreadStop>
            <version>0.1.0</version>
        </Rackspeed_BreadStop>
    </modules>
    <global>
        <blocks>
            <catalog>
                <rewrite>
                        <breadcrumbs>Rackspeed_BreadStop_Catalog_Block_Breadcrumbs</breadcrumbs>
                </rewrite>
            </catalog>
        </blocks>
    </global>
</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:

Code:
class Mage_Catalog_Block_Breadcrumbs extends Mage_Core_Block_Template
zu

Code:
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-Code:
<?php
    
class Rackspeed_Breadstop_Catalog_Block_Breadcrumbs extends Mage_Core_Block_Template 
    
{
        protected function 
_prepareLayout()
        {
            if (
$breadcrumbsBlock $this->getLayout()->getBlock('breadcrumbs')) {
                
/*$breadcrumbsBlock->addCrumb('home',
                    array('label'=>Mage::helper('catalog')->__('Home'), 'title'=>Mage::helper('catalog')->__('Go to Home Page'), 'link'=>Mage::getBaseUrl())
                );*/
    
                
$title = (string)Mage::getStoreConfig('system/store/name');
                
$path Mage::helper('catalog')->getBreadcrumbPath($this->getCategory());
                foreach (
$path as $name=>$breadcrumb) {
                    
$breadcrumbsBlock->addCrumb($name$breadcrumb);
                    
$title $breadcrumb['label'].' '.Mage::getStoreConfig('catalog/seo/title_separator').' '.$title;
                }
    
                if (
$headBlock $this->getLayout()->getBlock('head')) {
                    
$headBlock->setTitle($title);
                }
            }
            return 
parent::_prepareLayout();
        }
    }
?>
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:

Code:
<?xml version="1.0"?>
<config>
    <modules>
        <Rackspeed_BreadStop>
            <active>true</active>
            <codePool>local</codePool>
        </Rackspeed_BreadStop>
    </modules>
</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.
Angehängte Dateien
Dateityp: zip Rackspeed_BreadStop.zip (2,9 KB, 22x aufgerufen)
rack::SPEED ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17