मुझे सभी वर्ग के पुनर्लेखन की सूची कैसे मिलेगी?


23

क्या सभी कॉन्फ़िगरेशन फ़ाइलों की समीक्षा करने के अलावा सभी लिखित और शायद अन्य संभावित संघर्षों को सूचीबद्ध करने का एक तरीका है? मुझे बहुत सारे एक्सटेंशन और कस्टम संशोधनों के साथ कुछ परियोजनाओं का विश्लेषण करना है और जितना संभव हो उतना इसे स्वचालित करना चाहते हैं।

सबसे महत्वपूर्ण बात यह है कि एक ही वर्ग को फिर से लिखने वाले एक्सटेंशन का पता लगाएं, लेकिन मैं एक जगह रखने के लिए सभी पुनर्लेखनों की एक सूची रखना चाहूंगा। फिलहाल मैं एक स्प्रेडशीट में मैन्युअल रूप से इस सूची को बनाए रखता हूं।

मुझे यह एक्सटेंशन ("एक्सटेंशन कंफ्लिक्ट") मैगनेट कनेक्ट पर मिला लेकिन समीक्षाओं और रिलीज नोटों को देखते हुए लगता है कि यह पुराना हो चुका है।


क्या आप बस इस्तेमाल नहीं कर सकतेgrep
बेन लेसानी - सोनासी

जवाबों:


28

N98-magerun उपयोगिता पर एक नजर :

पुन: सूचीबद्ध करें

सभी पंजीकृत वर्ग के पुनर्लेखन को सूचीबद्ध करता है:

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

फिर से संघर्ष करें

सभी डुप्लिकेट पुनर्लेखनों की सूची देता है और आपको बताता है कि मैगेंटो किस वर्ग द्वारा लोड किया गया है। आदेश आपके मॉड्यूल निर्भरता के क्रम में वर्ग उत्तराधिकार की जाँच करता है। n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

यदि फ़ाइल नाम --log-junit विकल्प सेट किया जाता है, तो उपकरण XML फ़ाइल उत्पन्न करता है और स्टडआउट करने के लिए कोई आउटपुट नहीं देता है।

आप आगे के विश्लेषण के लिए एक JUnit स्टाइल XML फ़ाइल के लिए संघर्षों को भी लॉग कर सकते हैं, उदाहरण के लिए एक एकीकरण सर्वर पर।

अस्वीकरण: अर्ध-स्व-लिंक / मैं उस परियोजना में शामिल हूं


27

यहाँ एक छोटा सा लाइनर है जो आपको सभी सक्रिय पुनर्लेखन देता है:

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

ऑब्जेक्ट प्रकार द्वारा इसे सीमित करने के लिए, क्रमशः xpath में मॉडल, ब्लॉक या हेल्पर्स जोड़ें।
उदाहरण के लिए:

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

Magento.SE के साथ समस्या क्या है? वैसे भी मुझे समाधान पसंद है, सरल और सीधा। खुद इसके बारे में सोचना चाहिए था ... डंके, विनय!
फेबियन शेंगलर

2
यह एक छोटे से मुद्दे के साथ काम करता है। यदि आपके पास 2 एक्सटेंशन हैं उसी मॉडल को फिर से लिखना जो आप इसे नहीं देखेंगे, क्योंकि Magento की कॉन्फिग फाइलों को मर्ज कर देता है। आप केवल "अंतिम" एक देखेंगे। लेकिन यह एक तेज़ और सरल तरीका अगर कुछ पुनः लिखा जाता है देखने के लिए है
मेरियस

हां, यह केवल सक्रिय पुनर्लेखन को दिखाता है, यह सच है। यदि आप अधिक उन्नत विश्लेषिकी चाहते हैं तो आपको प्रत्येक सक्रिय मॉड्यूल आदि की जांच करने की आवश्यकता है / config.xml व्यक्तिगत रूप से, (या बस n98-magerun का उपयोग करें)
Vinai

नमस्ते @ विनई, क्या हम इस कोड द्वारा magento2 में सभी संघर्ष प्राप्त कर सकते हैं?
अंकोला

नहीं, तुम नहीं डि विन्यास काफी अलग ढंग से 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 या अधिक मान हैं, तो इसका मतलब है कि एक संघर्ष है।

और आप आसानी से उस मॉड्यूल की पहचान कर सकते हैं जो कुछ के आधार पर ओवरराइट करता है NamespaceऔरModule


1
नमस्ते, स्क्रिप्ट के लिए धन्यवाद। मैंने इसे अपने एक प्रोजेक्ट में इस्तेमाल किया और पाया, कि कम्युनिटी मॉड्यूल्स के लिए चेक काम नहीं करता है। इसे काम करने के लिए हमने "ऐप / कोड / समुदाय" के अंत में एक "/" जोड़ दिया है, इसलिए यह 'app / कोड / समुदाय /' बन जाएगा
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;

0

शायद बिट ओवरहेड लेकिन varien डेटा कलेक्शन के साथ काम करना अच्छा लगता है ... https://github.com/firegento/firegento-bebug से कोड

$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());
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.