ฉันจะได้รับรายชื่อการเขียนคลาสทั้งหมดได้อย่างไร


23

มีวิธีแสดงรายการการเขียนซ้ำทั้งหมดและอาจเกิดข้อขัดแย้งอื่น ๆ นอกเหนือจากการตรวจสอบไฟล์การกำหนดค่าทั้งหมดหรือไม่ ฉันต้องวิเคราะห์บางโครงการที่มีส่วนขยายและการแก้ไขที่กำหนดเองจำนวนมากและต้องการทำให้เป็นอัตโนมัติมากที่สุดเท่าที่จะเป็นไปได้

สิ่งที่สำคัญที่สุดคือการตรวจหาส่วนขยายที่เขียนคลาสเดียวกัน แต่ฉันต้องการให้มีรายการของการเขียนทั้งหมดใหม่อีกครั้งเพื่อเก็บภาพรวม ในขณะนี้ฉันเก็บรักษารายการนี้ด้วยตนเองในสเปรดชีต

ฉันพบส่วนขยายนี้ ("ส่วนขยายความขัดแย้ง")ใน Magento Connect แต่ตัดสินโดยคำวิจารณ์และบันทึกย่อประจำรุ่นที่ดูเหมือนว่าจะล้าสมัย


คุณไม่สามารถใช้เพียงgrep
เบ็นเลซานี - Sonassi

คำตอบ:


28

ดูที่อรรถประโยชน์ของ n98-magerun :

เขียนซ้ำรายการ

แสดงการเขียนคลาสที่ลงทะเบียนทั้งหมด:

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

เขียนซ้ำความขัดแย้ง

แสดงรายการการเขียนซ้ำทั้งหมดและแจ้งให้คุณทราบว่าวีโอไอพีโหลดคลาสใด คำสั่งตรวจสอบการสืบทอดคลาสตามลำดับการพึ่งพาโมดูลของคุณ n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

หากชื่อไฟล์ที่มีตัวเลือก --log-junit ถูกตั้งค่าเครื่องมือจะสร้างไฟล์ XML และไม่มีเอาต์พุตไปยัง stdout

คุณยังสามารถบันทึกข้อขัดแย้งไปยังไฟล์ JUnit Style 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!
เฟเบียน Schmengler

2
สิ่งนี้ใช้ได้กับปัญหาเล็ก ๆ หากคุณมีส่วนขยาย 2 เขียนใหม่แบบเดียวกันคุณจะไม่เห็นมันเพราะวีโอไอพีผสานไฟล์กำหนดค่า คุณจะเห็น "ล่าสุด" เท่านั้น แต่มันเป็นวิธีที่ง่ายและรวดเร็วในการตรวจสอบว่ามีบางสิ่งที่เขียนขึ้นใหม่หรือไม่
23499 Marius

ใช่มันจะแสดงเฉพาะการเขียนซ้ำที่ใช้งานอยู่ซึ่งเป็นจริง หากคุณต้องการการวิเคราะห์ขั้นสูงเพิ่มเติมคุณต้องตรวจสอบแต่ละโมดูลที่ใช้งานอยู่ / etc / config.xml ทีละรายการ (หรือเพียงแค่ใช้ n98-magerun)
Vinai

สวัสดี @ Vinai เราจะได้รับความขัดแย้งทั้งหมดใน magento2 ด้วยรหัสนี้หรือไม่?
akgola

ไม่คุณไม่สามารถกำหนดค่า 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
สวัสดีขอบคุณสำหรับสคริปต์ ฉันใช้มันในหนึ่งในโครงการของฉันและพบว่าการตรวจสอบโมดูลชุมชนไม่ทำงาน เพื่อให้มันใช้งานได้เราได้เพิ่ม "/" ในตอนท้ายของ 'แอพ / รหัส / ชุมชน' ดังนั้นมันจะกลายเป็น 'แอพ / รหัส / ชุมชน /'
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

อาจจะมีค่าใช้จ่ายเล็กน้อย แต่ก็ยินดีที่ได้ร่วมงานกับชุดข้อมูลที่หลากหลาย ... รหัสจาก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.