Benutzerdefiniertes Frontend-Ajax-Layout kann nicht geladen werden

8

Ich habe immer Probleme, die richtigen Griffe für alles zu finden. Bitte nehmen Sie hier Kontakt mit mir auf. Ich habe Google, SE durchsucht und unzählige Variationen ausprobiert, ohne Glück. (Und ja, ich habe hier Techniken verwendet: Debuggen des Ladens von Layouts , bin mir aber nicht sicher, was ich mit der Ausgabe tun soll.

Das Problem: Der Controller wird geladen. Das Layout nicht.

Wenn ich die Seite unter besuche localhost/magento/mymodule/ajax/cart

Es hallt "HIER!". Der var_dump der getLayouts generiert:

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

Der Code

Benutzerdefinierte Steuerung:
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();
    }
}

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

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

Und schließlich die Vorlagendatei unter
app/design/frontend/theme/theme/template/mymodule/ajaxcart.phtml

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

Bitte beraten. Ich weiß, dass mir etwas Offensichtliches fehlt, aber ich kann es für mein ganzes Leben nicht finden.

zufälliger_Benutzername
quelle
1
Sollten Sie nicht mycompany_mymodulein jedem Handle ein Präfix verwenden? ( mycompany_mymodule_ajaxzum Beispiel).
Niloct
@Nicolt - danke für den Kommentar. Dies kann sehr wohl das Problem sein - wenn Sie "Every Handle" sagen - wo genau sehen Sie, dass es nicht verwendet wird, dass es verwendet werden sollte? Beziehen Sie sich auf die Layout-XML-Datei? Die Tutorials / Artikel, die ich gelesen habe, machen nicht klar, wie diese benannt werden müssen, daher die Handles, die ich gepostet habe.
random_user_name
@Niloct - nur um deine Aufmerksamkeit zu erregen, habe ich deinen Griff früher falsch geschrieben. Bitte beachten Sie meinen Kommentar oben.
random_user_name
Nun, Sie deklarieren das Modul zuerst mit mycompany_mymodule(erstes Handle). Jedes XML-Tag, das das Präfix mymoduleohne mycompany_Präfix hat, ist meiner Meinung nach schlecht. Sie sollten alle Tag-Namen so ändern, dass sie das Präfix mycompany_haben mymodule.
Niloct

Antworten:

18

Um eine einfache Ajax-Layout-Rückgabe zu erstellen, aktualisieren Sie Ihren Code wie folgt:

Aktualisieren Sie Ihren Controller, um loadLayout (false) zu verwenden. Dadurch wird das Hinzufügen des "Standard" -Layout-Handles gestoppt.

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

Als nächstes können Sie Ihre Layout-XML so aktualisieren, dass sie einfach die gewünschte Vorlage hinzufügt. Für Magento benötigen Sie Folgendes, um tatsächlich etwas auszugebenname="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>

Für eine vollständige "einfache Antwort", auf die unter /ajaxtest/index/indexzugegriffen werden kann, können Sie Folgendes tun:

/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
quelle
1
Akzeptiert. Schön - der Schlüssel waren die Mods für das <block>Tag in der Layoutdatei, aber ich habe viel aus Ihrer Antwort gelernt. Vielen Dank.
random_user_name
Auch der Wert des frontName-Tags wird im Layout-Handle-Tag verwendet, das wusste ich nicht. Sehr gut.
Niloct