No se puede cargar el diseño personalizado de frontend ajax

8

Siempre tengo problemas para identificar las manijas adecuadas para todo, así que tengan paciencia conmigo aquí. Recorrí Google, SE y probé innumerables variaciones, sin suerte. (Y sí, he usado técnicas aquí: depuración de carga de diseño , pero no estoy seguro de qué hacer con la salida.

El problema: el controlador se carga. El diseño no lo hace.

Cuando visito la página en localhost/magento/mymodule/ajax/cart

Se hace eco 'AQUÍ!'. El var_dump de getLayouts genera:

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

El código

Controlador personalizado:
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();
    }
}

Archivo de configuración:
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>

Archivo de diseño en
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>

Y finalmente, el archivo de plantilla en
app/design/frontend/theme/theme/template/mymodule/ajaxcart.phtml

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

Por favor avise. Sé que me falta algo obvio, pero por mi vida no puedo encontrarlo.

nombre_usuario_aleatorio
fuente
1
¿No deberías usar el mycompany_mymoduleprefijo en cada identificador? ( mycompany_mymodule_ajaxpor ejemplo)
Niloct
@Nicolt: gracias por el comentario. Este muy bien puede ser el problema, cuando dices "Todas las manijas", ¿dónde específicamente ves que no se usa que debería usarse? ¿Te refieres al archivo xml de diseño? Los tutoriales / escritos que he leído no dejan en claro cómo deben nombrarse, por lo tanto, los identificadores que he publicado.
random_user_name
@Niloct: solo captando tu atención, escribí mal tu nombre antes. Por favor vea mi comentario arriba.
random_user_name
Bueno, primero declaras el módulo con mycompany_mymodule(primer identificador). Cada etiqueta xml que tiene el prefijo mymodulesin el mycompany_prefijo es malo en mi humilde opinión. Debe cambiar todos los nombres de etiquetas para tener el prefijo mycompany_antes mymodule.
Niloct

Respuestas:

18

Para crear un diseño simple de Ajax, intente actualizar su código de la siguiente manera:

Actualice su controlador para usar loadLayout (falso); esto detendrá la adición del controlador de diseño "predeterminado".

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

A continuación, puede actualizar su diseño xml a simple simplemente agregue la plantilla que desee. Necesitará lo siguiente para que magento realmente produzca cualquier cosaname="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>

Para obtener una "respuesta simple" completa a la que se pueda acceder /ajaxtest/index/index, puede hacer lo siguiente:

/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 modales
fuente
1
Aceptado. Hermoso: la clave fue la modificación de la <block>etiqueta en el archivo de diseño, pero aprendí mucho de su respuesta. Gracias.
random_user_name
Además, el valor de la etiqueta frontName se usa en la etiqueta del controlador de diseño, no lo sabía. Muy bien.
Niloct