如何获得所有类重写的列表?


23

除了查看所有配置文件之外,是否有办法列出所有重写以及其他潜在冲突?我必须分析一些具有大量扩展和自定义修改的项目,并希望尽可能地自动化。

最重要的是要检测重写同一类的扩展,但是我也想保留所有重写的列表,以保持概述。目前,我在电子表格中手动维护此列表。

我在Magento Connect上找到了这个扩展名(“扩展名冲突”),但从评论和发行说明来看,它似乎已经过时了。


您能不能只使用grep
Ben Lessani-Sonassi,2013年

Answers:


28

看看n98-magerun实用程序

改写清单

列出所有已注册的类重写:

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

重写冲突

列出所有重复的重写,并告诉您Magento加载了哪个类。该命令按照模块依赖关系的顺序检查类继承。 n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

如果使用--log-junit选项设置了文件名,该工具将生成XML文件,并且不会向stdout输出。

您也可以将冲突记录到JUnit Style XML文件中,以进行进一步分析,例如在持续集成服务器上。

免责声明:半自我链接/我参与了该项目


27

这里有一个小的单行代码,可让您进行所有主动重写:

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

要通过对象类型限制它,请将模型,块或帮助器分别添加到xpath。
例如:

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

magento.SE有什么问题?无论如何,我都喜欢简单而直接的解决方案。我本该考虑过... Danke,维奈!
Fabian Schmengler

2
这有一个小问题。如果您有2个扩展重写相同的模型,您将看不到它,因为Magento合并了配置文件。您只会看到“最后一个”。但这是查看某些内容是否被重写的快速简便的方法
Marius

是的,它仅显示活动重写,这是正确的。如果您需要更高级的分析,则需要分别检查每个活动模块etc / config.xml,(或仅使用n98-magerun)
Vinai

您好@Vinai,我们可以通过此代码在magento2中解决所有冲突吗?
akgola

不,您不能在Magento 2中使用DI配置。完全不同
。– Vinai

22

这是一个小脚本,用于检查是否覆盖了任何模型,块或助手。不幸的是,它不适用于控制器,并且还考虑了禁用的模块。但是从我的角度来看,这没什么大不了的。

主要思想是解析配置文件并查找<rewrite>标签。在与相同级别上创建一个php文件index.php。我们称其为rewrites.php,内容如下:

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

在浏览器中调用它时,您应该看到类似以下内容:

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

)

这意味着该模型'core/layout'被覆盖Namespace_Module_Model_Core_Layout

如果数组['core / layout']中有2个或更多值,则表示存在冲突。

而且您可以轻松地确定基于Namespace和覆盖某些内容的模块Module


1
嗨,谢谢你的剧本。我在我的一个项目中使用它,发现对社区模块的检查不起作用。为使其正常工作,我们在“ app / code / community”的末尾添加了“ /”,因此它将变为“ app / code / community /”
ceckoslab 2013年

@ceckoslab。是的 你是对的。我已经编辑了答案。谢谢。
马里乌斯

3

我结合了答案并得到了很好的解决方案

$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

也许有点开销,但是与varien数据收集一起工作非常好...来自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)
                    )
                )
            );
        }
    }
}

对于输出,您可以使用...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.