ডিবাগিং লেআউট এক্সএমএল লোড হচ্ছে


36

টিএল; ডিআর: আমি কি লেআউটটি লোডিং ডিবাগ করতে পারি এমন কোনও উপায় আছে? যেহেতু আমি বিশ্বাস করি যে একটি মডিউলের লেআউট অন্যটির সাথে বিরোধী।

আমি তৈরি একটি পূর্ববর্তী প্রশ্নের সাথে সম্পর্কিত: সমস্ত থিমগুলিতে দেখানোর জন্য একটি মডিউল লেআউট কীভাবে তৈরি করা যায়

আমি আমার স্থানীয় পরীক্ষার পরিবেশে সফলভাবে আমার মডিউলটি লোড করেছি (ওরফে আমার বিকাশ পিসি), 3 টি ভিন্ন থিমের মধ্যে স্যুইচিং পরীক্ষা করা হয়েছে এবং এটি ঠিক আছে। তারপরে আমি টেস্ট বা আমাদের "প্রাক-উত্পাদন" পরিবেশের মডিউলটি আপডেট করেছিলাম, যেখানে প্রচুর আলাদা মডিউল রয়েছে, আমাদের মালিকানাধীন কিছু মালিকানাধীন। এই পরিবেশে, মডিউলটি পণ্যের সম্মুখ পৃষ্ঠায় কী প্রয়োজন তা দেখায় না। কিছু পরীক্ষার পরে, অবশেষে আমি এই সিদ্ধান্তে পৌঁছেছি যে সমস্যাটি লেআউট লোড প্রক্রিয়াতে হওয়া উচিত।

সুতরাং, লেআউটটি লোডিংয়ের কোনও উপায় আমি কীভাবে করতে পারি, কীভাবে বিভিন্ন মডিউলগুলি তাদের নিজস্ব ব্লকগুলি প্রতিস্থাপন বা যুক্ত করতে পারে? আমার বক্তব্যটি হ'ল আমি বিশ্বাস করি যে কমপক্ষে একটি মডিউল রয়েছে যা আমার সাথে বিরোধী হওয়া উচিত। এবং যেহেতু আমাদের অনেকগুলি মডিউল রয়েছে আমি মডিউলগুলিকে একে একে অক্ষম করার জন্য ভিন্ন পদ্ধতির সন্ধান করছি এবং দেখুন সমস্যাটি কোনটি।

আমার কনফিগারেশন। এক্সএমএল ফাইলটি হ'ল:

<?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মৃত্যুদন্ড কার্যকর করা হয় না এবং নেই যেখানে সব প্রয়োজনীয় এইচটিএমএল তৈরি করা হয়।


2
স্থানীয় এনভিউ যতটা সম্ভব প্রাক-উত্পাদনের এনভির মতোই হওয়া ভাল
ফ্রেং

এটি এখনই আমি যা করছি, তবে এটি সহজ নয়, আমাদের ২০ টিরও বেশি তৃতীয় পক্ষের মডিউল রয়েছে এবং তাদের মধ্যে কিছু প্রি-প্রোডাকশন পরিবেশে কাজ করে না এবং তাদের বিকাশকারীরা কোডটি পরীক্ষা করছে।
ইয়ারোস্লাভ

4
এই প্রশ্নটি খুব স্থানীয় হিসাবে বন্ধ হওয়ার জন্য পতাকাঙ্কিত হওয়ার পিছনে কারণগুলি জানতে পেরে আমি খুব আগ্রহী। প্রশ্নটি সাধারণ বিন্যাস ডিবাগিংয়ের সাথে কথা বলে, যা যদি আপনি না করেন তবে বেশ কার্যকর এবং ব্যাপকভাবে প্রয়োগযোগ্য applic
23'9 এ বেনমার্কগুলি

আমিও কৌতুহলী। তবে আমি মনে করি এটির ফলস্বরূপ হতে পারে যে অন্যদের বেশ কয়েকটি সম্পাদনার পরে মনে হয় যে আমি কেবল আমার নিজের স্থানীয় সমস্যাটি সমাধান করার চেষ্টা করছি। এবং প্রকৃতপক্ষে আমি আছি তবে একই সাথে আমি এখনও আশা করি যে লেআউট তৈরির প্রক্রিয়াটি ডিবাগ করে আমি আমার ত্রুটিটি কোথায় রয়েছে তা সন্ধান করতে সক্ষম হব। সুতরাং সমাধানটি অন্যদের জন্য কার্যকর হবে।
ইয়ারোস্লাভ

উত্তর:


55

আপনি সংকলিত বিন্যাস এক্সএমএল নির্দেশগুলি লগ করতে পারেন যা ব্লক তৈরি করতে ব্যবহৃত হয়। এতে একটি পর্যবেক্ষক তৈরি করুন controller_action_layout_generate_blocks_beforeএবং পর্যবেক্ষক পদ্ধতিতে পরিবহন বিন্যাসের বস্তু থেকে আপডেট এক্সএমএল লগ করুন:

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
আর যে এখন সমস্যা নিবারণ করার জন্য যে বিন্যাস থেকে বাদ পড়েছেন :-) সহজ হওয়া উচিত।
বেনমার্কস

আমি ধরে নিচ্ছি যে আপনি এটি অ্যাকশন.এফপি ফাইলের মধ্যে রেখেছেন? এছাড়াও, ম্যাজেন্টো দ্বারা এটি কীভাবে ডাকা হচ্ছে?
মহানগর

"এতে একটি পর্যবেক্ষক তৈরি করুন 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>

উভয়ই পরীক্ষিত, আমার হ্যান্ডেলটি পর্যবেক্ষক পদ্ধতিতে সঠিকভাবে যুক্ত করা হয়েছে তবে তারপরে বিন্যাসটি লোড হয় না। আমি আমার কোডটি কিছু কোড দিয়ে আপডেট করব, সম্ভবত এটি সাহায্য করবে।
ইয়ারোস্লাভ

@ ইয়ারোস্লাভ আমার উত্তর আপডেট করেছে
রিক কুইপার্স

হ্যাঁ, আমার এটি কনফিগারেশনে রয়েছে, আমার প্রশ্নটি আপডেট করবে।
ইয়ারোস্লাভ

@ ইয়ারোস্লাভ আপনি কি পরীক্ষা করতে পারবেন ব্লকের ধরণটি পরিবর্তন করার সময় product.phtml লোড হয়ে যায় কিনা core/template? এটি কেবল আপনার মডিউল সেটিংসে ত্রুটিগুলি বাতিল করার জন্য।
রিক কুইপার্স

1
@ ইয়ারোস্লাভ দেখে মনে হচ্ছে সমস্যাটি কিছুটা ব্যাপকভাবে ছড়িয়ে গেছে এবং স্ট্যাকেক্সচেঞ্জে এখানে ডিবাগ করা বেশ কঠিন। কী কারণে সমস্যার কারণ হতে পারে তা আমার কাছে খুব স্পষ্ট নয়।
রিক কুইপার্স

12

আমি ম্যাজিকেন্টোর সাথে পিএইচপিস্টোরম ব্যবহার করছি এবং তাই আমি ভেবেছিলাম যে আমি আমার ব্যবহারের @ উত্তরমার্কগুলিকে দুর্দান্ত উত্তরটি মানিয়ে নেব।

পিএইচপিস্টোরমে, খুলুন app/code/core/Mage/Core/Controller/Varien/Action.phpএবং পদ্ধতিতে একটি ব্রেক পয়েন্ট দিন generateLayoutBlocks()। আমি মনে করি বিন্দুটি এটি আগে যে কোনও জায়গায় .োকানো $this->getLayout()->generateBlocks();। আমি এটি আগের লাইনে রেখেছি।

লাইন নম্বর দ্বারা বামদিকে লাল বিন্দু দ্বারা চিহ্নিত ব্রেক ব্রেকপয়েন্ট .োকানোর পরে, আচরণটি কাস্টমাইজ করতে আপনি ডানদিকে ক্লিক করতে পারেন। সমস্ত বিকল্প খোলার জন্য নীচে "আরও" ক্লিক করুন। এখানে চিত্র বর্ণনা লিখুন

একবার আপনি এটি খুললে, আপনি "লগ মেসেজ টু কনসোল" (alচ্ছিক) এবং "লগ মূল্যায়িত এক্সপ্রেশন" (যেখানে যাদুটি ঘটে) এর জন্য বাক্সটি চেক করুন। তারপরে বেনমার্কের কোডটির এই অভিযোজনটি পাঠ্য বাক্সে অনুলিপি করুন। আমি পরিবর্তিত একমাত্র জিনিসটি প্রতিবারের মতো $requestচলকটি বানান করা এবং ভেরিয়েবলটি পরিবর্তন করা (খ / সি আমরা এখানে পর্যবেক্ষক প্রসঙ্গে নেই)।Mage::app()->getRequest()$o$this

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())

সুতরাং এখন এটির মতো দেখাচ্ছে: চিত্র উন্নত ব্রেকপয়েন্টের সেটিংস দেখায়

আপনি প্রোগ্রামটি চালানোর পরে (এক্সডিবাগ বা জেন্ড ডিবাগার ব্যবহার করে) ব্রেকআপপয়েন্টে থামবেন এবং লগটিতে এটি দেখতে পাবেন:

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

আমরা অ্যালান স্টর্মের বাণিজ্য ত্রুটি এক্সটেনশন ব্যবহার করি এবং লেআউট ইস্যু সহ ম্যাজেন্টোতে বিভিন্ন জিনিস ডিবাগ করার জন্য এটি অপরিহার্য বলে মনে করি। বিন্যাসগুলির জন্য আপনি প্রতিটি পৃষ্ঠায় কোন বিন্যাসের হ্যান্ডলগুলি সক্রিয় রয়েছে তা এবং পৃষ্ঠায় কোন বিন্যাসের এক্সএমএল কনফিগারেশন প্রয়োগ করা হচ্ছে তা দেখতে পাবেন।

এটি নিখরচায় নয়, তবে এই ধরণের জিনিস ডিবাগ করার জন্য প্রচুর সময় সাশ্রয় হবে।

দ্রষ্টব্য: আমি কোনওভাবেই অ্যালান স্টর্ম বা বাণিজ্য বাগের সাথে যুক্ত নই, কেবল একজন সুখী গ্রাহক।


9
আমি অ্যালান স্টর্মের সাথে অনুমোদিত (এটিতে আমিই তিনি), এবং কেবল এটি চিহ্নিত করতে চেয়েছিলাম যে কমার্স বাগ 2 আপনাকে আপনার বিন্যাসগুলির একটি নির্দেশিত গ্রাফ চিত্রটি তৈরি করার ক্ষমতাও দেয়। alanstorm.com/find_magento_ block_name
অ্যালান ঝড়

আমরা অ্যালান স্টর্ম বাণিজ্য বাগেরও খুশি গ্রাহক। তবে যে সিস্টেমে আমি এই সমস্যাগুলি নিয়ে আসছি সেগুলিতে এটি ইনস্টল করা হয়নি এবং সমস্ত পরীক্ষা এবং প্রাক-উত্পাদন সিস্টেমের জন্য আমাদের পর্যাপ্ত লাইসেন্স নেই। এবং যাইহোক, @ অ্যালানস্টর্ম, হাই আমরা বাণিজ্য বাগ 2 এর জন্য আপডেটটি পেতে পারি?
ইয়ারোস্লাভ

1
@ ইয়ারোস্লাভ যোগাযোগের সমর্থন এবং আমরা আপনাকে আপডেট ও আপগ্রেডগুলি পালসস্টর্ম.নেট / যোগাযোগ করুন
অ্যালান স্টর্ম

3

থানেক্স বেন মার্কস! এটি আপনার বিস্মৃত 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>');
  }
}

এবং আমার কনফিগার.এক্সএমএল চেহারাটি নোডের মতো:

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