1

これを求めてネットを徘徊してきました。Magento Commerce は、私たちにとっては無意味です。コア コードを grep したり、Alan Storm を読んだり、Inchoo を熟読したり、SO で関連する質問を見つけたりしても、答えは見つかりません。

そうは言っても、私の問題は、フロントエンドからではなくバックエンドから処理されたときに機能するトランザクション電子メール テンプレートにあります。ここにスニペットがあります:

<td width="100%" colspan="2" align="left">

    <!-- inject products quote table -->
    {{block type="adminhtml/sales_quotation_email" template="sales/quotation/email_quote_items.phtml" inherits=$template quote=$quote salesrep=$salesrep}}

    <!-- inject cross-sell products table -->
    {{block type="adminhtml/sales_quotation_email" template="sales/quotation/email_quote_cross_sells.phtml" inherits=$template quote=$quote salesrep=$salesrep}}

</td>

バックエンドでは、これらのブロックが期待どおりにレンダリングされます。フロントエンドでは、これらのブロック ディレクティブの上下のすべてがレンダリングされますが、テンプレートをレンダリングするときになると、ディレクティブが処理中に死んでいるように見えます。エラーはスローされません。

ここのアドバイスに従いましたが、うまくいきませんでした。もともと、メール テンプレート モデルで setDesignConfig を使用しようとしましたが、うまくいきませんでした。をディレクティブの属性として設定しようとしましareaたが、それも機能しませんでした。同僚は、上記のテンプレートの 2 つのコピーを持っていることを提案しましdesign/adminhtmldesign/frontend。余分なメンテナンスを心配する必要はありません。さらに、ディレクティブで指定されたブロック タイプが adminhtml からのものである場合、同じ問題が発生するのではないかと心配しています。私はその解決策を望んでいません。

それで、私は何を間違っていますか?何がわかりませんか?

Magento はテンプレートへの実際のパスをどのように解決し、テンプレートはその親ブロックの領域に存在することを強制されますか?

助けが必要です!ありがとう。

4

1 に答える 1

0

解決した

Magento Commerceで関連する投稿を見つけて、軌道に乗りました。私は 2 つのコントローラーで設計構成をダンプし始めましfrontendadminhtmlfrontendリクエストにテーマ情報が含まれていないことにすぐに気付きました。frontend私のコントローラーからのサンプル出力を見てください:

Mage_Core_Model_Design_Package Object (
    [_store:protected] => 
    [_area:protected] => frontend
    [_name:protected] => mypackage
    [_theme:protected] => Array
        (
            [layout] => 
            [template] => 
            [skin] => 
            [locale] => mytheme
        )

    [_rootDir:protected] => 
    [_callbackFileDir:protected] => 
    [_config:protected] => 
    [_shouldFallback:protected] => 1 )

プロパティでlayouttemplate、およびskinが空であることに注意してください。themeコントローラーから設計構成をダンプするとadminhtml、これらのプロパティが設定されました。

コントローラーに戻るとfrontend、メール テンプレート モデルをインスタンス化する前に、次の行を追加しました。


Mage::getDesign()->setArea('adminhtml');
Mage::getDesign()->setTheme('mytheme');

そして、ふふっ!出来た!ブロック ディレクティブが処理され、完全にレンダリングされたコンテンツが期待どおりに返されました。

だから、 を設定した私の考えは正しかったのですがarea、それだけでは十分ではありませんでした。も設定する必要がありthemeます。

私は解決策に満足しています。他の人に役立つことを願っています。しかし、この質問に完全に答えるために、リクエスト中にパッケージ情報が設計構成から欠落している理由を誰かが知っているかどうか、私はまだ興味があります. からのディレクティブのブロックタイプと関係がありますか? テーマ情報について心配する必要がないため、これは理にかなっています。これらの決定がコアコードのどこで行われるかはわかりません。frontendadminhtmladminhtml 以下の更新を参照してください。

アップデート:

元の投稿以来、さらに学びました。私の質問は、から来たタイプのブロックを構築するコードサンプルを提供しましたadminhtml。テンプレートへのパスはフロントエンドに解決されていると思いました。そのため、テンプレートが見つかりませんでした。実際にはそうではありませんでした。クラスの命名規則により、adminhtml ブロッ​​クはdesign/adminhtml/package/default/moduleテンプレートを探します。

design/adminhtml/package/mytheme/moduleただし、私の特定の Magento インストールでは、local.xml にデザイン オーバーライドがあり、管理者がテンプレートのチェックを要求するように管理テーマを変更します。そして、それが私のphtmlテンプレートが保存されている場所です。したがって、フロントエンドの要求では、コントローラーはこのオーバーライドについての手がかりがなく、特定のパッケージとテーマのストア構成で設定されているものに基づいてデザイン構成を構築するだけです。

要約すると、 setTheme() への呼び出しでは、次のように、変更された構成データを利用する必要があります。

Mage::getDesign()->setTheme(
    (string)    Mage::app()
                ->getConfig()
                ->getNode('stores/admin/design/theme/default')
);

つまり、ほとんどのインストールでは setArea() への単純な呼び出しで十分であると言えます。

最後に、作業が完了したら、設計構成の変更を元に戻す必要があります。そうしないと、その後のアクションで望ましくない結果が生じる可能性があります。

于 2013-01-03T19:20:54.790 に答える