Wie bekomme ich eine Liste aller Klassenumschreibungen?

23

Gibt es eine Möglichkeit, neben dem Überprüfen aller Konfigurationsdateien alle Überschreibungen und möglicherweise andere potenzielle Konflikte aufzulisten? Ich muss einige Projekte mit vielen Erweiterungen und benutzerdefinierten Änderungen analysieren und möchte dies so weit wie möglich automatisieren.

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

Ich habe diese Erweiterung ("Extension Conflict") auf Magento Connect gefunden, aber nach den Bewertungen und Versionshinweisen scheint sie veraltet zu sein.

Fabian Schmengler
quelle
Können Sie nicht einfachgrep
Ben Lessani - Sonassi

Antworten:

28

Schauen Sie sich das Dienstprogramm n98-magerun an :

Liste umschreiben

Listet alle registrierten Klassenänderungen auf:

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

Konflikte umschreiben

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

Wenn ein Dateiname mit der Option --log-junit festgelegt ist, generiert das Tool eine XML-Datei und keine Ausgabe an stdout.

Sie können die Konflikte auch zur weiteren Analyse in einer JUnit Style-XML-Datei protokollieren, z. B. auf einem Continuous Integration-Server.

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

Alex
quelle
27

Hier ein kleiner Einzeiler, mit dem Sie alle aktiven Änderungen vornehmen können:

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

Fügen Sie dem xpath Modelle, Blöcke oder Helfer hinzu, um ihn nach Objekttyp einzuschränken.
Beispielsweise:

Mage::getConfig()->getNode()->xpath('//global/models//rewrite')
Vinai
quelle
Was ist das Problem mit magento.SE? Trotzdem mag ich die Lösung, einfach und unkompliziert. Hätte ich mir überlegen sollen ... Danke, Vinai!
Fabian Schmengler
2
Dies funktioniert mit einem kleinen Problem. Wenn Sie 2 Erweiterungen haben, die dasselbe Modell umschreiben, wird es nicht angezeigt, da Magento die Konfigurationsdateien zusammenführt. Sie sehen nur den "letzten". Aber es ist eine schnelle und einfache Möglichkeit, um festzustellen, ob etwas umgeschrieben wurde
Marius
Ja, es werden nur die aktiven Umschreibungen angezeigt, das ist wahr. Wenn Sie erweiterte Analysen wünschen, müssen Sie jedes aktive Modul etc / config.xml einzeln überprüfen (oder einfach n98-magerun verwenden)
Vinai
Hallo @ Vinai, können wir durch diesen Code alle Konflikte in magento2 bekommen?
Akgola
Nein, Sie können nicht die DI-Konfiguration in Magento 2 ganz anders arbeiten.
Vinai
22

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

Die Hauptidee ist, die Konfigurationsdateien zu analysieren und nach dem <rewrite>Tag zu suchen . Erstellen Sie eine PHP-Datei auf der gleichen Ebene wie index.php. Nennen wir es rewrites.phpmit 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 aufrufen, sollten Sie ungefähr Folgendes 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 von 'core/layout'überschrieben wirdNamespace_Module_Model_Core_Layout

Wenn das Array zwei oder mehr Werte enthält ['core / layout'], liegt ein Konflikt vor.

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

Marius
quelle
1
Hallo, danke für das Drehbuch. Ich habe es in einem meiner Projekte benutzt und festgestellt, dass der Check für Community-Module nicht funktioniert. Damit es funktioniert, haben wir ein "/" am Ende von "app / code / community"
eingefügt
@ceckoslab. Ja. Du hast recht. Ich habe die Antwort bearbeitet. Vielen Dank.
Marius
3

Ich habe beide Antworten kombiniert und eine schöne Lösung gefunden

$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;
sunel
quelle
0

Vielleicht etwas Aufwand, aber es ist schön, mit verschiedenen Datenerfassungscodes von https://github.com/firegento/firegento-debug zu arbeiten

$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());
}
sv3n
quelle