簡體   English   中英

在Magento的模型方法中獲取前端PHTML模板的輸出

[英]Get frontend PHTML template's output inside a model method in Magento

簡而言之:我想在模型中調用一個前端塊,以獲取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在“基本”主題內搜索模板。 如果我將該文件放在那里( frontend / base / default / template / test.phtml ),那么一切正常。 但我想將該模板保留在當前主題的目錄中(我將其余模塊的模板文件保留在該目錄中):

frontend / package / theme /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):無效的模板文件: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:\\ 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 DEBUG(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 DEBUG(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應該使用哪個模板?

您已經有了答案,只是誤認了問題。

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會照顧您的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM