0

CakePHP 2 で毎日の製品リストをすべてのユーザーにメールで送信する必要があります。

すべてのユーザーのメールを取得する次のコードがあります。

$users = $this->User->find('all', array('fields' => array('email')));
foreach ($users as $user) {
    $this->Email->reset();
    $this->Email->from     = '<no-reply@test.com.au>';
    $this->Email->to       =  $user['email'];
    $this->Email->subject  =  "Daily Products" ;
    $this->Email->sendAs   = 'html';
    $this->Email->send();
}

これで、これに html テンプレートを使用して値を解析できることがわかりましたが、実際のビュー自体の内部に foreach ループが必要であり、製品のテーブルを送信する必要があります。

ベストプラクティスは何ですか?コントローラーまたはビューで CakePHP コードを使用して製品を取得しますか?

ありがとう

4

2 に答える 2

2

このためのベスト プラクティスは、シェルを使用してメールを送信することです。メモリ不足を回避するには、ユーザーとその製品をすべて同時にではなく、チャンクで読み取る必要があります。

foreach ループ内では、各ユーザーのデータを取得し、他の変数として set() する必要があります。これにより、html テンプレートで使用できるようになり、そこですべての製品をレンダリングできます。

以下は、データを処理するシェルの (短縮された) コードです。

public function main() {
    $this->loop();
}


public function loop() {
    try {
        while (true) {
            if (!$this->poll()) {
                $this->out(__('Nothing more to process, sleeping...'));
                sleep($this->sleep);
            }
        }
    } catch (Exception $e) {
        $this->out($e->getMessage());
        $this->log($e->getMessage(), 'processing');
    }
}

public function poll() {
    $this->out('Polling...');
    $result = $this->Model->getFirstUnprocessed();

    if ($result === false) {
        return false;
    }

    // do something with the result here

    return true;
}

アイデアを得るにはこれで十分です。ユーザーをチャンクで読み取るには、find() オプションでオフセットをインクリメントする必要があります。私の場合、未処理のレコードがあるかどうかを確認し、そうであれば処理して、次の試行を行うまでしばらく待ちます。

于 2012-07-02T12:18:54.073 に答える
1

電子メールの「ビュー」は実際には要素です。ビュー/要素/メールの下にあります。そこには2つのフォルダがhtmlありtext、どちらもそれぞれのテンプレートを保持するためのものです。

そこでforeachを実行してから、コントローラーで次のようにレイアウトを設定してください。

$this->Email->sendAs = 'html'; // Can also be 'text' or 'both' (for multipart).
$this->Email->layout = 'foo'; // Would include Views/Elements/email/html/foo.ctp

EmailコンポーネントはCakePHP2.0以降非推奨になっていますが、代わりにCakeEmailコンポーネントを使用する必要があります。その使用方法の詳細については、本を参照してください。

于 2012-07-02T15:11:02.797 に答える