모든 클래스 재 작성 목록을 어떻게 얻습니까?


23

모든 구성 파일을 검토하는 것 외에 모든 다시 쓰기 및 기타 잠재적 충돌을 나열하는 방법이 있습니까? 확장 기능과 사용자 지정 수정이 많은 일부 프로젝트를 분석해야하며 가능한 한 많이 자동화하고 싶습니다.

가장 중요한 것은 동일한 클래스를 다시 작성하는 확장을 감지하는 것이지만 개요를 유지하기 위해 모든 다시 작성 목록도 작성하고 싶습니다. 현재이 목록을 스프레드 시트에서 수동으로 유지 관리합니다.

Magento Connect 에서이 확장 ( "Extension Conflict") 을 찾았 지만 리뷰 및 릴리스 노트에 따르면 오래된 것으로 보입니다.


당신은 그냥 사용할 수 없습니다grep
Ben Lessani-Sonassi

답변:


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 스타일 XML 파일에 기록 할 수도 있습니다.

면책 조항 : semi-self-link / 해당 프로젝트에 참여하고 있습니다


27

여기에 모든 활성 재 작성을 제공하는 작은 하나의 라이너가 있습니다.

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

객체 유형별로 제한하려면 xpath에 각각 모델, 블록 또는 도우미를 추가하십시오.
예를 들면 다음과 같습니다.

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

magento.SE의 문제점은 무엇입니까? 어쨌든 나는 간단하고 간단하게 솔루션을 좋아합니다. 스스로 생각 했어야했는데 ... Danke, Vinai!
Fabian Schmengler

2
이것은 작은 문제로 작동합니다. Magento가 구성 파일을 병합하기 때문에 동일한 모델을 다시 작성하는 확장명이 2 개인 경우 표시되지 않습니다. "마지막"항목 만 표시됩니다. 그러나 무언가가 다시 쓰여지는지 확인하는 빠르고 간단한 방법입니다.
Marius

예, 활성 재기록 만 표시합니다. 고급 분석을 원하면 각 활성 모듈 etc / config.xml을 개별적으로 확인하거나 n98-magerun을 사용하십시오.
Vinai

안녕하세요 @Vinai,이 코드로 magento2에서 모든 충돌을 일으킬 수 있습니까?
akgola


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 개 이상의 값이 있으면 충돌이 발생한 것입니다.

그리고 당신은 쉽게 덮어 쓰기 뭔가 기반으로하는 모듈을 식별 할 수 NamespaceModule


1
안녕, 스크립트 주셔서 감사합니다. 내 프로젝트 중 하나에서 사용하고 커뮤니티 모듈 검사가 작동하지 않는 것을 발견했습니다. 작동시키기 위해 'app / code / community'의 끝에 "/"를 추가하여 'app / code / community /'가됩니다
ceckoslab

@ceckoslab. 네. 네 말이 맞아 답변을 편집했습니다. 감사.
Marius

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());
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.