Tüm sınıf tekrar yazmalarının listesini nasıl alabilirim?


23

Tüm yapılandırma dosyalarını gözden geçirmenin yanı sıra, tüm yeniden yazma ve belki de diğer olası çatışmaları listelemenin bir yolu var mı? Bazı projeleri birçok uzantı ve özel modifikasyonla analiz etmek zorundayım ve mümkün olduğunca otomatikleştirmek istiyorum.

En önemli şey, aynı sınıfı yeniden yazan uzantıları saptamaktır, ancak genel bir bakışı sürdürmek için tüm yeniden yazmaların bir listesini de tutmak istiyorum. Şu anda bu listeyi bir elektronik tabloda manuel olarak tutuyorum.

Magento Connect'te bu uzantıyı ("Uzantı Çatışması") buldum , ancak incelemelere göre değerlendirildi ve yayın notlarına bakıldı.


Sadece kullanılamazgrep
Sonassi - Ben Lessani

Yanıtlar:


28

N98-magerun yardımcı programına bir göz atın :

Listeyi Yeniden Yaz

Kayıtlı tüm sınıf yeniden yazma listeler:

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

Çakışmaları Yeniden Yaz

Tüm yinelenen yeniden yazma listelerini listeler ve hangi sınıfın Magento tarafından yüklendiğini söyler. Komut, modül bağımlılıklarınız için sınıf mirasını kontrol eder. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

--Log-junit seçeneğine sahip bir dosya adı ayarlanmışsa, araç bir XML dosyası oluşturur ve çıktıyı stdout'a çıkarmaz.

Ayrıca, devam eden bir entegrasyon sunucusunda, daha fazla analiz için çakışmaları JUnit Style XML dosyasına da kaydedebilirsiniz.

Feragatname: yarı-kişisel bağlantı


27

İşte size tüm aktif yeniden yazma veren küçük bir astar:

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

Nesne türüyle sınırlamak için, xpath'a sırasıyla modeller, bloklar veya yardımcılar ekleyin.
Örneğin:

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

Magento.SE'nin sorunu ne? Her neyse, çözümü sevdim, basit ve anlaşılır. Bunu kendim düşünmeliydim ... Danke, Vinai!
Fabian Schmengler

2
Bu küçük bir sorun ile çalışır. Eğer aynı modeli yeniden yazan 2 uzantıya sahipseniz, Magento config dosyalarını birleştirdiği için göremezsiniz. Sadece "son" olanı göreceksin. Ancak, bir şeylerin yeniden yazılmış olup olmadığını görmenin hızlı ve basit bir yolu
Marius

Evet, sadece aktif yeniden yazmaları gösterir, bu doğru. Daha gelişmiş analitik istiyorsanız, her bir aktif modülü etc / config.xml ayrı ayrı kontrol etmeniz gerekir (veya yalnızca n98-magerun kullanın)
Vinai

Merhaba @ Vinai, magento2'deki tüm çatışmaları bu kodla alabilir miyiz?
akgola 12:17

Hayır, DI konfigürasyonu Magento 2'de oldukça farklı şekilde çalışamaz.
Vinai

22

Burada herhangi bir model, blok veya yardımcıların üzerine yazılıp yazılmadığını kontrol etmek için kullandığım küçük bir senaryo var. Ne yazık ki kontrolörler için çalışmıyor ve devre dışı modülleri de dikkate alıyor. Ama benim açımdan bu önemli değil.

Ana fikir, config dosyalarını ayrıştırmak ve <rewrite>etiketi aramaktır. Aynı düzeyde bir php dosyası oluşturun index.php. En diyelim rewrites.phpbu, içerik:

<?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);

Tarayıcıda arama yaparken şöyle bir şey görmelisiniz:

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] => ...

)

Bu, modelin 'core/layout'üzerine yazıldığı anlamına gelir .Namespace_Module_Model_Core_Layout

['Core / layout'] dizisinde 2 veya daha fazla değeriniz varsa, bu bir çatışma olduğu anlamına gelir.

Ve kolayca üzerinde yazma şey dayanan bu modülü belirleyebilir NamespaceveModule


1
Merhaba, senaryo için teşekkürler. Projemden birinde kullandım ve topluluk modüllerinin kontrolünün işe yaramadığını öğrendim.
İşe yaraması için

@ceckoslab. Evet. Haklısın. Cevabı değiştirdim. Teşekkürler.
Marius

3

Hem cevabı birleştirdim hem de güzel bir çözüm buldum

$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

Belki biraz ek yükü ama varien veri toplama ile çalışmak güzel ... https://github.com/firegento/firegento-debug gelen kod

$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)
                    )
                )
            );
        }
    }
}

Çıktı için kullanabilirsiniz ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.