1

問題

次の方法でトランザクション メール テンプレートにブロックを追加しようとすると、次のようになります。

{{block type='core/template' area='frontend' template='invent/baskettimer/email_items.phtml' record=$record}}

次のエラーが発生し、何もレンダリングされません。

CRIT (2): Not valid template file:frontend/base/default/template/invent/baskettimer/email_items.phtml

トラブルシューティング

  • 通常、この警告は、継承を壊しているタイプミスを示していますが、私は 4 重にチェックしており、これでうまくいくはずです。
  • 次に、ファイルをベースにコピーしてテストを行ったところ、正しくレンダリングされました。
  • カスタム ブロックを作成し、テンプレートを設定すると、同じエラーが表示されます。

仮説

私には、テンプレートの継承が壊れているか、電子メールに実装されていないようです。そのため、常にベースで検索されます。テンプレートをそこに置くことができないため、それらを呼び出す方法がわかりません。

考えられる回避策

  • ブロックを html にレンダリングし、レンダリングする変数として送信します。これに関する問題は、モデル レベルから電子メールを送信していて、ヘルパーを使用しても、ブロックを事前にレンダリングするのに苦労していることです。
  • メソッドを使用してデータをレンダリングします。これはメッセージ/MVCに対するものであるため、実際には実行したくありません。

どんな助けでも大歓迎です。


バウンティの更新

だから私は問題を追跡しました。おそらく今は簡単な解決策です。

問題は、私が cronjob から呼び出しているのに正しいストア ビューがないことです。シェル スクリプトを使用して同様の状況を再現し、_appCode を null に変更するのはかなり簡単です。

<?php
require_once 'abstract.php';

class Mage_Shell_Shell extends Mage_Shell_Abstract
{

    protected $_appCode = ''; // works - remove to not work

    /**
     * Run script
     *
     */
    public function run()
    {
        Mage::getModel('invent_baskettimer/email')->sendJob();

    }

}

$shell = new Mage_Shell_Shell();
$shell->run();

したがって、基本的に質問は次のようになりました。

block->toHtml()ストア ビューに関係なくを呼び出すにはどうすればよいですか?

4

1 に答える 1

1

cronjob をそのように設定する方法はありません。Lucky magento では、ストア ビューをエミュレートできます。デフォルト ストアをエミュレートするには、以下を参照してください。

public function cronjob()
{
    $iDefaultStoreId = Mage::app()
        ->getWebsite()
        ->getDefaultGroup()
        ->getDefaultStoreId();

    $appEmulation = Mage::getSingleton('core/app_emulation');
    $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($iDefaultStoreId);

    .. do your stuff  here ..   

    $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
}

詳細については、http: //inchoo.net/ecommerce/magento/emulate-store-in-magento/を参照してください。

于 2013-09-25T16:03:05.760 に答える