Comment obtenir une liste de toutes les réécritures de classe?


23

Existe-t-il un moyen de répertorier toutes les réécritures et peut-être d'autres conflits potentiels en plus d'examiner tous les fichiers de configuration? Je dois analyser certains projets avec beaucoup d'extensions et de modifications personnalisées et j'aimerais automatiser autant que possible cela.

La chose la plus importante est de détecter les extensions qui réécrivent la même classe, mais j'aimerais aussi avoir une liste de toutes les réécritures pour garder une vue d'ensemble. Pour le moment, je gère cette liste manuellement dans une feuille de calcul.

J'ai trouvé cette extension ("Extension Conflict") sur Magento Connect mais à en juger par les critiques et les notes de version, elle semble obsolète.


Ne pouvez-vous pas simplement utilisergrep
Ben Lessani - Sonassi

Réponses:


28

Jetez un œil à l' utilitaire n98-magerun :

Réécrire la liste

Répertorie toutes les réécritures de classe enregistrées:

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

Réécrire les conflits

Répertorie toutes les réécritures dupliquées et vous indique quelle classe est chargée par Magento. La commande vérifie l'héritage de classe dans l'ordre des dépendances de votre module. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Si un nom de fichier avec l'option --log-junit est défini, l'outil génère un fichier XML et aucune sortie vers stdout.

Vous pouvez également consigner les conflits dans un fichier XML de style JUnit pour une analyse plus approfondie, par exemple sur un serveur d'intégration continue.

Avertissement: semi-auto-lien / Je suis impliqué dans ce projet


27

Voici un petit one-liner qui vous donne toutes les réécritures actives:

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

Pour le limiter par type d'objet, ajoutez des modèles, des blocs ou des assistants au xpath respectivement.
Par exemple:

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

Quel est le problème avec magento.SE? Quoi qu'il en soit, j'aime la solution, simple et directe. J'aurais dû y penser moi-même ... Danke, Vinai!
Fabian Schmengler

2
Cela fonctionne avec un petit problème. Si vous avez 2 extensions réécrivant le même modèle, vous ne le verrez pas, car Magento fusionne les fichiers de configuration. Vous ne verrez que le "dernier". Mais c'est un moyen rapide et simple de voir si quelque chose est réécrit
Marius

Oui, cela ne montre que les réécritures actives, c'est vrai. Si vous voulez des analyses plus avancées, vous devez vérifier chaque module actif etc / config.xml individuellement, (ou simplement utiliser n98-magerun)
Vinai

Bonjour @ Vinai, Pouvons-nous obtenir tous les conflits dans magento2 par ce code?
akgola

Non, vous ne pouvez pas que la configuration DI fonctionne tout à fait différemment dans Magento 2.
Vinai

22

voici un petit script que j'utilise pour vérifier si des modèles, des blocs ou des aides sont écrasés. Malheureusement, cela ne fonctionne pas pour les contrôleurs et il prend également en compte les modules désactivés. Mais de mon point de vue, ce n'est pas grave.

L'idée principale est d'analyser les fichiers de configuration et de rechercher la <rewrite>balise. Créez un fichier php au même niveau que index.php. Appelons-le rewrites.php, avec ce contenu:

<?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);

lorsque vous l'appelez dans un navigateur, vous devriez voir quelque chose comme ceci:

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] => ...

)

cela signifie que le modèle 'core/layout'est remplacé parNamespace_Module_Model_Core_Layout

Si vous avez 2 ou plusieurs valeurs dans le tableau ['core / layout'], cela signifie qu'il y a un conflit.

Et vous pouvez facilement identifier le module qui écrase quelque chose en fonction NamespaceetModule


1
Salut, merci pour le script. Je l'ai utilisé dans l'un de mes projets et j'ai constaté que la vérification des modules communautaires ne fonctionne pas. Pour que cela fonctionne, nous avons ajouté un «/» à la fin de «app / code / community», il deviendra donc «app / code / community /»
ceckoslab

@ceckoslab. Oui. Vous avez raison. J'ai édité la réponse. Merci.
Marius

3

j'ai combiné la réponse et obtenu une bonne solution

$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;

0

Peut-être un peu de surcharge mais c'est agréable de travailler avec la collecte de données varien ... code de 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)
                    )
                )
            );
        }
    }
}

Pour la sortie, vous pouvez utiliser ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.