Class MagentoAjax-如何以编程方式显示来自控制器的自定义块(我的HTML内容始终为空)
我试图显示一个块作为对ajax调用的响应的一部分。 除了我无法让控制器回显模板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
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')