我正在尝试将一个块显示为对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;
}
}
}
在我的模板文件product.phtml中 - 这个HTML永远不会显示出来。 (保存到app / design / frontend / default / default / template / mymodule_ajax / product.phtml)
<div>HERE!</div>
我的块类:
class MyModule_Ajax_Block_Product extends Mage_Catalog_Block_Product
{
private $product;
protected function _construct()
{
parent::_construct();
$this->setTemplate('mymodule_ajax/product.phtml');
}
protected function _toHtml() {
return parent::_toHtml();
}
public function setProduct($product) {
$this->product = $product;
return $this;
}
public function getProduct() {
return $this->product;
}
}
我的布局/ 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
答案 0 :(得分:8)
我发现这些事情非常困难。我将尝试分两部分回答:
第一部分
你可能想尝试在控制器中渲染布局,所以先试试这个,然后阅读下面的其他项目:
//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,那么在控制器中你上面发布的代码看起来不错(但请看下面的第二部分): -
$this->loadLayout();
$myBlock = $this->getLayout()->createBlock('ajax/product');
$myBlock->setTemplate('mymodule_ajax/product.phtml');
$myHtml = $myBlock->toHtml(); //also consider $myBlock->renderView();
$this->getResponse()
->setHeader('Content-Type', 'text/html')
->setBody($myHtml);
return;
实际上甚至只是在exit();
结束时调用indexAction()
会将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()
辅助函数更有趣,但最终它使用$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文件中添加如下内容:(我认为这是你需要的答案)
<config>
<global>
<!-- ... -->
<blocks>
<ajax>
<class>MyModule_Ajax_Block</class>
</ajax>
</blocks>
<!-- ... -->
</global>
</config>
以便Magento能够理解createBlock('ajax/product')
表示MyModule_Ajax_Block_Product
而不是Mage_Ajax_Block_Product
。
我还建议您将MyModule
更改为Mymodule
,以便中间没有大写字母。因为
$this->getLayout()->createBlock('mymodule_ajax/product')
好吧,我不明白细节,但通常Magento会mymodule
进入Mymodule
而不是MyModule
这有意义吗?