डिबगिंग लेआउट XML लोड हो रहा है


36

TL; DR: एक ऐसा तरीका है जिससे मैं लेआउट के लोडिंग को डीबग कर सकता हूं? जैसा कि मेरा मानना ​​है कि एक मॉड्यूल का लेआउट दूसरे के साथ विरोध कर रहा है।

मेरे द्वारा किए गए एक पिछले प्रश्न से संबंधित: सभी विषयों पर दिखाए जाने वाले मॉड्यूल लेआउट कैसे बनाएं

मैंने अपने मॉड्यूल को अपने स्थानीय परीक्षण वातावरण (उर्फ मेरा विकास पीसी) पर सफलतापूर्वक लोड किया है, 3 अलग-अलग विषयों के बीच स्विचिंग का परीक्षण किया है और यह ठीक है। तब हमने परीक्षण या "पूर्व-उत्पादन" वातावरण पर मॉड्यूल को अपडेट किया, जहां हमारे पास बहुत सारे अलग-अलग मॉड्यूल हैं, कुछ मालिकाना अन्य जो हमारे द्वारा बनाए गए हैं। इस माहौल पर, मॉड्यूल यह नहीं दिखाता है कि उत्पाद के फ्रंटपेज पर क्या आवश्यक है। कुछ परीक्षणों के बाद, मैं अंत में इस निष्कर्ष पर पहुंचा हूं कि समस्या लेआउट लोड प्रक्रिया पर होनी चाहिए।

तो, क्या कोई ऐसा तरीका है जिससे मैं लेआउट के लोडिंग को डिबग कर सकता हूं, कैसे विभिन्न मॉड्यूल अपने स्वयं के ब्लॉक को बदलते हैं या जोड़ते हैं? मेरा कहना यह है कि मेरा मानना ​​है कि कम से कम एक मॉड्यूल है जो मेरे साथ परस्पर विरोधी होना चाहिए। और जैसा कि हमारे पास बहुत सारे मॉड्यूल हैं, मैं एक-एक करके मॉड्यूल को अक्षम करने के लिए एक दृष्टिकोण की तलाश कर रहा हूं और देखें कि समस्याग्रस्त कौन है।

मेरी 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>। यह भी काम किया।

मेरा उत्पाद। Phtml फ़ाइल:

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

product.phtmlफ़ाइल लोड किया जाता है नहीं है और इसलिए showCampaignमार डाला नहीं है और वहाँ है, जहां सभी आवश्यक HTML बनाई गई है।


2
सबसे अच्छा यह होगा कि स्थानीय एनवी जितना संभव हो उतना ही प्री-प्रोडक्शन एनवी
फ्रा

यह वही है जो मैं अभी कर रहा हूं, लेकिन यह आसान नहीं है, हमारे पास 20 से अधिक तृतीय-पक्ष मॉड्यूल हैं और यहां तक ​​कि उनमें से कुछ भी पूर्व-उत्पादन पर्यावरण पर काम नहीं करते हैं और उनके डेवलपर (कोड) कोड की जांच कर रहे हैं।
यारोस्लाव

4
इस सवाल के पीछे के कारणों को जानने के लिए मैं बहुत उत्सुक हूं क्योंकि इसे बहुत अधिक स्थानीय बनाया गया है। प्रश्न सामान्य लेआउट डिबगिंग से बात करता है, जो यदि आपने नहीं किया है, तो काफी उपयोगी और मोटे तौर पर लागू होता है।
20

मैं भी उत्सुक हूँ। लेकिन मुझे लगता है कि यह एक परिणाम के रूप में हो सकता है कि दूसरों को कई संपादन के बाद लगता है कि मैं अपनी बहुत ही स्थानीय समस्या को हल करने की कोशिश कर रहा हूं। और वास्तव में मैं हूं, लेकिन साथ ही मुझे अभी भी उम्मीद है कि लेआउट पीढ़ी की प्रक्रिया को डीबग करने से मैं यह पता लगा सकूंगा कि मेरी त्रुटि कहां है। इसलिए समाधान दूसरों के लिए उपयोगी होगा।
यारोस्लाव

जवाबों:


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
और उस समस्या का निवारण करना आसान होना चाहिए, जिसमें लेआउट को खारिज कर दिया गया है :-)।
बेंचमार्क

मैं मान रहा हूँ कि आप इसे Action.php फ़ाइल के अंदर डाल रहे हैं? इसके अलावा, यह कैसे Magento द्वारा कहा जा रहा है?
महानगर

"एक पर्यवेक्षक बनाएं controller_action_layout_generate_blocks_before" - यह एक एम 1 प्रश्न है।
बेंच

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 क्या आप जांच कर सकते हैं कि ब्लॉक के प्रकार को बदलते समय product.phtml लोड हो जाता है core/template? यह आपके मॉड्यूल सेटिंग्स में त्रुटियों को रद्द करने के लिए है।
रिक कुइपर्स

1
@ यारोस्लाव ऐसा लगता है कि समस्या थोड़ी बहुत व्यापक रूप से फैली हुई है और स्टैकएक्सचेंज पर यहां डिबग करना मुश्किल है। यह मेरे लिए बहुत स्पष्ट नहीं है कि इस मुद्दे का क्या कारण हो सकता है।
रिक कुइपर्स

12

मैं Magicento के साथ PhpStorm का उपयोग कर रहा हूं और इसलिए मुझे लगा कि मैं अपने उपयोग के लिए @benmark के शानदार उत्तर को अनुकूलित करूंगा।

PhpStorm में, app/code/core/Mage/Core/Controller/Varien/Action.phpविधि में एक विराम बिंदु खोलें और डालें generateLayoutBlocks()। मुझे लगता है कि बिंदु को पहले कहीं भी सम्मिलित करना है $this->getLayout()->generateBlocks();। मैंने इसे पिछली पंक्ति में रखा।

ब्रेकपॉइंट डालने के बाद, लाइन नंबर के बाईं ओर लाल बिंदु द्वारा इंगित किया गया, आप व्यवहार को अनुकूलित करने के लिए इसे राइट क्लिक कर सकते हैं। सभी विकल्प खोलने के लिए नीचे "अधिक" पर क्लिक करें। यहाँ छवि विवरण दर्ज करें

एक बार जब आप इसे खोलते हैं, तो आप "लॉग मैसेज टू कंसोल" (वैकल्पिक) और "लॉग मूल्यांकन अभिव्यक्ति" (जहां जादू होता है) के लिए बॉक्स की जांच करें। फिर टेक्स्ट बॉक्स में बुकमार्क कोड के इस अनुकूलन को कॉपी पेस्ट करें। केवल एक चीज जिसे मैंने बदला है, $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 के लिए फ़ाइल इस । आप इसे बदल सकते हैं, या कोड विंडो पर राइट क्लिक कर सकते हैं और ड्रॉपडाउन मेनू से "मूल्यांकन का मूल्यांकन करें" चुनें, और वहां निष्पादित करने के लिए कोड को कॉपी और पेस्ट करें और आपको पूर्ण आउटपुट मिलेगा।

"मूल्यांकन का मूल्यांकन" पॉप-अप में, आप परिणाम पर राइट-क्लिक (विंडोज) कर सकते हैं और संपूर्ण आउटपुट प्राप्त करने और विश्लेषण के लिए इसे कहीं और पेस्ट करने के लिए "कॉपी मान" चुनें।

PhpStorm - मूल्यांकन पॉपअप से कॉपी


5

हम एलन स्टॉर्म के कॉमर्स बग एक्सटेंशन का उपयोग करते हैं , और इसे Magento में लेआउट मुद्दों सहित विभिन्न चीजों को डिबग करने के लिए अपरिहार्य पाते हैं। लेआउट के लिए आप देख सकते हैं कि प्रत्येक पृष्ठ पर कौन से लेआउट हैंडल सक्रिय हैं, और पृष्ठ पर कौन से लेआउट xml कॉन्फ़िगरेशन लागू किए जा रहे हैं।

यह मुफ़्त नहीं है, लेकिन इस प्रकार की चीज़ों को डीबग करने में बहुत समय बचाएगा।

नोट: मैं एलन स्टॉर्म या कॉमर्स बग से किसी भी तरह से संबद्ध नहीं हूं, सिर्फ एक खुश ग्राहक।


9
मैं एलन स्टॉर्म (जिसमें मैं वह हूं) के साथ संबद्ध हूं, और बस यह बताना चाहता हूं कि कॉमर्स बग 2 आपको अपने लेआउट के एक निर्देशित ग्राफ आरेख का उत्पादन करने की क्षमता भी देता है। alanstorm.com/find_magento_block_name
एलन स्टॉर्म

हम एलन स्टॉर्म कॉमर्स बग के खुश ग्राहक भी हैं। लेकिन उस सिस्टम पर जहां मैं इन मुद्दों को स्थापित कर रहा हूं, यह स्थापित नहीं है और हमारे पास सभी परीक्षण और पूर्व-उत्पादन प्रणालियों के लिए पर्याप्त लाइसेंस नहीं है। और वैसे भी, @AlanStorm, hoy हमें कॉमर्स बग 2 के लिए अपडेट मिल सकता है?
यारोस्लाव

1
@ यारोस्लाव संपर्क समर्थन और हम आपको अपडेट और उन्नयन के साथ हल करेंगे 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());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.