无法获取要加载的自定义前端Ajax布局


8

在确定适用于所有事物的正确处理方式方面,我总是遇到挑战,因此请在这里与我联系。我已经搜索了Google,SE并尝试了多种变体,但没有运气。(是的,我在这里使用了以下技术:调试布局加载,但是不确定如何处理输出。

问题:控制器加载。布局没有。

当我访问以下页面时 localhost/magento/mymodule/ajax/cart

它回显“这里!”。getLayouts的var_dump生成:

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

编码

自定义控制器:
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();
    }
}

配置文件:
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>

布局文件位于
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>

最后,模板文件位于
app/design/frontend/theme/theme/template/mymodule/ajaxcart.phtml

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

请指教。我知道我缺少明显的东西,但是我一生都找不到。


1
您不应该mycompany_mymodule在每个句柄中使用前缀吗?(mycompany_mymodule_ajax例如)。
Niloct

@Nicolt-感谢您的评论。这很可能是问题所在-当您说“每个句柄”时- 您在哪里特别看到它不被使用而应该被使用?您是指布局xml文件吗?我读过的教程/文章并不清楚要如何命名,因此也就发布了句柄。
random_user_name 2013年

@Niloct-只是引起您的注意,我之前拼错了您的句柄。请在上方查看我的评论。
random_user_name 2013年

好吧,您首先使用mycompany_mymodule(第一个句柄)声明模块。每个带前缀mymodule而不带mycompany_前缀的xml标记都是错误的恕我直言。你应该改变所有的标签名称有前缀mycompany_之前mymodule
Niloct 2013年

Answers:


18

要创建简单的Ajax布局,请尝试如下更新代码:

更新您的控制器以使用loadLayout(false); 这将停止添加“默认”布局句柄。

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

接下来,您可以将布局xml更新为简单的格式,只需添加所需的模板即可。您需要具备以下条件,magento才能实际输出任何内容name="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>

对于/ajaxtest/index/index可以在下面访问的完整“简单响应”,可以执行以下操作:

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

1
公认。漂亮-关键是<block>布局文件中标签的mod ,但我从您的答案中学到了很多。谢谢。
random_user_name 2013年

布局句柄标签中也使用了frontName标签值,我对此一无所知。很好。
Niloct
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.