1

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

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

前端/包/主题/模板/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):无效的模板文件:frontend\ base\default \template\mymodule\test.phtml

Mage::logapp/code/core/Mage/Core/Model/Design/Package.php 中添加后,我在 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): 无效的模板文件:frontend\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 应该使用哪个模板?

4

1 回答 1

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 会为您解决这个问题。

于 2012-09-05T23:43:52.643 回答