すべてのクラス書き換えのリストを取得するにはどうすればよいですか?


23

すべての構成ファイルを確認する以外に、すべてのリライトおよびその他の潜在的な競合をリストする方法はありますか?私は多くの拡張機能とカスタム変更を含むいくつかのプロジェクトを分析する必要があり、これを可能な限り自動化したいと考えています。

最も重要なことは、同じクラスを書き換える拡張機能を検出することですが、概要を維持するために、すべての書き換えのリストも用意したいと思います。現時点では、このリストをスプレッドシートで手動で管理しています。

Magento Connectでこの拡張機能( "Extension Conflict")を見つけましたが、レビューとリリースノートから判断すると、古いようです。


あなただけを使用することはできませんgrep
ベンLessani-ソナシ

回答:


28

見ていN98-magerunユーティリティ

リストを書き換える

登録されているすべてのクラス書き換えをリストします。

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

競合の書き換え

重複したすべての書き換えをリストし、Magentoによってロードされたクラスを示します。このコマンドは、モジュールの依存関係の順にクラスの継承をチェックします。 n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]

--log-junitオプションを使用したファイル名が設定されている場合、ツールはXMLファイルを生成し、stdoutへの出力は生成しません。

また、継続的な統合サーバーなどで、さらに分析するために、競合をJUnitスタイルXMLファイルに記録することもできます。

免責事項:セミセルフリンク/私はそのプロジェクトに関与しています


27

ここで、すべてのアクティブな書き換えを提供する小さなワンライナー:

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

オブジェクトの種類によって制限するには、モデル、ブロック、またはヘルパーをそれぞれxpathに追加します。
例えば:

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

magento.SEの問題は何ですか?とにかく、シンプルでわかりやすいソリューションが気に入っています。自分で考えるべきだった...ダンケ、ヴィナイ!
ファビアンシュメングラー

2
これは小さな問題で機能します。Magentoが設定ファイルをマージするため、同じモデルを書き換える2つの拡張機能がある場合は表示されません。「最後の」もののみが表示されます。しかし、それは何かが書き換えられているかどうかを確認するための迅速かつ簡単な方法です
マリウス

はい、アクティブな書き換えのみを表示します、それは本当です。より高度な分析が必要な場合は、各アクティブモジュールetc / config.xmlを個別に確認する必要があります(またはn98-magerunを使用するだけ)
Vinai

こんにちは@Vinai、このコードでmagento2のすべての競合を取得できますか?
akgola

いいえ、あなたはDIの設定はMagentoの2にはかなり異なる動作をすることはできません
Vinai

22

これは、モデル、ブロック、またはヘルパーが上書きされているかどうかを確認するために使用する小さなスクリプトです。残念ながら、コントローラーでは機能せず、無効なモジュールも考慮されます。しかし、私の観点からすると、これは大したことではありません。

主なアイデアは、構成ファイルを解析して<rewrite>タグを探すことです。と同じレベルでphpファイルを作成します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

配列['core / layout']に2つ以上の値がある場合、競合があることを意味します。

そして、あなたは簡単に基づいて何かを上書きするモジュールを識別することができますNamespaceし、Module


1
こんにちは、スクリプトをありがとう。私は自分のプロジェクトの1つでそれを使用しましたが、コミュニティモジュールのチェックが機能しないことがわかりました。動作させるために、「app / code / community」の最後に「/」を追加し、「app / code / community /」になります。
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-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.