Question

  

TL; DR: est-il un moyen que je peux déboguer le chargement de la mise en page? Comme je crois que la mise en page d'un module est en conflit avec un autre.

associés à une question précédente, je fait: Comment faire une mise en page du module à afficher sur tous les thèmes

Je l'ai chargé avec succès mon module sur mon environnement de test local (aka mon PC de développement), la commutation entre TESTE 3 thèmes différents et il est ok. Ensuite, je mis à jour le module sur l'environnement de test ou « pré-production », nous avons, là où il y a beaucoup de différents modules, un autre fait que nous propriétaire. Sur cet environnement, le module ne montre pas ce qui est nécessaire sur le frontpage produit. Après quelques testings, je suis finalement arrivé à la conclusion que le problème devrait être mis sur le processus de charge de la mise en page.

Alors, est-il un moyen que je peux déboguer le chargement de la mise en page, comment les différents modules remplaçons ou ajouter leurs propres blocs? Mon point est que je crois qu'il ya au moins un module qui devrait être en conflit avec le mien. Et comme nous avons tant de modules que je cherche une autre approche des modules invalidantes un par un et voir qui est la problématique.

Mon fichier config.xml est:

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

Mon fichier Observateur:

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

Ceci est mon fichier de mise en page:

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

avait déjà un peu différent où au lieu de <default></default> j'avais <Product_Campaign_Banner></Product_Campaign_Banner>. Il a également travaillé.

Mon fichier product.phtml:

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

Le fichier product.phtml n'est pas chargé et par conséquent le showCampaign est pas exécuté et il est là tout le code HTML nécessaire est créé.

Était-ce utile?

La solution

Vous pouvez enregistrer les directives XML de mise en page compilés qui sont utilisés pour générer des blocs. Créer un observateur controller_action_layout_generate_blocks_before, et la méthode d'observation log XML de mise à jour de l'objet de mise en page transporté:

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

Sortie sera similaire à:

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

Autres conseils

Vous pouvez récupérer toutes les poignées de mise en page dans votre contrôleur en faisant ceci:

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

Ou partout (tant que la mise en page a été initialisé) en utilisant ceci:

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

Peut-être vous aidera à debug.

EDIT

Avez-vous défini Config.xml pour spécifier la classe de bloc?

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

J'utilise PhpStorm avec Magicento et je pensais que j'adapterais @benmarks grande réponse à mon utilisation.

Dans PhpStorm, ouvrir app/code/core/Mage/Core/Controller/Varien/Action.php et mettre un point de rupture dans la méthode generateLayoutBlocks(). Je pense que le point est d'insérer partout avant $this->getLayout()->generateBlocks();. Je l'ai mis sur la ligne précédente.

Après avoir inséré le point d'arrêt, indiqué par le point rouge sur la gauche par le numéro de ligne, vous pouvez faire un clic droit pour personnaliser le comportement. Cliquez sur « Plus » en bas pour ouvrir toutes les options. entrer la description d'image ici

Une fois que vous ouvrez ce, vous cochez la case « Journal des messages à la console » (en option) et « Log a évalué l'expression » (où la magie se produit). Ensuite, copiez coller cette adaptation du code de Benmark dans la zone de texte. La seule chose que j'ai changé épelle la variable $request comme Mage::app()->getRequest() chaque fois, et a changé la variable $o à $this (b / c nous ne sommes pas dans le contexte d'observateur ici).

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

Alors maintenant, il ressemble à ceci: montre l'image réglages avancés

Après avoir exécuté le programme (en utilisant xdebug ou débogueur zend) vous arrêtez au point d'arrêt et de voir cela dans le journal:

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

Il semble y avoir une limite de taille pour les entrées du journal qui pourrait être déterminé par la propriété idea.cycle.buffer.size dans le fichier idea.properties pour PhpStorm, selon cette . Vous pouvez changer cela, ou tout simplement un clic droit sur la fenêtre de code et sélectionnez « Évaluer l'expression » dans le menu déroulant, puis copiez et collez le code à exécuter là-bas et vous obtiendrez la sortie complète.

Dans la « Évaluer l'expression », vous pouvez clic droit pop-up (Windows) sur le résultat et sélectionnez « Copier la valeur » pour obtenir toute la production et le coller ailleurs pour l'analyse.

 PhpStorm - copie de popup Évaluer l'expression

Nous utilisons Commerce Bug extension Alan Storm, et de trouver qu'il est indispensable pour le débogage une variété de choses dans Magento, y compris les questions de mise en page. Pour mises en page vous pouvez voir quels poignées de mise en page sont actifs sur chaque page, et qui mise en page des configurations XML sont appliquées à la page.

Il est pas libre, mais permettra d'économiser beaucoup de temps de débogage ce genre de choses.

Note:. Je ne suis pas affilié à Alan Tempête ou Bug Commerce de quelque façon, juste un client heureux

Thanx Ben Marks! Ceci est ma version de l'enregistreur de mise en page xml vous discribed.

Il est un fichier très long si je l'ai fait XML sortir ... :-) Vous pouvez ouvrir avec un éditeur normale ....

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

Et mon regard config.xml est comme ça dans le noeud:

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

Maintenant, j'espère que mon concepteur peut expliquer tout cela ... \ o /

Vous pouvez ajouter à votre action de contrôleur. Il montrera les poignées de manière plus nette que var_dump.

Zend_Debug::dump($this->getLayout()->getUpdate()->getHandles());
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top