Pregunta

¿Hay una manera de enumerar todas las reescrituras y tal vez otros posibles conflictos, además de la revisión de todos los archivos de configuración? Tengo que analizar algunos proyectos con una gran cantidad de extensiones y modificaciones personalizadas y me gustaría para automatizar tanto como sea posible de esta.

Lo más importante es detectar extensiones que volver a escribir la misma clase, pero me gustaría tener una lista de todas las reescrituras en su lugar también, para mantener una visión general. En el momento en que mantener esta lista manualmente en una hoja de cálculo.

encontré esta extensión ( "Extensión de conflictos") en Magento Conectar pero a juzgar por la comentarios y notas de la versión que parece ser obsoleta.

¿Fue útil?

Solución

Para consultar el N98-magerun utilidad :

Lista de reescritura

Lista todos reescrituras de clase registrada:

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

reescritura de conflictos

Listas de todos los reescrituras duplicados y le dice qué clase se carga por Magento. La herencia de clases comando comprueba el fin de sus dependencias del módulo. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Si un nombre de archivo con la opción --log-junit se fija la herramienta genera un archivo XML y no hay salida a la salida estándar.

También puede registrar los conflictos a un archivo XML JUnit estilo para su posterior análisis, por ejemplo en un servidor de integración continua.

Renuncia: semi-auto-enlace / estoy involucrado en ese proyecto

Otros consejos

A continuación, una pequeña de una sola línea que proporciona todas las reescrituras activos:

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

Para limitarlo por tipo de objeto, añadir modelos, bloques o ayudantes para el XPath respectivamente.
Por ejemplo:

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

aquí es un pequeño script que utilizo para comprobar si todos los modelos, bloques o ayudantes son sobrescritos. Por desgracia, no funciona para los controladores y que toma en cuenta los módulos con discapacidad también. Pero desde mi punto de vista esto no es un gran problema.

La idea principal es analizar los archivos de configuración y busque la etiqueta <rewrite>. Crear un archivo php en el mismo nivel que index.php. la llamada de Let rewrites.php que, con este contenido:

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

al llamar en un navegador debería ver algo como esto:

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

)

Esto significa que el modelo 'core/layout' es sobreescrito Namespace_Module_Model_Core_Layout

Si usted tiene 2 o más valores de la matriz [ 'núcleo / layout'] significa que hay un conflicto.

Y usted puede identificar fácilmente el módulo que sobrescribe algo basa en Namespace y Module

he combinado tanto la respuesta y tiene una buena solución

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

Tal vez poco por encima, pero es agradable para trabajar con datos varien colección ... código 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)
                    )
                )
            );
        }
    }
}

Para la salida se puede utilizar ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top