Come posso ottenere un elenco di tutte le riscritture di classe?


23

C'è un modo per elencare tutte le riscritture e forse altri potenziali conflitti oltre a rivedere tutti i file di configurazione? Devo analizzare alcuni progetti con molte estensioni e modifiche personalizzate e vorrei automatizzare il più possibile questo.

La cosa più importante è rilevare estensioni che riscrivono la stessa classe, ma mi piacerebbe avere anche un elenco di tutte le riscritture, per avere una visione d'insieme. Al momento mantengo questo elenco manualmente in un foglio di calcolo.

Ho trovato questa estensione ("Conflitto di estensione") su Magento Connect ma a giudicare dalle recensioni e dalle note di rilascio sembra essere obsoleta.


Non puoi semplicemente usaregrep
Ben Lessani - Sonassi il

Risposte:


28

Date un'occhiata al programma di utilità N98-magerun :

Riscrivi elenco

Elenca tutte le riscritture di classe registrate:

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

Riscrivi conflitti

Elenca tutte le riscritture duplicate e ti dice quale classe è caricata da Magento. Il comando controlla l'ereditarietà delle classi in base alle dipendenze del modulo. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Se viene impostato un nome file con l'opzione --log-junit, lo strumento genera un file XML e nessun output su stdout.

È inoltre possibile registrare i conflitti in un file XML JUnit Style per ulteriori analisi, ad esempio su un server di integrazione continua.

Disclaimer: semi-self-link / Sono coinvolto in quel progetto


27

Ecco un piccolo one-liner che ti dà tutte le riscritture attive:

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

Per limitarlo per tipo di oggetto, aggiungere rispettivamente modelli, blocchi o helper allo xpath.
Per esempio:

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

Qual è il problema con magento.SE? Comunque mi piace la soluzione, semplice e diretta. Avrei dovuto pensarci da solo ... Danke, Vinai!
Fabian Schmengler,

2
Questo funziona con un piccolo problema. Se hai 2 estensioni che riscrivono lo stesso modello non lo vedrai, perché Magento unisce i file di configurazione. Vedrai solo l '"ultimo". Ma è un modo semplice e veloce per vedere se qualcosa viene riscritto
Marius

Sì, mostra solo le riscritture attive, è vero. Se vuoi analisi più avanzate devi controllare ogni modulo attivo etc / config.xml singolarmente, (o semplicemente usare n98-magerun)
Vinai

Ciao @Vinai, possiamo ottenere tutti i conflitti in magento2 con questo codice?
akgola,

No, non è possibile che la configurazione DI funzioni in modo diverso in Magento 2.
Vinai

22

ecco un piccolo script che uso per verificare se alcuni modelli, blocchi o helper vengono sovrascritti. Sfortunatamente non funziona per i controller e tiene conto anche dei moduli disabilitati. Ma dal mio punto di vista questo non è un grosso problema.

L'idea principale è di analizzare i file di configurazione e cercare il <rewrite>tag. Crea un file php allo stesso livello di index.php. Chiamiamolo rewrites.php, con questo contenuto:

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

quando lo chiami in un browser dovresti vedere qualcosa del genere:

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

)

questo significa che il modello 'core/layout'viene sovrascritto daNamespace_Module_Model_Core_Layout

Se hai 2 o più valori nell'array ['core / layout'] significa che c'è un conflitto.

E puoi facilmente identificare il modulo che sovrascrive qualcosa basato su NamespaceeModule


1
Ciao, grazie per la sceneggiatura. L'ho usato in uno dei miei progetti e ho scoperto che il controllo dei moduli della community non funziona. Per farlo funzionare abbiamo aggiunto un "/" alla fine di "app / code / community", quindi diventerà "app / code / community /"
ceckoslab,

@ceckoslab. Sì. Hai ragione. Ho modificato la risposta. Grazie.
Marius

3

ho combinato sia la risposta che una buona soluzione

$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

Forse un po 'sovraccarico ma è bello lavorare con la raccolta di dati varien ... codice da 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)
                    )
                )
            );
        }
    }
}

Per l'output è possibile utilizzare ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.