2 Stimmen

Die gleiche Klasse mit 2 Modulen erweitern? Magento Modul Konflikt?

Ich versuche ein Modul zu erstellen, das den Titel einer Seite ändert. Mein Modul funktioniert einwandfrei, bis ich ein weiteres Modul namens

Yoast_CanonicalUrl.

aktiviere. Das Yoast-Modul berührt keine der Titelmethoden, erweitert jedoch dieselbe Klasse wie mein Modul: Mage_Page_Block_Html_Head{}

Ich habe versucht, die Yoast-Klasse zu erweitern, wenn sie vorhanden ist, aber mein Modul funktioniert nicht mehr, sobald das Yoast-Modul aktiviert ist.

Ich habe den Code von Yoast durchgesehen, um zu sehen, ob seine Methoden mit meinen kollidieren, und das tun sie nicht.

Sobald Yoast geladen wird, scheint es, als ob mein Code einfach nicht mehr geladen wird :(

Hier ist meine Head.php:

getModuleConfig('Yoast_CanonicalUrl')->active == 'true')
{
  class Yoast_CanonicalUrl_Block_Head extends Mage_Page_Block_Html_Head{}
}
class Company_MetaKeyManager_Block_Head extends Yoast_CanonicalUrl_Block_Head
{
    public function setTitle($title)
    {
        $this->_data['title'] = Mage::getStoreConfig('design/head/title_prefix') . ' ' . $title
            . ' ' . Mage::getStoreConfig('design/head/title_suffix');
        return $this;
    }
    public function getTitle()
    {
        if (empty($this->_data['title'])) {
            $this->_data['title'] = $this->getDefaultTitle();
        }
        return htmlspecialchars(html_entity_decode(trim($this->_data['title']), ENT_QUOTES, 'UTF-8'));
    }
    public function getDefaultTitle()
    {
        return 'Hallo Welt';
    }
} 

Hier ist meine Config.xml:

            0.1.0

                Company_MetaKeyManager_Block

                    Company_MetaKeyManager_Block_Head

                Company_MetaKeyManager_Helper

Hat jemand Vorschläge, warum dies passiert?

2voto

Ben Lessani Punkte 2131

Eeek - versuchen Sie nicht, einen Klassennamen / eine Erweiterung bedingt zu deklarieren.

Wenn Sie mit potenziellen Klassenladungs- und Prioritätskonflikten arbeiten, denken Sie zuerst an die PHP-Autoloader-Priorität (include_path)

Es versucht in dieser Reihenfolge:

./app/code/local
./app/code/community
./app/code/core

Also wird alles, was in local definiert ist, community überschreiben, unabhängig von etwaigen internen Magento-Umschreibungen.

Mit Ihrer Erweiterung ändern Sie entweder die Yoast-Erweiterung, um Ihre zu erweitern. Oder entfernen Sie die Umschreibung aus der Yoast-Erweiterung config.xml und lassen Sie Ihre Erweiterung die Yoast-Erweiterung erweitern.

Und wenn Sie zufällig dieselbe Funktion überschreiben wollen, stellen Sie sicher, dass Sie einfach

return parent::myfunction()

Am Ende Ihrer Funktion einfügen und dann wird sie die Funktion der erweiterten Klasse ausführen.

Einfach.

1voto

Anton S Punkte 12810

Dies ist eine Wettlaufsituation, wer zuerst die Klasse erweitert. Es scheint also, dass Yoast zuerst ist, also lassen Sie Yoast Ihre Klasse erweitern, die dieselbe Klasse erweitert, um dies zu lösen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X