1

つまり、モデル内のフロントエンドブロックを呼び出して、PHTMLテンプレートの出力を取得したいと思います。

モジュールの特定のHTMLファイルのコンテンツを生成するtest.phtmlテンプレートがあります。この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
    }
    //...
}

ブロックを呼び出し、test.phtmlテンプレートファイルの出力を取得して、HTMLファイルに書き込みます。

モデルメソッドの1つでそのHTMLを生成しないのはなぜですか?2つの理由:-ユーザーはそのファイルに簡単にアクセスできる必要があります-.phtmlファイルはユーザー/設計者にとってはるかに読みやすいです

そのため、出力を取得するためのブロックを作成したいと思います。しかし、問題は、そのブロックを作成しようとすると、次のエラーが発生することです。

CRIT(2):無効なテンプレートファイル:frontend / base / default /template/test.phtml

Magentoは、「ベース」テーマ内のテンプレートを検索します。そのファイル(frontend / base / default / template / test.phtml)をそこに置くと、すべて正常に機能します。ただし、そのテンプレートを現在のテーマのディレクトリ(モジュールの残りのテンプレートファイルを保持するディレクトリ)内に保持したいと思います。

フロントエンド/パッケージ/テーマ/template/test.phtml

どうすればこれを達成できますか?

編集:

申し訳ありませんが、コードを簡略化して読みやすくしたいと思いました。テンプレートファイルが実際に配置されている場所は次のとおりです。

フロントエンド\default\ modern \ template \ 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 DEBUG(7):E:\ webserver \ xampp \ htdocs \ magento \ app \ design \ frontend \ default \ default \ template \ mymodule \ test.phtml 2012-09-06T09:40:55 + 00:00 DEBUG(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.phtml2012-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 DEBUG(7):E: \ webserver \ xampp \ htdocs \ magento \ app \ design \ adminhtml \ default \ default \ layout \ local.xml 2012-09-06T09:40:56 + 00:00 DEBUG(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 DEBUG(7):E:\ webserver \ xampp \ htdocs \ magento \ app \ design \ adminhtml \ default \ default \ template \ mymodule \ test.phtml 2012-09-06T09:44:46 + 00:00 DEBUG(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.phtml2012-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 DEBUG(7):E: \ webserver \ xampp \ htdocs \ magento \ app \ design \ adminhtml \ default \ default \ layout \ local.xml 2012-09-06T09:44:47 + 00:00 DEBUG(7):E:\ webserver \ xampp \ htdocs \ magento \ app \ design \ adminhtml \ default \ default \ layout \ local.xml

Magentoは現在有効になっているテーマを気にせず、ベーステーマでテンプレートを検索しているようです。どのテンプレートを使用すべきかをMagentoに「伝える」方法はありますか?

4

1 に答える 1

1

あなたはすでに答えを持っています、あなたはただ問題を誤認しました。

Magentobaseは、現在のテーマでファイルを検索した後にのみパッケージを検索します。したがって、最初のMagentoがチェックします

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がその前に面倒を見てくれます。

于 2012-09-05T23:43:52.643 に答える