আমি কীভাবে সমস্ত শ্রেণীর পুনর্লিখনের তালিকা পেতে পারি?


23

সমস্ত কনফিগারেশন ফাইল পর্যালোচনা ছাড়াও সমস্ত পুনর্লিখন এবং সম্ভবত অন্যান্য সম্ভাব্য বিবাদগুলির তালিকা করার কোনও উপায় আছে কি? আমাকে প্রচুর এক্সটেনশান এবং কাস্টম পরিবর্তন সহ কিছু প্রকল্প বিশ্লেষণ করতে হবে এবং এটি যতটা সম্ভব স্বয়ংক্রিয় করতে চাই।

সর্বাধিক গুরুত্বপূর্ণ বিষয় হ'ল একই শ্রেণীর পুনর্লিখনের এক্সটেনশানগুলি সনাক্ত করা, তবে আমি একটি সংক্ষিপ্ত বিবরণ রাখার জন্য সমস্ত জায়গায় পুনরায় লেখার জায়গাটিও রাখতে চাই place এই মুহুর্তে আমি স্প্রেডশিটে ম্যানুয়ালি এই তালিকাটি বজায় রাখছি।

আমি ম্যাজেন্টো কানেক্টে এই এক্সটেনশনটি ("এক্সটেনশন সংঘাত") পেয়েছি তবে পর্যালোচনাগুলি এবং রিলিজ নোটগুলি বিচার করে এটি পুরানো বলে মনে হচ্ছে।


আপনি কি ব্যবহার করতে পারবেন নাgrep
বেন লেসানী - সোনাসি

উত্তর:


28

কটাক্ষপাত আছে n98-magerun উপযোগ :

পুনর্লিখনের তালিকা

সমস্ত নিবন্ধিত শ্রেণীর পুনর্লিখন তালিকাবদ্ধ করুন:

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

দ্বন্দ্ব পুনর্লিখন

সমস্ত নকল পুনর্লিখন তালিকাভুক্ত করে এবং আপনাকে বলে যে কোন ক্লাসটি ম্যাজেন্টো দ্বারা বোঝানো হয়েছে। কমান্ডটি আপনার মডিউল নির্ভরতা অনুসারে শ্রেণীর উত্তরাধিকার পরীক্ষা করে। n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

--Log-জুনিট বিকল্প সহ ফাইলের নাম সেট করা থাকলে সরঞ্জামটি একটি এক্সএমএল ফাইল উত্পন্ন করে এবং স্টাডআউটে কোনও আউটপুট দেয় না।

আপনি আরও বিশ্লেষণের জন্য জুনিত স্টাইল এক্সএমএল ফাইলে সংঘাতগুলি লগ করতে পারেন, উদাহরণস্বরূপ একটি অব্যাহত ইন্টিগ্রেশন সার্ভারে।

দাবি অস্বীকার: আধা স্ব-লিঙ্ক / আমি সেই প্রকল্পের সাথে জড়িত


27

এখানে একটি ছোট একটি লাইনার যা আপনাকে সমস্ত সক্রিয় পুনর্লিখন দেয়:

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

এটিকে অবজেক্টের ধরণের মাধ্যমে সীমাবদ্ধ করতে, এক্সপথে যথাক্রমে মডেল, ব্লক বা সহায়তাকারী যুক্ত করুন।
উদাহরণ স্বরূপ:

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

ম্যাজেন্টো.এসইতে সমস্যা কী? যাইহোক আমি সমাধানটি সহজ এবং সহজবোধ্য পছন্দ করি। এ নিয়ে আমার নিজেই চিন্তা করা উচিত ছিল ... ডানকে, বিনাই!
ফ্যাবিয়ান শেমংলার

2
এটি একটি ছোট সমস্যা নিয়ে কাজ করে। যদি আপনার কাছে একই মডেলটি পুনরায় লেখার জন্য 2 টি এক্সটেনশন থাকে তবে আপনি এটি দেখতে পাবেন না, কারণ ম্যাজেন্টো কনফিগার ফাইলগুলিকে মার্জ করে। আপনি কেবল "শেষ "টিকে দেখতে পাবেন। তবে কিছু নতুন করে লেখা হয়েছে কিনা তা দেখার একটি দ্রুত এবং সহজ উপায়
মারিয়াস

হ্যাঁ, এটি কেবল সক্রিয় পুনর্লিখনগুলি দেখায়, এটি সত্য। আপনি যদি আরও উন্নত বিশ্লেষণ চান তবে আপনার প্রতিটি সক্রিয় মডিউল ইত্যাদি / কনফিগারেশন.এক্সএমএল পৃথকভাবে পরীক্ষা করতে হবে, (অথবা কেবল এন 9৮-ম্যাগারুন ব্যবহার করুন)
বিনাই ২13

হ্যালো @ বিনাই, আমরা কি এই কোড দ্বারা magento2 এ সমস্ত দ্বন্দ্ব পেতে পারি?
আকোগোলা

নাহ, আপনি ডিআই কনফিগারেশন ম্যাজেন্টো ২ তে বেশ আলাদাভাবে কাজ করতে পারবেন না
বিনাই

22

এখানে একটি ছোট স্ক্রিপ্ট আমি কোনও মডেল, ব্লক বা সাহায্যকারীদের ওভাররাইট করা হয়েছে কিনা তা যাচাই করতে ব্যবহার করি। দুর্ভাগ্যক্রমে এটি নিয়ন্ত্রণকারীদের জন্য কাজ করে না এবং এটি অক্ষম মডিউলগুলিকেও বিবেচনা করে। তবে আমার দৃষ্টিকোণ থেকে এটি কোনও বড় বিষয় নয়।

মূল ধারণাটি হ'ল কনফিগার ফাইলগুলি পার্স করা এবং <rewrite>ট্যাগটি সন্ধান করা। হিসাবে একই স্তরের উপর পিএইচপি ফাইল তৈরি করুন index.phprewrites.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
হাই, স্ক্রিপ্টের জন্য ধন্যবাদ। আমি এটি আমার প্রকল্পের একটিতে ব্যবহার করেছি এবং খুঁজে পেয়েছি যে সম্প্রদায় মডিউলগুলির জন্য চেক কাজ করে না। এটি কাজ করতে আমরা 'অ্যাপ / কোড / সম্প্রদায়' এর শেষে একটি "/" যুক্ত করেছি, সুতরাং এটি 'অ্যাপ / কোড / সম্প্রদায় /' হয়ে উঠবে
সেকোস্ল্যাব

@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

সম্ভবত বিট ওভারহেড তবে ভেরিয়েন্ট ডেটা সংগ্রহের সাথে কাজ করা ভাল ... 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.