Как получить список всех переписанных классов?

23

Есть ли способ перечислить все переписанные и, возможно, другие потенциальные конфликты, кроме просмотра всех файлов конфигурации? Я должен проанализировать некоторые проекты с большим количеством расширений и пользовательских модификаций и хотел бы максимально автоматизировать это.

Самым важным является обнаружение расширений, которые переписывают один и тот же класс, но я хотел бы также иметь список всех переписываний, чтобы сохранить обзор. На данный момент я поддерживаю этот список вручную в электронной таблице.

Я обнаружил это расширение («Extension Conflict») в Magento Connect, но, судя по отзывам и примечаниям к выпуску, оно устарело.

Фабиан Шменглер
источник
Разве вы не можете просто использоватьgrep
Бен Лессани - Sonassi

Ответы:

28

Посмотрите на утилиту n98-magerun :

Переписать список

Перечисляет все зарегистрированные классы переписывает:

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

Переписать конфликты

Перечисляет все дубликаты переписывает и говорит вам, какой класс загружается Magento. Команда проверяет наследование классов в порядке зависимостей вашего модуля. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Если задано имя файла с параметром --log-junit, инструмент генерирует файл XML и не выводит в стандартный вывод.

Вы также можете записать конфликты в XML-файл стиля JUnit для дальнейшего анализа, например, на сервере непрерывной интеграции.

Отказ от ответственности: полу-самостоятельная ссылка / я участвую в этом проекте

Alex
источник
27

Вот небольшая строчка, которая дает вам все активные переписывает:

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

Чтобы ограничить его типом объекта, добавьте модели, блоки или помощники в xpath соответственно.
Например:

Mage::getConfig()->getNode()->xpath('//global/models//rewrite')
Vinai
источник
В чем проблема с magento.SE? В любом случае, мне нравится решение, простое и понятное. Должен был подумать об этом сам ... Данке, Винай!
Фабиан Шменглер
2
Это работает с небольшой проблемой. Если у вас есть 2 расширения, переписывающих одну и ту же модель, вы не увидите ее, потому что Magento объединяет файлы конфигурации. Вы увидите только «последний». Но это быстрый и простой способ узнать, что-то переписано
Marius
Да, это показывает только активные переписывает, это правда. Если вы хотите более продвинутые аналитики вам нужно проверить каждый активный модули и т.д. / config.xml индивидуально (или просто использовать N98-magerun)
Vinai
Здравствуйте @ Vinai, можем ли мы получить все конфликты в magento2 этим кодом?
Акгола
Нет, вы не можете конфигурации DI работает совершенно по- разному в Magento 2.
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

Если у вас есть 2 или более значений в массиве ['core / layout'], это означает, что существует конфликт.

И вы можете легко определить модуль, который перезаписывает что-то на основе NamespaceиModule

Мариус
источник
1
Привет, спасибо за сценарий. Я использовал его в одном из своих проектов и обнаружил, что проверка модулей сообщества не работает. Чтобы это работало, мы добавили «/» в конец «app / code / community», чтобы оно стало «app / code / community /»
ceckoslab
@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;
sunel
источник
0

Может быть, немного накладных расходов, но приятно работать с разным сбором данных ... код из 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());
}
sv3n
источник