Hata ayıklama düzeni XML yükleme


36

TL; DR: mizanpajın yüklenmesinde hata ayıklayabilmemin bir yolu var mı? Bir modülün düzeninin bir başkasıyla çelişkili olduğuna inandığım gibi

Yaptığım bir önceki soru ile ilgili: Tüm temalarda gösterilecek bir modül düzeni nasıl yapılır ?

Modülümü yerel test ortamıma (yani geliştirme bilgisayarım) başarıyla yükledim, 3 farklı tema arasında geçiş yaptım ve sorun yok. Daha sonra sahip olduğumuz çok sayıda farklı modülün yer aldığı test veya "üretim öncesi" ortamındaki modülü güncelledik. Bu ortamda, modül ürünün ön sayfasında neyin gerekli olduğunu göstermiyor. Bazı testlerden sonra nihayet sorunun yerleşim yükü sürecinde olması gerektiği sonucuna vardım.

Öyleyse, mizanpajın yüklenmesinde hata ayıklayabileceğim, farklı modüllerin kendi bloklarını ne şekilde değiştireceği veya ekleyebileceğim bir yolu var mı? Demek istediğim, benimkiyle çelişmesi gereken en az bir modül olduğuna inanıyorum. Çok fazla modülümüz olduğu için, modülleri tek tek devre dışı bırakmaktan ve hangisinin sorunlu olduğunu görmekten farklı bir yaklaşım arıyorum.

Config.xml dosyam şudur:

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

Gözlemcim dosyası:

<?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;
      ....
      ....
}

Bu benim düzen dosyam:

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

Önceden <default></default>bende yerine biraz farklı bir tane vardı <Product_Campaign_Banner></Product_Campaign_Banner>. Aynı zamanda çalıştı.

Product.phtml dosyam:

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

product.phtmlDosya yüklü değil ve bu nedenle showCampaignyerine getirilmez ve tüm gerekli HTML oluşturulur nerede vardır.


2
En iyisi yerel Env'in Üretim Öncesi Env
Fra

Şu an bunu yapıyorum, ama kolay değil, 20'den fazla üçüncü taraf modülümüz var ve hatta bazıları üretim öncesi ortamda çalışmaz ve geliştiricileri kodları kontrol eder.
Yaroslav

4
Bu sorunun arkasındaki neden çok yerelleştirilmiş olarak kapatılmasının işaretlendiğinin nedenlerini bilmek çok merak ediyorum . Soru, yapmazsanız oldukça kullanışlı ve kapsamlı bir uygulama olan genel mizanpaj hata ayıklama ile ilgilidir.
Benmarks

Ben de merak ediyorum. Ancak bunun sonucunda, başkaları için yapılan birkaç düzenlemeden sonra, yalnızca kendi çok yerel sorunumu çözmeye çalıştığımı düşünüyorum. Ve gerçekten öyleyim, ama aynı zamanda hala yerleşim oluşturma sürecini hata ayıklayarak hatamın nerede olduğunu bulabileceğimi umuyorum. Bu nedenle çözüm diğerleri için yararlı olacaktır.
Yaroslav

Yanıtlar:


55

Blok oluşturmak için kullanılan derlenmiş mizan XML yönergelerini kaydedebilirsiniz. Bir gözlemci oluşturun controller_action_layout_generate_blocks_beforeve gözlemci yönteminde, güncellediğiniz XML'i taşınan düzen nesnesinden günlüğe kaydedin:

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

Çıktı şuna benzer olacaktır:

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

Yararlı görünüyor, yarın ilk saatlerde deneyecek
Yaroslav

Cevabınız doğru olanı, tam aradığım şeydi. Oluşturulan günlük, sayfa yükündeki tüm tanıtıcıları, istekleri vb. Çıktılar. Sapımın ana tanıtıcı dizisine doğru bir şekilde yüklendiğini ancak bir nedenden ötürü ilgili bloğun yüklenmediğini / görüntülenmediğini onayladım.
Yaroslav

1
Ve bu düzeneğin ekarte edildiğini şimdi gidermek daha kolay olmalı :-).
Ocak'ta 13:13

Bunu Action.php dosyasının içine koyduğunuzu farz ediyorum? Ayrıca, buna Magento nasıl deniyor?
Metropolis,

"Bir gözlemci yarat controller_action_layout_generate_blocks_before" - Bu bir M1 sorusu.
benmarks

23

Bunu yaparak denetleyicinizdeki tüm düzen tutamaçlarını alabilirsiniz:

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

Bunu kullanarak veya herhangi bir yerde (düzen başlatıldığı sürece):

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

Belki bu hata ayıklamanıza yardımcı olur.

DÜZENLE

Config.xml dosyanızı blok sınıfını belirleyecek şekilde ayarladınız mı?

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

Her ikisi de test edildi, sapım gözlemci yöntemine doğru bir şekilde eklendi, ancak düzen yüklenmedi Sorumu bir kodla güncelleyeceğim, belki yardımı olabilir.
Yaroslav

@Yaroslav cevabımı güncelledi
Rick Kuipers

Evet, config üzerinde, sorumu güncelleyeceğim.
Yaroslav

@Yaroslav Blok tipini değiştirirken product.phtml'in yüklenip yüklenmediğini kontrol edebilir misiniz core/template? Bu sadece modül ayarlarınızdaki hataları iptal etmek içindir.
Rick Kuipers

1
@Yaroslav, problemin çok yaygın bir şekilde yayılmış ve yığın değişimi sırasında burada hata ayıklamak zor gibi görünüyor. Soruna neyin yol açabileceği bana çok açık değil.
Rick Kuipers

12

PhpStorm'u Magicento ile kullanıyorum ve bu yüzden @ benmarks kullanımım için harika bir cevap ayarlayacağımı düşündüm.

PhpStorm'da açın app/code/core/Mage/Core/Controller/Varien/Action.phpve metoda bir kırılma noktası yerleştirin generateLayoutBlocks(). Bence mesele daha önce herhangi bir yere yerleştirmek $this->getLayout()->generateBlocks();. Önceki satıra koydum.

Satır numarasıyla soldaki kırmızı nokta ile gösterilen kesme noktasını ekledikten sonra, davranışı özelleştirmek için sağ tıklayabilirsiniz. Tüm seçenekleri açmak için alttaki "Diğer" düğmesini tıklayın. görüntü tanımını buraya girin

Açtıktan sonra, "Konsola iletiyi günlüğe kaydet" (isteğe bağlı) ve "Değerlendirilen ifadeyi günlüğe yaz" (sihirin gerçekleştiği yer) kutusunu işaretleyin. Ardından, benmark kodunun bu uyarlamasını metin kutusuna yapıştırın. Değiştirdiğim tek şey $requestdeğişkeni Mage::app()->getRequest()her zaman olduğu gibi heceleyerek ve $odeğişkeni $this(b / c gözlemci bağlamında değiliz) olarak değiştirdim.

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

Yani şimdi şöyle görünüyor: Resim gelişmiş kesme noktası ayarlarını gösterir

Programı çalıştırdıktan sonra (xdebug veya zend debugger kullanarak) kesme noktasında durur ve bunu günlüğünde görürsünüz:

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

De belirlenebilmektedir kayıt girişleri için boyut sınırı var gibi görünüyor idea.cycle.buffer.sizemülkiyet idea.propertiesgöre PhpStorm için dosyanın bu . Bunu değiştirebilir veya kod penceresine sağ tıklayıp açılan menüden "İfadeyi Değerlendir" i seçebilir ve orada yürütmek için kodu kopyalayıp yapıştırabilir ve tam çıktı elde edersiniz.

"İfadeyi Değerlendir" açılır penceresinde, çıktının tamamını almak ve analiz için başka bir yere yapıştırmak için sonucu sağ tıklayın (Windows) ve "Değeri Kopyala" seçeneğini seçin.

PhpStorm - Evaluate Expression penceresinden kopyası


5

Alan Storm'un Commerce Bug uzantısını kullanıyoruz ve mizanpaj sorunları da dahil olmak üzere Magento'da çeşitli şeylerde hata ayıklamak için vazgeçilmez olduğunu düşünüyoruz. Düzenler için, her sayfada hangi düzen tutamaçlarının etkin olduğunu ve sayfaya hangi düzen xml yapılandırmalarının uygulandığını görebilirsiniz.

Ücretsiz değil, bu tür şeylerde hata ayıklamak için çok zaman kazandıracak.

Not: Alan Storm veya Commerce Bug ile herhangi bir şekilde bağlı değilim, sadece mutlu bir müşteri.


9
Alan Storm'a bağlıyım (içinde olduğum kişiyim) ve Commerce Bug 2'nin size düzenlerinizin yönlendirilmiş bir grafik diyagramı üretme yeteneği verdiğini de belirtmek istedim. alanstorm.com/find_magento_block_name
Alan Storm

Ayrıca Alan Storm ticaretinin müşterileriyiz. Ancak bu sorunları yaşadığım sistemde kurulu değil ve tüm test ve üretim öncesi sistemler için yeterli lisansımız yok. Ve bu arada, @AlanStorm, Hoy Commerce Bug 2 için güncelleme alabilir miyiz?
Yaroslav

1
@Yaroslav Destek ile iletişime geçin, sizi güncellemeler ve yükseltmeler ile sıralayalım
Alan Storm

3

Thanx Ben Marks! Bu benim yaptığım xml düzen günlüğünün versiyonudur.

Çok uzun bir dosya olduğundan XML'den çıkardım ... :-) Normal bir editörle açabilirsiniz ....

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

Ve config.xml görünümüm düğümde şöyle:

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

Şimdi, umarım tasarımcım bunların hepsini açıklayabilir ... \ o /


0

Bunu denetleyici işleminize ekleyebilirsiniz. Sapları var_dump'tan daha temiz bir şekilde gösterir.

Zend_Debug::dump($this->getLayout()->getUpdate()->getHandles());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.