Bagaimana cara saya mendapatkan daftar semua penulisan ulang kelas?

23

Apakah ada cara untuk membuat daftar semua penulisan ulang dan mungkin konflik potensial lainnya selain meninjau semua file konfigurasi? Saya harus menganalisis beberapa proyek dengan banyak ekstensi dan modifikasi khusus dan ingin mengotomatiskan sebanyak mungkin ini.

Yang paling penting adalah mendeteksi ekstensi yang menulis ulang kelas yang sama, tetapi saya juga ingin memiliki daftar semua penulisan ulang, untuk menyimpan ikhtisar. Saat ini saya mengelola daftar ini secara manual dalam spreadsheet.

Saya menemukan ekstensi ini ("Konflik Ekstensi") di Magento Connect tetapi dinilai dari ulasan dan catatan rilis sepertinya sudah usang.

Fabian Schmengler
sumber
Tidak bisakah Anda menggunakangrep
Ben Lessani - Sonassi

Jawaban:

28

Silahkan lihat di utilitas N98-magerun :

Daftar Ulang

Daftar semua penulisan ulang kelas terdaftar:

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

Menulis Ulang Konflik

Daftar semua penulisan ulang duplikat dan memberitahu Anda kelas mana yang dimuat oleh Magento. Perintah ini memeriksa warisan kelas dalam urutan dependensi modul Anda. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Jika nama file dengan opsi --log-junit diatur, alat ini menghasilkan file XML dan tidak ada output ke stdout.

Anda juga dapat mencatat konflik ke file XML Gaya JUnit untuk analisis lebih lanjut, misalnya pada server integrasi berkelanjutan.

Penafian: semi-self-link / Saya terlibat dalam proyek itu

Alex
sumber
27

Di sini, satu garis kecil yang memberi Anda semua penulisan ulang yang aktif:

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

Untuk membatasi berdasarkan jenis objek, tambahkan masing-masing model, blok, atau pembantu ke xpath.
Sebagai contoh:

Mage::getConfig()->getNode()->xpath('//global/models//rewrite')
Vinai
sumber
Apa masalahnya dengan magento.SE? Bagaimanapun saya suka solusinya, sederhana dan mudah. Seharusnya memikirkannya sendiri ... Danke, Vinai!
Fabian Schmengler
2
Ini berfungsi dengan masalah kecil. Jika Anda memiliki 2 ekstensi yang menulis ulang model yang sama Anda tidak akan melihatnya, karena Magento menggabungkan file konfigurasi. Anda hanya akan melihat yang "terakhir". Tapi ini cara cepat dan sederhana untuk melihat apakah ada sesuatu yang ditulis ulang
Marius
Ya, itu hanya menunjukkan penulisan ulang aktif, itu benar. Jika Anda ingin analitik yang lebih maju, Anda perlu memeriksa setiap modul yang aktif, dll / config.xml secara terpisah, (atau cukup gunakan n98-magerun)
Vinai
Halo @ Vinai, bisakah kita mendapatkan semua konflik di magento2 dengan kode ini?
akgola
Tidak, Anda tidak dapat melakukan konfigurasi DI bekerja sangat berbeda di Magento 2.
Vinai
22

di sini adalah skrip kecil yang saya gunakan untuk memeriksa apakah ada model, blok atau pembantu yang ditimpa. Sayangnya itu tidak bekerja untuk pengendali dan memperhitungkan modul yang dinonaktifkan juga. Tapi dari sudut pandang saya ini bukan masalah besar.

Ide utamanya adalah mengurai file konfigurasi dan mencari <rewrite>tag. Buat file php pada tingkat yang sama dengan index.php. Sebut saja rewrites.php, dengan konten ini:

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

saat memanggilnya di browser Anda akan melihat sesuatu seperti ini:

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

)

ini berarti bahwa model 'core/layout'tersebut ditimpa olehNamespace_Module_Model_Core_Layout

Jika Anda memiliki 2 atau lebih nilai dalam array ['core / layout'] itu berarti ada konflik.

Dan Anda dapat dengan mudah mengidentifikasi modul yang menimpa sesuatu berdasarkan NamespacedanModule

Marius
sumber
1
Hai, terima kasih untuk skripnya. Saya menggunakannya di salah satu proyek saya dan menemukan, bahwa pemeriksaan untuk modul komunitas tidak berfungsi. Untuk membuatnya berfungsi, kita harus menambahkan "/" di akhir 'app / code / community', jadi itu akan menjadi 'app / code / community /'
ceckoslab
@ceckoslab. Ya. Kamu benar. Saya sudah mengedit jawabannya. Terima kasih.
Marius
3

Saya telah menggabungkan kedua jawabannya dan mendapat solusi yang bagus

$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;
sunel
sumber
0

Mungkin sedikit overhead tetapi senang bekerja dengan pengumpulan data varien ... kode dari 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)
                    )
                )
            );
        }
    }
}

Untuk output, Anda dapat menggunakan ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
sv3n
sumber