Question

Est-il possible d'énumérer tous les réécritures et peut-être d'autres conflits potentiels en plus de l'examen de tous les fichiers de configuration? Je dois analyser certains projets avec beaucoup d'extensions et des modifications personnalisées et je voudrais automatiser autant que possible de cela.

La chose la plus importante est de détecter les extensions qui réécrivent la même classe, mais je voudrais avoir une liste de tous les réécritures en place aussi, de garder une vue d'ensemble. En ce moment, je maintiens cette liste manuellement dans une feuille de calcul.

J'ai trouvé cette extension ( "Extension Conflict") sur Magento Connect mais à en juger par la critiques et notes de version, il semble être dépassée.

Était-ce utile?

La solution

Jetez un oeil à la N98-magerun utilitaire :

  

Réécrire Liste

     

Liste tous les réécritures de classe enregistrée:

     

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

     

Réécrire conflits

     

Liste toutes les réécritures dupliqués et vous indique à quelle classe est chargée par Magento.   La commande vérifie l'héritage de classe dans l'ordre de vos dépendances de 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   pas de sortie sur la sortie standard.

Vous pouvez également enregistrer les conflits dans un fichier XML JUnit style pour une analyse ultérieure, par exemple sur un serveur d'intégration continue.

Disclaimer: semi-auto-link / Je suis impliqué dans ce projet

Autres conseils

Voici un petit-liner qui vous donne tous les réécritures actifs:

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

Pour limiter par type d'objet, ajouter des modèles, des blocs ou des aides au XPath respectivement.
Par exemple:

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

Voici un petit script que j'utilise pour vérifier si des modèles, des blocs ou des aides sont remplacés. Malheureusement, il ne fonctionne pas pour les contrôleurs et il prend en compte les modules handicapés aussi. Mais de mon point de vue, ce n'est pas grand.

L'idée principale est d'analyser les fichiers de configuration et recherchez le tag <rewrite>. Créez un fichier php sur le même niveau que index.php. L'appel de Let it 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 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 écrasé par Namespace_Module_Model_Core_Layout

Si vous avez 2 ou plusieurs valeurs dans le tableau [ « core / layout »] cela signifie qu'il ya un conflit.

Et vous pouvez facilement identifier le module qui écrasements quelque chose basé sur Namespace et Module

J'ai combiné à la fois la réponse et a obtenu une solution agréable

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

Peut-être que peu frais généraux, mais il est agréable de travailler avec la collecte des données de 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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top