【发布时间】:2012-08-30 17:36:32
【问题描述】:
简而言之:我想在模型中调用前端块来获取 PHTML 模板的输出。
我有一个 test.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
}
//...
}
调用block,获取test.phtml模板文件的输出,写入HTML文件。
为什么我不在其中一种模型方法中生成该 HTML?两个原因: - 用户需要能够轻松访问该文件 - .phtml 文件对于用户/设计师来说更具可读性
这就是为什么我想创建一个块来获取它的输出。但问题是,当我尝试创建该块时,出现此错误:
CRIT (2):无效的模板 文件:前端/base/default/template/test.phtml
Magento 在“base”主题中搜索模板。如果我把那个文件放在那里(frontend/base/default/template/test.phtml),那么一切正常。但我想将该模板保留在当前主题的目录中(我保留模块的其余模板文件):
前端/包/主题/template/test.phtml
我怎样才能做到这一点?
编辑:
抱歉,我想简化代码以使其更具可读性。这里是模板文件的实际位置:
前端\默认\现代\模板\mymodule\test.phtml
点击管理面板中的按钮后,控制器调用模型:
public function generateAction()
{
//Get model and call the method to generate HTML
Mage::getSingleton('mymodule/sample')->doSomething();
}
模型创建块以获取 test.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):无效的模板 文件:前端\ base\default \template\mymodule\test.phtml
在 app/code/core/Mage/Core/Model/Design/Package.php 中添加 Mage::log 后,我在 system.log 文件中获得了此信息:
2012-09-06T09:40:55+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\ frontend\default\default \template\mymodule\test.phtml 2012-09-06T09:40:55+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\frontend\default\default\template\mymodule\test.phtml 2012-09-06T09:40:55+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\frontend\default\default\template\mymodule\test.phtml 2012-09-06T09:40:55+00:00 CRIT (2): 无效模板 文件:前端\base\default\template\mymodule\test.phtml 2012-09-06T09:40:56+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml 2012-09-06T09:40:56+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml 2012-09-06T09:40:56+00:00 调试 (7): E:\webserver\xampp\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\xampp\htdocs\magento\app\design\ adminhtml\default\default \template\mymodule\test.phtml 2012-09-06T09:44:46+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\adminhtml\default\default\template\mymodule\test.phtml 2012-09-06T09:44:46+00:00 调试 (7): E:\webserver\xampp\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\xampp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml 2012-09-06T09:44:47+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml 2012-09-06T09:44:47+00:00 调试 (7): E:\webserver\xampp\htdocs\magento\app\design\adminhtml\default\default\layout\local.xml
Magento 似乎并不关心当前启用的主题,而是在基本主题中搜索模板。有什么方法可以“告诉”Magento 应该使用哪个模板?
【问题讨论】:
标签: templates magento model module block