Tidak bisa mendapatkan tata letak ajax frontend kustom untuk dimuat

8

Saya selalu memiliki tantangan dalam mengidentifikasi pegangan yang tepat untuk semuanya, jadi tolong tahan dengan saya di sini. Saya telah menjelajahi Google, SE, dan mencoba berbagai variasi, tanpa hasil. (Dan ya, saya telah menggunakan teknik di sini: Debugging Layout Loading , tetapi saya tidak yakin apa yang harus dilakukan dengan output.

Masalahnya: Kontroler memuat. Tata letak tidak.

Ketika saya mengunjungi halaman di localhost/magento/mymodule/ajax/cart

Ini bergema 'DI SINI!'. The var_dump dari getLayouts menghasilkan:

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

Kode

Pengontrol khusus:
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();
    }
}

File konfigurasi:
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>

File tata letak di
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>

Dan akhirnya, file templat di
app/design/frontend/theme/theme/template/mymodule/ajaxcart.phtml

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

Mohon saran. Saya tahu saya kehilangan sesuatu yang jelas, tetapi seumur hidup saya tidak dapat menemukannya.

random_user_name
sumber
1
Bukankah seharusnya Anda menggunakan mycompany_mymoduleawalan di setiap pegangan? ( mycompany_mymodule_ajaxmisalnya).
Niloct
@Nicolt - terima kasih atas komentarnya. Ini sangat mungkin menjadi masalah - ketika Anda mengatakan "Setiap Pegangan" - di mana secara khusus Anda melihatnya tidak digunakan sehingga harus digunakan? Apakah Anda mengacu pada file tata letak xml? Tutorial / write-up yang saya baca tidak memperjelas bagaimana mereka harus dinamai, oleh karena itu pegangan yang saya posting.
random_user_name
@Niloct - hanya menarik perhatian Anda, saya salah mengeja pegangan Anda sebelumnya. Silakan lihat komentar saya di atas.
random_user_name
Nah, pertama-tama Anda mendeklarasikan modul dengan mycompany_mymodule(pegangan pertama). Setiap tag xml yang memiliki awalan mymoduletanpa mycompany_awalan adalah IMHO buruk. Anda harus mengubah semua nama tag untuk memiliki awalan mycompany_sebelumnya mymodule.
Niloct

Jawaban:

18

Untuk membuat pengembalian tata letak Ajax sederhana, coba perbarui kode Anda sebagai berikut:

Perbarui controller Anda untuk menggunakan loadLayout (false); ini akan menghentikan pegangan tata letak "default" yang ditambahkan.

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

Selanjutnya Anda dapat memperbarui tata letak xml Anda ke sederhana cukup tambahkan template yang Anda inginkan. Anda perlu yang berikut ini agar magento benar-benar menghasilkan apa punname="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>

Untuk "respons sederhana" lengkap yang dapat diakses di bawah, /ajaxtest/index/indexAnda dapat melakukan hal berikut:

/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
sumber
1
Diterima Cantik - kuncinya adalah mods ke <block>tag di file layout, tapi saya belajar banyak dari jawaban Anda. Terima kasih.
random_user_name
Nilai tag frontName juga digunakan dalam tag pegangan tata letak, saya tidak tahu tentang itu. Baik sekali.
Niloct