Невозможно загрузить пользовательский макет AJAX для загрузки

8

У меня всегда есть проблемы с определением подходящих ручек для всего, поэтому, пожалуйста, потерпите меня здесь. Я просмотрел Google, SE и попробовал множество вариантов, но не повезло. (И да, я использовал здесь методы: отладка загрузки макета , но не уверен, что делать с выводом.

Проблема: контроллер загружается. Макета нет.

Когда я захожу на страницу в localhost/magento/mymodule/ajax/cart

Это отголосок "ЗДЕСЬ!" Var_dump getLayouts генерирует:

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>

Пожалуйста, порекомендуйте. Я знаю, что упускаю что-то очевидное, но не могу за всю жизнь найти это.

random_user_name
источник
1
Разве вы не должны использовать mycompany_mymoduleпрефикс в каждом дескрипторе? ( mycompany_mymodule_ajaxнапример).
Niloct
@Nicolt - спасибо за комментарий. Это очень хорошо может быть проблемой - когда вы говорите «Каждая ручка» - где конкретно вы видите, что он не используется, что его следует использовать? Вы имеете в виду XML-файл макета? Изученные мной учебники / рецензии не дают четкого представления о том, как их нужно называть, поэтому я и разместил описатели.
random_user_name
@Niloct - просто завладев твоим вниманием, я раньше ошибся в твоей ручке. Пожалуйста, смотрите мой комментарий выше.
random_user_name
Ну, вы сначала объявляете модуль с mycompany_mymodule(первая ручка). Каждый тэг xml, у которого есть префикс mymoduleбез mycompany_префикса, плох ИМХО. Вы должны изменить все имена тегов, чтобы иметь префикс mycompany_раньше mymodule.
Niloct

Ответы:

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>тег в файле макета, но я многому научился из вашего ответа. Спасибо.
random_user_name
Также в теге дескриптора макета используется значение тега frontName, я не знал об этом. Отлично.
Niloct