简而言之:
我想调用模型内部的前端块来获得PHTML模板的输出。
我有一个
测试.phtml
为我的模块生成特定HTML文件内容的模板。这个HTML只能在管理员请求时生成,所以我在控制器中调用它。控制器调用模型:
public function generateAction()
{
Mage::getSingleton('helloworld/sample')->doSomething();
}
模型如下所示:
class My_Helloworld_Model_Sample Mage_Core_Model_Abstract
{
public function doSomething()
{
$templatePath = 'helloworld/test.phtml';
$output = Mage::app()->getLayout()
->createBlock("core/template")
->setData('area','frontend')
->setTemplate($templatePath)
->toHtml();
//write $output in HTML file
}
//...
}
它调用块,获取
测试.phtml
模板文件并将其写入HTML文件。
为什么我不在其中一个模型方法中生成HTML?两个原因:
-用户需要能够方便地访问该文件
-.phtml文件对用户/设计者来说可读性更强
这就是为什么我想创建一个块来获得它的输出。但问题是,当我试图创建该块时,会出现以下错误:
CRIT(2):无效模板
文件:前端/
基本/默认
/template/test.phtml模板
Magento在“基本”主题中搜索模板。如果我把文件放在那里(
frontend/base/default/template/test.phtml
),那么一切都很好。但我想将该模板保存在当前主题的目录中(我将模块的其余模板文件保存在该目录中):
前端/
包装/主题
/template/test.phtml模板
我怎样才能做到这一点?
编辑:
很抱歉,我想简化代码,使其可读性更强。以下是模板文件的实际位置:
frontend\default\modern\template\mymodule\test.phtml
单击管理面板中的按钮后,控制器调用模型:
public function generateAction()
{
//Get model and call the method to generate HTML
Mage::getSingleton('mymodule/sample')->doSomething();
}
模型创建块以获得
测试.phtml
模板:
class My_Mymodule_Model_Sample Mage_Core_Model_Abstract
{
public function doSomething()
{
$templatePath = 'mymodule' . DS . 'test.phtml';
$output = Mage::app()->getLayout()
->createBlock("core/template")
->setData('area','frontend')
->setTemplate($templatePath)
->toHtml();
//write $output in HTML file
}
//...
}
到目前为止一切都很好。但是当创建块时,Magento找不到模板文件,并给我这个错误:
CRIT(2):无效模板
文件:前端\
基本\默认
\template\mymodule\test.phtml模板
在我添加之后
Mage::log
在app/code/core/Mage/core/Model/Design/Package.php中,我在system.log文件中得到了以下信息:
2012-09-06T09:40:55+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\
前端\默认\默认
\template\mymodule\test.phtml模板
2012-09-06T09:40:55+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\frontend\default\default\template\mymodule\test.phtml
2012-09-06T09:40:55+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\frontend\default\default\template\mymodule\test.phtml
2012-09-06T09:40:55+00:00 CRIT(2):无效模板
文件:frontend\base\default\template\mymodule\test.phtml
2012-09-06T09:40:56+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
2012-09-06T09:40:56+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
2012-09-06T09:40:56+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
如果我这样修改模型方法(注释掉对前端的引用):
class My_Mymodule_Model_Sample Mage_Core_Model_Abstract
{
public function doSomething()
{
$templatePath = 'mymodule' . DS . 'test.phtml';
$output = Mage::app()->getLayout()
->createBlock("core/template")
//->setData('area','frontend') // <--removed
->setTemplate($templatePath)
->toHtml();
//write $output in HTML file
}
//...
}
我在system.log文件中获得以下信息:
2012-09-06T09:44:46+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\
adminhtml\default\default
\template\mymodule\test.phtml模板
2012-09-06T09:44:46+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\template\mymodule\test.phtml
2012-09-06T09:44:46+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\template\mymodule\test.phtml
2012-09-06T09:44:46+00:00 CRIT(2):无效模板
文件:adminhtml\base\default\template\mymodule\test.phtml
2012-09-06T09:44:47+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
2012-09-06T09:44:47+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
2012-09-06T09:44:47+00:00调试(7):
E: \webserver\axamp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
看起来Magento并不关心当前启用了什么主题,而是在基本主题中搜索模板。有没有办法“告诉”Magento应该使用哪个模板?