Impossible d'obtenir la disposition ajax frontend personnalisée à charger

8

J'ai toujours du mal à identifier les poignées appropriées pour tout, alors soyez indulgent avec moi ici. J'ai parcouru Google, SE et essayé une myriade de variantes, sans succès. (Et oui, j'ai utilisé des techniques ici: débogage du chargement de mise en page , mais je ne sais pas quoi faire avec la sortie.

Le problème: le contrôleur se charge. La mise en page ne fonctionne pas.

Quand je visite la page à localhost/magento/mymodule/ajax/cart

Il fait écho «ICI!». Le var_dump des getLayouts génère:

array(4) { 
    [0]=> string(17) "mymodule_ajax_cart" 
    [1]=> string(13) "STORE_default" 
    [2]=> string(24) "THEME_frontend_theme_theme" 
    [3]=> string(19) "customer_logged_out" 
}

Le code

Contrôleur personnalisé:
app/code/local/mycompany/mymodule/controllers/AjaxController.php

class Mycompany_Mymodule_AjaxController extends Mage_Core_Controller_Front_Action
{
    public function cartAction() {
        echo 'HERE!';
        $this->loadLayout('mymodule_ajax_cart');
        var_dump($this->getLayout()->getUpdate()->getHandles());
        $this->renderLayout();
    }
}

Fichier de configuration:
app/code/local/mycompany/mymodule/etc/config.xml

<config>
    <modules>
        <mycompany_mymodule>
            <version>1.0.0</version>
        </mycompany_mymodule>
    </modules>
    <global>
        <helpers>
            <mymodule>  
                    <class>Mycompany_Mymodule_Helper</class>
                </mymodule>
        </helpers>
    </global>
    <frontend>
        <routers>
            <mymodule>
                <use>standard</use>
                <args>
                    <module>Mycompany_Mymodule</module>
                    <frontName>mymodule</frontName>
                </args>
            </mymodule>
        </routers>
        <layout>
            <updates>
                <mymodule>
                    <file>mymodule.xml</file>
                </mymodule>
            </updates>
        </layout>
    </frontend>
</config>

Fichier de mise en page à
app/design/frontent/base/default/layout/mymodule.xml

<?xml version="1.0"?>
    <layout>
        <mymodule_ajax>
            <block type="core/text_list" name="content" output="toHtml" as="content" />
        </mymodule_ajax>
        <mymodule_ajax_cart>
            <reference name="content">
                <block type="core/template" template="mymodule/ajaxcart.phtml" />
            </reference>
        </mymodule_ajax_cart>
    </layout>

Et enfin, le fichier modèle à
app/design/frontend/theme/theme/template/mymodule/ajaxcart.phtml

<div style="border: 2px solid red">
    Hello world
</div>

S'il vous plaît donnez votre avis. Je sais que je manque quelque chose d'évident, mais je ne peux pas le trouver pour la vie.

random_user_name
la source
1
Ne devriez-vous pas utiliser le mycompany_mymodulepréfixe dans chaque poignée? ( mycompany_mymodule_ajaxpar exemple).
Niloct
@Nicolt - merci pour le commentaire. Cela peut très bien être le problème - lorsque vous dites "Chaque poignée" - où voyez-vous spécifiquement qu'il n'est pas utilisé qu'il devrait être utilisé? Faites-vous référence au fichier xml de mise en page? Les tutoriels / articles que j'ai lus ne précisent pas comment ils doivent être nommés, d'où les poignées que j'ai publiées.
random_user_name
@Niloct - juste pour attirer votre attention, j'ai mal orthographié votre poignée plus tôt. Veuillez voir mon commentaire ci-dessus.
random_user_name
Eh bien, vous déclarez d'abord le module avec mycompany_mymodule(première poignée). Chaque balise xml qui a le préfixe mymodulesans le mycompany_préfixe est mauvaise à mon humble avis. Vous devez modifier tous les noms de balises pour avoir le préfixe mycompany_avant mymodule.
Niloct

Réponses:

18

Pour créer un retour de mise en page Ajax simple, essayez de mettre à jour votre code comme suit:

Mettez à jour votre contrôleur pour utiliser loadLayout (false); cela empêchera l'ajout de la poignée de présentation "par défaut".

$this->loadLayout(false);
$this->renderLayout();

Ensuite, vous pouvez mettre à jour votre XML de mise en page en ajoutant simplement le modèle que vous souhaitez. Vous aurez besoin des éléments suivants pour que magento produise réellement quoi que ce soitname="root" output="toHtml"

<?xml version="1.0"?>
<layout>
    <mymodule_ajax_cart>
        <block type="core/template" name="root" output="toHtml" template="mymodule/ajaxcart.phtml" />
    </mymodule_ajax_cart>
</layout>

Pour une "réponse simple" complète qui sera accessible sous /ajaxtest/index/indexvous pouvez faire ce qui suit:

/app/etc/modules/Custom_Ajax.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Custom_Ajax>
            <active>true</active>
            <codePool>local</codePool>
        </Custom_Ajax>
    </modules>
</config>

/app/code/local/Custom/Ajax/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Custom_Ajax>
            <version>0.0.1</version>
        </Custom_Ajax>
    </modules>
    <frontend>
        <layout>
            <updates>
                <custom_ajax>
                    <file>custom_ajax.xml</file>
                </custom_ajax>
            </updates>
        </layout>
        <routers>
            <ajaxtest>
                <use>standard</use>
                <args>
                    <module>Custom_Ajax</module>
                    <frontName>ajaxtest</frontName>
                </args>
            </ajaxtest>
        </routers>
    </frontend>
</config>

/app/design/frontend/base/default/layout/custom_ajax.xml

<?xml version="1.0"?>
<layout>
    <ajaxtest_index_index>
        <block type="core/template" name="root" output="toHtml" template="custom_ajax.phtml" />
    </ajaxtest_index_index>
</layout>

/app/code/local/Custom/Ajax/controllers/IndexController.php

<?php
class Custom_Ajax_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        $this->loadLayout(false);
        $this->renderLayout();
    }
}

/app/design/frontend/base/default/template/custom_ajax.phtml

Hello world!
David Manners
la source
1
Accepté. Magnifique - la clé était les mods de la <block>balise dans le fichier de mise en page, mais j'ai beaucoup appris de votre réponse. Je vous remercie.
random_user_name
De plus, la valeur de la balise frontName est utilisée dans la balise de poignée de mise en page, je ne le savais pas. Très bien.
Niloct