レイアウトXMLロードのデバッグ


36

TL; DR:レイアウトの読み込みをデバッグする方法はありますか?あるモジュールのレイアウトは別のモジュールと競合していると思います。

前の質問に関連して:すべてのテーマに表示されるモジュールレイアウトを作成する方法

ローカルテスト環境(開発PC)にモジュールを正常にロードし、3つの異なるテーマ間の切り替えをテストしましたが、問題ありません。その後、私たちが持っているテスト環境または「運用前」環境でモジュールを更新しました。ここには、さまざまなモジュールがあります。この環境では、モジュールは製品フロントページで必要なものを表示しません。いくつかのテストの後、問題はレイアウトの読み込みプロセスにあるべきだという結論に至りました。

だから、レイアウトの読み込みをデバッグする方法、さまざまなモジュールが独自のブロックを置換または追加する方法はありますか?私のポイントは、私のモジュールと競合するモジュールが少なくとも1つあると信じていることです。そして、非常に多くのモジュールがあるため、モジュールを1つずつ無効にするのとは異なるアプローチを探しており、どれが問題のあるものかを確認しています。

私のconfig.xmlファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Dts_Banners>
            <version>0.1.0</version>
        </Dts_Banners>
    </modules>
    <global>
        <blocks>
            <banners>
                <class>Dts_Banners_Block</class>
            </banners>
        </blocks>
  ....
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <attributesethandle>
                        <class>Dts_Banners_Model_Observer</class>
                        <method>addAttributeSetHandle</method>
                    </attributesethandle>
                </observers>
            </controller_action_layout_load_before>
        </events>
    </global>    
  ....
</config>

私のオブザーバーファイル:

<?php
class Dts_Banners_Model_Observer
{
    /**
     * Checks if the search text on the list of active campaigns (dts_banners_admin table) has some of the comma separated text on the product name
     * If text found, add a layout handle PRODUCT_CAMPAIGN_BANNER after PRODUCT_TYPE_<product_type_id> handle
     * This handle is handled on the banners.xml layout file that triggers the use of the Front.php frontend block
     *
     * Event: controller_action_layout_load_before
     *
     * @param Varien_Event_Observer $observer
     */
    public function addAttributeSetHandle(Varien_Event_Observer $observer) {
        $product = Mage::registry('current_product');
        if (!($product instanceof Mage_Catalog_Model_Product)) return;
      ....
      ....
}

これは私のレイアウトファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
    <default>
        <reference name="content">
            <block type="banners/front" name="banners.front" as="banners_front" template="banners/product.phtml" before="-"/>
        </reference>
    </default>
</layout>

以前は<default></default>私が持っていたのとは少し違うものがありました<Product_Campaign_Banner></Product_Campaign_Banner>。それも機能しました。

私のproduct.phtmlファイル:

<div class="visual">
    <?php echo $this->showCampaign(); ?>
</div>

product.phtmlファイルがロードされていないため、showCampaign実行されず、すべての必要なHTMLが作成される場合があります。


2
最高のプリプロダクションのenvと同じ可能な限り地元のenvを持っているだろう
フラ

それが今私がやっていることですが、簡単ではありません。私たちは20以上のサードパーティのモジュールを持っていますし、そのうちのいくつかはプリプロダクション環境で動作せず、開発者はコードをチェックしています。
ヤロスラフ

4
私は非常にあまりにもローカライズされたとして閉鎖するためのフラグが付けされているこの質問の背後にある理由を知りたいです。この質問は、一般的なレイアウトのデバッグに関するものです。これは、まだ行っていない場合、非常に有用であり、広く応用できます。
ベンマークス

私も興味があります。しかし、結果として、他の人が何度か編集した後、自分の非常にローカライズされた問題を解決しようとしているように見えることがあると思います。確かに私はそうですが、同時に、レイアウト生成プロセスをデバッグすることで、エラーの場所を見つけることができることを望んでいます。したがって、このソリューションは他の人にとっても有用です。
ヤロスラフ

回答:


55

ブロックの生成に使用されるコンパイル済みレイアウトXMLディレクティブをログに記録できます。にオブザーバーを作成controller_action_layout_generate_blocks_beforeし、オブザーバーメソッドで、転送されたレイアウトオブジェクトから更新XMLを記録します。

public function logCompiledLayout($o)
{
    $req  = Mage::app()->getRequest();
    $info = sprintf(
        "\nRequest: %s\nFull Action Name: %s_%s_%s\nHandles:\n\t%s\nUpdate XML:\n%s",
        $req->getRouteName(),
        $req->getRequestedRouteName(),      //full action name 1/3
        $req->getRequestedControllerName(), //full action name 2/3
        $req->getRequestedActionName(),     //full action name 3/3
        implode("\n\t",$o->getLayout()->getUpdate()->getHandles()),
        $o->getLayout()->getUpdate()->asString()
    );

    // Force logging to var/log/layout.log
    Mage::log($info, Zend_Log::INFO, 'layout.log', true);
}

出力は次のようになります。

2013-01-23T16:24:26+00:00 INFO (6): 
Request: cms
Full Action Name: cms_index_index
Handles:
    default
    cms_page
    STORE_default
    THEME_frontend_default_default
    cms_index_index
    page_two_columns_right
    customer_logged_out
Update XML:
<block name="formkey" type="core/template" template="core/formkey.phtml"/>
<label>All Pages</label>
<!-- ... ->

役立つと思われる、明日最初の1時間で試してみる
ヤロスラフ

あなたの答えは正しいもので、まさに私が探していたものです。作成されたログは、ページのロード時にすべてのハンドル、リクエストなどを出力します。ハンドルがメインハンドル配列に正しくロードされていることを確認しましたが、何らかの理由で対応するブロックがロード/表示されません。
ヤロスラフ

1
そしてレイアウトが除外されたため、トラブルシューティングが容易になるはずです:-)。
ベンチマーク

これをAction.phpファイルに入れていると思いますか?また、これはmagentoによってどのように呼び出されていますか?
メトロポリス

「オブザーバーを作成controller_action_layout_generate_blocks_before -これはM1の質問です。
ベンマーク

23

これを行うことで、コントローラーのすべてのレイアウトハンドルを取得できます。

var_dump($this->getLayout()->getUpdate()->getHandles());

または、これを使用して(レイアウトが初期化されている限り)どこでも:

var_dump(Mage::app()->getLayout()->getUpdate()->getHandles());

おそらくそれはデバッグに役立ちます。

編集

config.xmlを設定してブロッククラスを指定しましたか?

    <blocks>
        <banners>
            <class>My_Banners_Block</class>
        </banners>
    </blocks>

両方ともテストされ、私のハンドルはオブザーバーメソッドに正しく追加されますが、レイアウトは読み込まれません。私はいくつかのコードで私の質問を更新します、多分それは助けになるでしょう。
ヤロスラフ

@Yaroslavは私の答えを更新しました
リック

はい、構成にそれがあります。質問を更新します。
ヤロスラフ

@Yaroslavブロックタイプをに変更するときにproduct.phtmlがロードされるかどうかを確認できますcore/templateか?これは、モジュール設定のエラーをキャンセルするためのものです。
リックカイ

1
@Yaroslavは、問題が少し広すぎて、stackexchangeでここでデバッグするのが難しいようです。何が問題を引き起こす可能性があるかは、私にはあまり明確ではありません。
リックカイパーズ

12

私はPhpStormをMagicentoで使用しているので、@ benmarksを自分の使用方法に合わせて最適なものにすると思いました。

PhpStormで、app/code/core/Mage/Core/Controller/Varien/Action.phpmethodにブレークポイントを開いて配置しgenerateLayoutBlocks()ます。ポイントは以前にどこにでも挿入することだと思います$this->getLayout()->generateBlocks();。私は前の行にそれを置きます。

ブレークポイントを挿入した後(行番号の左側の赤い点で示されます)、右クリックして動作をカスタマイズできます。下部の[その他]をクリックして、すべてのオプションを開きます。 ここに画像の説明を入力してください

それを開いたら、「コンソールにメッセージを記録する」(オプション)と「評価された式を記録する」(魔法が発生する)のボックスをチェックします。次に、このbenmarkのコードの適応をテキストボックスにコピーして貼り付けます。私が変更した唯一のものは、スペルアウトされた$requestとして変数をMage::app()->getRequest()毎回、および変更$oに変数を$this(ここではオブザーバーコンテキストではありませんよB / C)。

sprintf("\nRequest: %s\nFull Action Name: %s_%s_%s\nHandles:\n\t%s\nUpdate XML:\n%s",Mage::app()->getRequest()->getRouteName(),Mage::app()->getRequest()->getRequestedRouteName(),Mage::app()->getRequest()->getRequestedControllerName(),Mage::app()->getRequest()->getRequestedActionName(),implode("\n\t",$this->getLayout()->getUpdate()->getHandles()),$this->getLayout()->getUpdate()->asString())

そのため、次のようになります。 ブレークポイントの詳細設定を示す画像

(xdebugまたはzendデバッガーを使用して)プログラムを実行した後、ブレークポイントで停止し、ログでこれを確認します。

Update XML:
<block name="formkey" type="core/template" template="core/formkey.phtml"/>
<label>All Pages</label>
<block type="page/html" name="root" output="toHtml" template="page/2columns-left.phtml">
   <block type="page/html_head" name="head" as="head">
      <action method="addJs">
         <script>jquery/jquery-migrate-1.2.1.min.js</script>
      </action>
      <action method="addJs">
         <script>jquery/jquery-ui/jquery-ui.min.js</script>
      </action>
      <action method="addJs">
         <script>prototype/prototype.js</script>
      </action>
      <action method="addJs" ifconfig="dev/js/deprecation">
         <script>prototype/deprecation.js</script>
      </action>
      <action method="addJs">
         <script>lib/ccard.js</scrip

決定される可能性がありますログエントリのサイズ制限があるようですidea.cycle.buffer.size内のプロパティidea.propertiesによると、PhpStorm用のファイルこれ。変更するか、コードウィンドウを右クリックしてドロップダウンメニューから[式の評価]を選択し、コードをコピーして貼り付けて実行すると、完全な出力が得られます。

[式の評価]ポップアップで、結果を右クリック(Windows)し、[値のコピー]を選択して出力全体を取得し、分析のために別の場所に貼り付けることができます。

PhpStorm-式の評価ポップアップからコピー


5

Alan StormのCommerce Bug拡張機能を使用します。これは、レイアウトの問題など、Magentoのさまざまなことをデバッグするために不可欠です。レイアウトの場合、各ページでアクティブなレイアウトハンドルと、ページに適用されているレイアウトxml構成を確認できます。

無料ではありませんが、これらの種類のデバッグの時間を大幅に節約できます。

注:私は、Alan StormやCommerce Bugとは一切関係ありません。ただの幸せなお客様です。


9
私はアランストームと提携しています(私は彼です)が、コマースバグ2ではレイアウトの有向グラフダイアグラムを作成することもできます。alanstorm.com/find_magento_block_name
アランストーム

また、Alan Stormコマースバグの幸せなお客様です。しかし、これらの問題が発生しているシステムにはインストールされておらず、すべてのテストおよび運用前システムに十分なライセンスがありません。ちなみに、@ AlanStorm、Commerce Bug 2の更新プログラムを入手できますか?
ヤロスラフ

1
@Yaroslav問い合わせサポートは、私たちは、あなたが更新を整理得るだろうとアップグレードpulsestorm.net/contact-us
アラン・ストーム

3

ありがとう、ベン・マークス!これは、あなたが記述したxmlレイアウトロガーの私のバージョンです。

非常に長いファイルなので、XMLを作成しました... :-)通常のエディターで開くことができます。

    <?php

class Gn_Optimization_Model_Debug_Layout {
  public function logCompiledLayout($o) {
    $req = Mage::app()->getRequest();

    $routeName = $req->getRouteName();
    $fullname = $req->getRequestedRouteName() . '_' . $req->getRequestedControllerName() . '_' . $req->getRequestedActionName();

    $info = sprintf(
      "\nRequest: %s\nFull Action Name: %s\nHandles:\n\t%s\n",
      $routeName, $fullname, implode("\n\t", $o->getLayout()->getUpdate()->getHandles())
    );

    Mage::log($info, Zend_Log::DEBUG, 'debug.'.$routeName.'.layout.log', true);
    file_put_contents(Mage::getBaseDir('log').DS.'debug.'.$routeName.'.layout.xml',
                      '<?xml version="1.0" encoding="utf-8"?>'.PHP_EOL
                      .'<layout>'.PHP_EOL.
                      $o->getLayout()->getUpdate()->asString().
                      '</layout>');
  }
}

そして、私のconfig.xmlはノードでこのように見えます:

<events>
  <controller_action_layout_generate_blocks_before>
    <observers>
      <gn_optimization_controller_action_layout_generate_blocks_before>
        <type>singleton</type>
        <class>gn_optimization/debug_layout</class>
        <method>logCompiledLayout</method>
      </gn_optimization_controller_action_layout_generate_blocks_before>
    </observers>
  </controller_action_layout_generate_blocks_before>
</events>

さて、デザイナーがこのすべてを説明できることを願っています... \ o /


0

これをコントローラーアクションに追加できます。var_dumpよりも適切な方法でハンドルを表示します。

Zend_Debug::dump($this->getLayout()->getUpdate()->getHandles());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.