代码之家  ›  专栏  ›  技术社区  ›  zitix

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

  •  1
  • zitix  · 技术社区  · 14 年前

    简而言之: 我想调用模型内部的前端块来获得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应该使用哪个模板?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Alana Storm    14 年前

    你已经有了答案,你只是认错了问题。

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

    frontend/package/theme/template/test.phtml
    

    然后它会检查

    frontend/base/default/template/test.phtml
    

    如果它仍然找不到任何东西,那么它会记录错误。

    如果您想调试Magento试图从中加载初始文件的位置,请添加一些临时文件 var_dump 或 Mage::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会帮你解决这个问题。