Frage

Gibt es eine Möglichkeit, alle Umschreiben und möglicherweise andere potenzielle Konflikte aufzulisten, neben der Überprüfung aller Konfigurationsdateien? Ich muss einige Projekte mit vielen Erweiterungen und benutzerdefinierten Modifikationen analysieren und möchte so viel wie möglich davon automatisieren.

Das Wichtigste ist, Erweiterungen zu erkennen, die dieselbe Klasse neu schreiben, aber ich möchte auch eine Liste aller Umschreibungen haben, um einen Überblick zu behalten. Im Moment verwahre ich diese Liste manuell in einer Tabelle.

ich fand Diese Erweiterung ("Erweiterungskonflikt") Auf Magento Connect, aber nach den Bewertungen und Freigabefunktionen scheint es veraltet zu sein.

War es hilfreich?

Lösung

Schauen Sie sich das an die N98-Magerun-Dienstprogramm:

Liste neu schreiben

Listet alle registrierten Klassenumschreiber auf:

$ n98-magerun.phar dev:module:rewrite:list

Schreiben Sie Konflikte neu

Listet alle doppelten Umschreibungen auf und teilt Ihnen mit, welche Klasse von Magento geladen wird. Der Befehl überprüft die Erbschaft der Klasse in der Reihenfolge Ihrer Modulabhängigkeiten. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Wenn ein Dateiname mit der Option-Log-Junit-Option festgelegt ist, generiert das Tool eine XML-Datei und keine Ausgabe für STDOut.

Sie können die Konflikte auch für weitere Analysen an einer Jungit -Style -XML -Datei protokollieren, z. B. auf einem fortlaufenden Integrationsserver.

Haftungsausschluss: Semi-Self-Link / Ich bin an diesem Projekt beteiligt

Andere Tipps

Hier ein kleiner Einzeiler, der Ihnen alle aktiven Umschreibungen gibt:

print_r(Mage::getConfig()->getNode()->xpath('//global//rewrite'));

Um es nach Objekttyp zu begrenzen, fügen Sie dem XPath Modelle, Blöcke oder Helfer hinzu.
Zum Beispiel:

Mage::getConfig()->getNode()->xpath('//global/models//rewrite')

Hier ist ein kleines Skript, mit dem ich prüfe, ob Modelle, Blöcke oder Helfer überschrieben werden. Leider funktioniert es nicht für Controller und berücksichtigt auch die deaktivierten Module. Aber aus meiner Sicht ist dies keine große Sache.

Die Hauptidee besteht darin, die Konfigurationsdateien zu analysieren und nach dem zu suchen <rewrite> Schild. Erstellen Sie eine PHP -Datei auf der gleichen Ebene wie index.php. Nennen wir es rewrites.php, mit diesem Inhalt:

<?php 
$folders = array('app/code/local/', 'app/code/community/');//folders to parse
$configFiles = array();
foreach ($folders as $folder){
    $files = glob($folder.'*/*/etc/config.xml');//get all config.xml files in the specified folder
    $configFiles = array_merge($configFiles, $files);//merge with the rest of the config files
}
$rewrites = array();//list of all rewrites

foreach ($configFiles as $file){
    $dom = new DOMDocument;
    $dom->loadXML(file_get_contents($file));
    $xpath = new DOMXPath($dom);
        $path = '//rewrite/*';//search for tags named 'rewrite'
        $text = $xpath->query($path);
        foreach ($text as $rewriteElement){
            $type = $rewriteElement->parentNode->parentNode->parentNode->tagName;//what is overwritten (model, block, helper)
            $parent = $rewriteElement->parentNode->parentNode->tagName;//module identifier that is being rewritten (core, catalog, sales, ...)
            $name = $rewriteElement->tagName;//element that is rewritten (layout, product, category, order)
            foreach ($rewriteElement->childNodes as $element){
                $rewrites[$type][$parent.'/'.$name][] = $element->textContent;//class that rewrites it
            }
        }
}
echo "<pre>";print_r($rewrites);

Wenn Sie es in einem Browser anrufen, sollten Sie so etwas sehen:

Array
(
    [models] => Array
        (
            [core/layout] => Array
                (
                    [0] => Namespace_Module_Model_Core_Layout
                    [1] => Namespace1_Module1_Model_Core_Layout //if the second element is present it means there is a possible conflict
                )
            [...] => ....

        )
    [blocks] => ...
    [helpers] => ...

)

Dies bedeutet, dass das Modell 'core/layout' wird überschrieben von Namespace_Module_Model_Core_Layout

Wenn Sie 2 oder mehr Werte im Array ['Core/Layout'] haben, bedeutet dies, dass es einen Konflikt gibt.

Und Sie können das Modul, das etwas basierend auf etwas überschreibt, leicht identifizieren Namespace und Module

Ich habe sowohl die Antwort kombiniert als auch eine schöne Lösung bekommen

$text = Mage::getConfig()->getNode()->xpath('//global//rewrite');
foreach ($text as $rewriteElement) {
    if ($rewriteElement->getParent()->getParent()) {
        # what is overwritten (model, block, helper)
        $type = $rewriteElement->getParent()->getParent()->getName();
        # module identifier that is being rewritten (core, catalog, sales, ...)
        $parent = $rewriteElement->getParent()->getName();
        # element that is rewritten (layout, product, category, order)
        $name = $rewriteElement->getName();
        foreach ($rewriteElement->children() as $element) {
            # class that rewrites it
            $rewrites[$type][$parent.'/'.$name][] = $element;
        }
    }
}
print_r($rewrites);
die;

Vielleicht überdurchschnittlich, aber es ist schön, mit Variien -Datenerfassung zu arbeiten ... Code von https://github.com/firegento/firegento-debug

$collection = new Varien_Data_Collection();

$fileName = 'config.xml';
$modules = Mage::getConfig()->getNode('modules')->children();

$rewrites = array();
foreach ($modules as $modName => $module) {
    if ($module->is('active')) {
        $configFile = Mage::getConfig()->getModuleDir('etc', $modName) . DS . $fileName;
        if (file_exists($configFile)) {
            $xml = file_get_contents($configFile);
            $xml = simplexml_load_string($xml);

            if ($xml instanceof SimpleXMLElement) {
                $rewrites[$modName] = $xml->xpath('//rewrite');
            }
        }
    }
}

foreach ($rewrites as $rewriteNodes) {
    foreach ($rewriteNodes as $n) {
        $nParent = $n->xpath('..');
        $module = (string)$nParent[0]->getName();
        $nSubParent = $nParent[0]->xpath('..');
        $component = (string)$nSubParent[0]->getName();

        if (!in_array($component, array('blocks', 'helpers', 'models'))) {
            continue;
        }

        $pathNodes = $n->children();
        foreach ($pathNodes as $pathNode) {
            $path = (string)$pathNode->getName();
            $completePath = $module . '/' . $path;

            $rewriteClassName = (string)$pathNode;

            $instance = Mage::getConfig()->getGroupedClassName(
                substr($component, 0, -1),
                $completePath
            );

            $collection->addItem(
                new Varien_Object(
                    array(
                        'path'          => $completePath,
                        'rewrite_class' => $rewriteClassName,
                        'active_class'  => $instance,
                        'status'        => ($instance == $rewriteClassName)
                    )
                )
            );
        }
    }
}

Für die Ausgabe können Sie ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top