在Magento的模型方法中获取前端PHTML模板的输出

时间:2012-09-05 23:02:46

标签: templates magento model module block

简而言之:我想在模型中调用前端块来获取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):无效的模板   文件:前端/的碱/默认 /template/test.phtml

Magento在“基础”主题中搜索模板。如果我把那个文件放在那里( frontend / base / default / template / test.phtml ),那么一切正常。但我想将该模板保留在当前主题的目录中(我保留模块的其余模板文件):

  

前端/的包/主题 /template/test.phtml

我怎么能实现这个目标?

修改

对不起,我想简化代码以使其更具可读性。这是模板文件实际所在的位置:

  

前端\默认\现代\模板\ MyModule的\ test.phtml

单击管理面板中的按钮后,控制器调用model:

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):无效的模板   file:frontend \ 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:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\前台\ DEFAULT \ DEFAULT \模板\ MyModule的\ test.phtml   2012-09-06T09:40:55 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\前台\ DEFAULT \ DEFAULT \模板\ MyModule的\ test.phtml   2012-09-06T09:40:55 + 00:00 CRIT(2):无效模板   文件:前台\基地\ DEFAULT \模板\ MyModule的\ test.phtml   2012-09-06T09:40:56 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\ adminhtml \ DEFAULT \ DEFAULT \布局\ local.xml中   2012-09-06T09:40:56 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\ adminhtml \ DEFAULT \ DEFAULT \布局\ local.xml中   2012-09-06T09:40:56 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\应用\设计\ adminhtml \默认\默认\布局\那个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:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\ adminhtml \ DEFAULT \ DEFAULT \模板\ MyModule的\ test.phtml   2012-09-06T09:44:46 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\ adminhtml \ DEFAULT \ DEFAULT \模板\ MyModule的\ test.phtml   2012-09-06T09:44:46 + 00:00 CRIT(2):无效模板   文件:adminhtml \基地\ DEFAULT \模板\ MyModule的\ test.phtml   2012-09-06T09:44:47 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\ adminhtml \ DEFAULT \ DEFAULT \布局\ local.xml中   2012-09-06T09:44:47 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\ APP \设计\ adminhtml \ DEFAULT \ DEFAULT \布局\ local.xml中   2012-09-06T09:44:47 + 00:00调试(7):   E:\网络服务器\ XAMPP \ htdocs中\ Magento的\应用\设计\ adminhtml \默认\默认\布局\那个local.xml

似乎Magento并不关心当前启用的主题,并在基本主题中搜索模板。有没有办法“告诉”Magento应该使用哪个模板?

1 个答案:

答案 0 :(得分:1)

你已经有了答案,你只是错误地识别了这个问题。

一旦在当前主题中查找文件,Magento只会在base包中查找。所以首先Magento会检查

frontend/package/theme/template/test.phtml

然后它会检查

frontend/base/default/template/test.phtml

如果它仍然没有找到任何内容,那么它会记录错误。

如果要调试Magento尝试加载初始文件的位置,请将一些临时var_dumpMage::Log调试代码添加到设计包文件中

#File: app/code/core/Mage/Core/Model/Design/Package.php
public function validateFile($file, array $params)
{
    $fileName = $this->_renderFilename($file, $params);
    $testFile = (empty($params['_relative']) ? '' : Mage::getBaseDir('design') . DS) . $fileName;
    if (!file_exists($testFile)) {
        var_dump($testFile);
        Mage::Log($testFile);
        return false;
    }
    return $fileName;
}

此外,请在此处包含您在系统中使用的实际代码,人们将能够更好地为您提供帮助。你说你将模板路径设置为

之间存在差异
helloworld/test.phtml

你实际设置的是(根据Magento错误)

test.phtml

更新:根据附加日志记录中的内容,看起来有些东西会在模板路径中添加空格,这意味着Magento无法在其初始位置找到您的模板

E:\webserver\xampp\htdocs\magento\app\design\ frontend\default\default \template\mymodule\test.phtml
ex.
design\ frontend
\default \template

此外,我认为这不是根本原因,但不要在模板路径中使用DS。 PHP会照顾你。