Class MagentoAjax-如何以编程方式显示来自控制器的自定义块(我的HTML内容始终为空)

Class MagentoAjax-如何以编程方式显示来自控制器的自定义块(我的HTML内容始终为空),class,magento,controller,block,Class,Magento,Controller,Block,我试图显示一个块作为对ajax调用的响应的一部分。 除了我无法让控制器回显模板HTML代码外,其他一切都正常工作 我的模块类: class MyModule_Ajax_ProductController extends Mage_Catalog_ProductController { public function indexAction() { if ($product = $this->_initProduct()) { echo

我试图显示一个块作为对ajax调用的响应的一部分。 除了我无法让控制器回显模板HTML代码外,其他一切都正常工作

我的模块类:

class MyModule_Ajax_ProductController extends Mage_Catalog_ProductController {

    public function indexAction() {

        if ($product = $this->_initProduct()) {

            echo '<div>hello</div>'; //this works

            echo $this->getLayout()->createBlock('ajax/product')->setTemplate('mymodule_ajax/product.phtml')->toHtml();

            //I also tried:
            //$layout = $this->getLayout();
            //$update = $layout->getUpdate();
            //$update->load('ajax_product_index'); 
            //$layout->generateXml();
            //$layout->generateBlocks();
            //$output = $layout->getOutput();
            //echo $output;

        }
    }
}
我的布局/mymodule_ajax.xml

<?xml version="1.0"?>
<layout>

    <ajax_product_index>
        <reference name="root">
            <block type="ajax/project" name="root" output="toHtml" template="mymodule_ajax/product.phtml"/>
        </reference>
    </ajax_product_index>

</layout>

我假设,因为我在块类中以编程方式设置模板,所以不需要模块引用? 删除引用没有什么区别

我没有PHP错误,显示的HTML呈现

<html>
<head></head>
<body></body>
</html>

我就是不知道我做错了什么?
我正在使用Magento CE 1.8.1

我发现这些东西非常困难。我将试着回答两个部分:

第一部分

您可能希望尝试在控制器中渲染布局,因此请先尝试此操作,然后阅读下面的其他项目:

//file: app/code/local/MyModule/Ajax/controllers/ProductController.php
//class: MyModule_Ajax_ProductController
//function: indexAction()
$this->loadLayout();
$this->renderLayout();
但您正在制作一个Ajax模块。因此,您可能希望使用控制器方法,例如:

//set the response
$this->getResponse()
//->clearHeaders()
->setHeader('Content-Type', 'application/json')
->setBody(json_encode($someReturnObject));
    return;
如果您想
setBody()
到块的HTML,那么在控制器中,您上面发布的代码看起来不错(但请参见下面的第二部分):-

实际上甚至只是调用
exit()indexAction()
末尾的code>将把PHP输出缓冲区刷新到浏览器中

我注意到您正在制作一个产品控制器。研究您正在扩展的类中的代码可能会有帮助:

//file: app/code/core/Mage/Catalog/controllers/ProductController.php
//class: Mage_Catalog_ProductController
//function: viewAction()
    public function viewAction()
    {
        // Get initial data from request
        $categoryId = (int) $this->getRequest()->getParam('category', false);
        $productId  = (int) $this->getRequest()->getParam('id');
        $specifyOptions = $this->getRequest()->getParam('options');

        // Prepare helper and params
        $viewHelper = Mage::helper('catalog/product_view');

        $params = new Varien_Object();
        $params->setCategoryId($categoryId);
        $params->setSpecifyOptions($specifyOptions);

        // Render page
        try {
            $viewHelper->prepareAndRender($productId, $this, $params);
        } catch (Exception $e) {
            //...
        }
    }
这可能会让您了解如何将Magento标准产品相关HTML发送到浏览器。您可能会发现
prepareAndRender()
helper函数更有趣,但它最终使用
$this->renderLayout()
创建输出html(此处
$this
是控制器)


第二部分

我认为您需要专注于代码中的行:

    echo $this->getLayout()->createBlock('ajax/product')->setTemplate('mymodule_ajax/product.phtml')->toHtml();
或者把它改成

    echo $this->getLayout()->createBlock('mymodule_ajax/product')->setTemplate('mymodule_ajax/product.phtml')->toHtml();
或者,在模块的config.xml文件中添加如下内容:(我认为这就是您需要的答案)

嗯,我不了解细节,但通常Magento会将
mymodule
转换为
mymodule
而不是
mymodule


这有意义吗?

这一切都有意义,是的-非常感谢您提供的所有细节。我现在要用一把细梳子梳理一下。希望你的答案能帮助我,让我保持理智。。。我会尽快回复你的,谢谢。你详细的回答、解释等让我找到了解决办法。最后,这是代码中我的块的命名,以及我的模板文件和文件夹结构的错误命名-系统找不到我的模板,但它没有告诉我,而是返回了一个空字符串。这是一个超级难以跟踪和调试!!
//file: app/code/core/Mage/Catalog/controllers/ProductController.php
//class: Mage_Catalog_ProductController
//function: viewAction()
    public function viewAction()
    {
        // Get initial data from request
        $categoryId = (int) $this->getRequest()->getParam('category', false);
        $productId  = (int) $this->getRequest()->getParam('id');
        $specifyOptions = $this->getRequest()->getParam('options');

        // Prepare helper and params
        $viewHelper = Mage::helper('catalog/product_view');

        $params = new Varien_Object();
        $params->setCategoryId($categoryId);
        $params->setSpecifyOptions($specifyOptions);

        // Render page
        try {
            $viewHelper->prepareAndRender($productId, $this, $params);
        } catch (Exception $e) {
            //...
        }
    }
    echo $this->getLayout()->createBlock('ajax/product')->setTemplate('mymodule_ajax/product.phtml')->toHtml();
    echo $this->getLayout()->createBlock('mymodule_ajax/product')->setTemplate('mymodule_ajax/product.phtml')->toHtml();
<config>
  <global>
        <!-- ... -->

        <blocks>
            <ajax>
                <class>MyModule_Ajax_Block</class>
            </ajax>
        </blocks>

        <!-- ... -->
  </global>
</config>
$this->getLayout()->createBlock('mymodule_ajax/product')