Làm thế nào để tôi có được một danh sách tất cả các lớp viết lại?


23

Có cách nào để liệt kê tất cả các bản viết lại và có thể các xung đột tiềm năng khác bên cạnh việc xem xét tất cả các tệp cấu hình không? Tôi phải phân tích một số dự án với nhiều phần mở rộng và sửa đổi tùy chỉnh và muốn tự động hóa càng nhiều càng tốt điều này.

Điều quan trọng nhất là phát hiện các phần mở rộng viết lại cùng một lớp, nhưng tôi cũng muốn có một danh sách tất cả các phần viết lại, để giữ một cái nhìn tổng quan. Hiện tại tôi duy trì danh sách này bằng tay trong một bảng tính.

Tôi đã tìm thấy tiện ích mở rộng này ("Xung đột mở rộng") trên Magento Connect nhưng đánh giá bằng các đánh giá và ghi chú phát hành có vẻ như đã lỗi thời.


Bạn không thể sử dụnggrep
Ben Lessani - Sonassi 26/03/13

Câu trả lời:


28

Hãy xem tiện ích n98-magerun :

Viết lại danh sách

Liệt kê tất cả các bài viết lại lớp đã đăng ký:

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

Viết lại xung đột

Liệt kê tất cả các bản viết lại trùng lặp và cho bạn biết lớp nào được Magento tải. Lệnh kiểm tra kế thừa lớp theo thứ tự phụ thuộc mô-đun của bạn. n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

Nếu tên tệp có tùy chọn --log-junit được đặt, công cụ sẽ tạo tệp XML và không có đầu ra nào cho thiết bị xuất chuẩn.

Bạn cũng có thể ghi lại các xung đột vào tệp XML JUnit Style để phân tích thêm, ví dụ như trên máy chủ tích hợp tiếp tục.

Tuyên bố miễn trừ trách nhiệm: bán tự liên kết / Tôi tham gia vào dự án đó


27

Đây là một lớp lót nhỏ cung cấp cho bạn tất cả các hoạt động viết lại:

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

Để giới hạn nó theo loại đối tượng, hãy thêm mô hình, khối hoặc người trợ giúp vào xpath tương ứng.
Ví dụ:

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

Có vấn đề gì với magento.SE? Dù sao tôi thích giải pháp, đơn giản và dễ hiểu. Nên tự nghĩ về nó ... Danke, Vinai!
Fabian Schmengler

2
Điều này hoạt động với một vấn đề nhỏ. Nếu bạn có 2 tiện ích mở rộng viết lại cùng một mô hình, bạn sẽ không thấy nó, vì Magento hợp nhất các tệp cấu hình. Bạn sẽ chỉ nhìn thấy cái "cuối cùng". Nhưng đó là một cách nhanh chóng và đơn giản để xem có thứ gì được viết lại hay không
Marius

Vâng, nó chỉ hiển thị các viết lại hoạt động, đó là sự thật. Nếu bạn muốn phân tích nâng cao hơn, bạn cần kiểm tra từng mô-đun hoạt động vv / config.xml riêng lẻ (hoặc chỉ sử dụng n98-magerun)
Vinai

Xin chào @ Vinai, chúng ta có thể nhận được tất cả xung đột trong magento2 bằng mã này không?
akgola

Không, cấu hình DI không thể hoạt động hoàn toàn khác trong Magento 2.
Vinai

22

Đây là một đoạn script nhỏ mà tôi sử dụng để kiểm tra xem có bất kỳ mô hình, khối hoặc trình trợ giúp nào được ghi đè không. Thật không may, nó không hoạt động cho các bộ điều khiển và nó cũng tính đến các mô-đun bị vô hiệu hóa. Nhưng theo quan điểm của tôi thì đây không phải là vấn đề lớn.

Ý tưởng chính là phân tích các tệp cấu hình và tìm kiếm <rewrite>thẻ. Tạo một tập tin php ở cùng cấp độ với index.php. Hãy gọi nó rewrites.php, với nội dung này:

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

Khi gọi nó trong trình duyệt, bạn sẽ thấy một cái gì đó như thế này:

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

)

điều này có nghĩa là mô hình 'core/layout'được ghi đè bởiNamespace_Module_Model_Core_Layout

Nếu bạn có 2 hoặc nhiều giá trị trong mảng ['core / layout'], điều đó có nghĩa là có xung đột.

Và bạn có thể dễ dàng xác định mô-đun ghi đè lên một cái gì đó dựa trên NamespaceModule


1
Xin chào, cảm ơn vì kịch bản. Tôi đã sử dụng nó trong một dự án của mình và thấy rằng việc kiểm tra các mô-đun cộng đồng không hoạt động. Để làm cho nó hoạt động, chúng tôi đã thêm "/" vào cuối 'ứng dụng / mã / cộng đồng', vì vậy nó sẽ trở thành 'ứng dụng / mã / cộng đồng /'
ceckoslab

@ceckoslab. Vâng. Bạn đúng rồi. Tôi đã chỉnh sửa câu trả lời. Cảm ơn.
Marius

3

tôi đã kết hợp cả hai câu trả lời và có một giải pháp tốt

$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

Có thể hơi quá phí nhưng thật tuyệt khi làm việc với bộ sưu tập dữ liệu varien ... mã từ 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)
                    )
                )
            );
        }
    }
}

Đối với đầu ra, bạn có thể sử dụng ...

foreach ($collection as $rewrite) {
    var_dump($rewrite->getData());
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.