6

私は非常に単純なモデルを持っています。モデルのメソッドの 1 つにメール送信ルーチンを追加したいと思います。

$this->Email->delivery = 'smtp';
$this->Email->template = 'default';
$this->Email->sendAs = 'text';     
$this->Email->from    = 'email';
$this->Email->to      = 'email';
$this->Email->subject = 'Error';

入れてみました

App::import('Component', 'Email');

一番上、役に立たない。私が得るエラーは次のとおりです。

致命的なエラー: 23 行目の E:\xampp\htdocs8080\app\models\debug.php の未定義メソッド stdClass::send() の呼び出し

何か案は?

私はCakePHP 1.2を実行しています

4

8 に答える 8

19

ベスト プラクティスではない場合でも、実際にはモデルで EmailComponent を使用できますが、インスタンス化する必要があり (モデルにはコンポーネントの自動ロードはありません)、コントローラに渡す必要があります。EmailComponent は、電子メール テンプレートとレイアウトをレンダリングするために、ビューへの接続が必要なため、コントローラーに依存しています。

モデルでこのようなメソッドを使用して

function sendEmail(&$controller) {
    App::import('Component', 'Email');
    $email = new EmailComponent();
    $email->startup($controller);
}

次のようにコントローラーで使用できます。

$this->Model->sendEmail($this);

(PHP5 を使用している場合は、メソッド シグネチャの & を省略します)

于 2008-12-17T09:42:06.110 に答える
10

まあ、あなたはそれを間違った方法でやっています。AppController にメール送信ルーチンを配置する必要があります。

function _sendMail($to,$subject,$template) {
    $this->Email->to = $to;
    // $this->Email->bcc = array('secret@example.com'); // copies
    $this->Email->subject = $subject;
    $this->Email->replyTo = 'noreply@domain.com';
    $this->Email->from = 'MyName <noreply@domain.com>';
    $this->Email->template = $template;
    $this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
    $this->Email->send();
}

次に、次のように任意のコントローラーから使用します。

$this->_sendMail($this->data['User']['email'],'Thanks for registering!','register');

そして、配置することを忘れないでください

var $components = array('Email');

_sendMail 関数を使用しているコントローラーで。

于 2009-03-06T04:29:58.513 に答える
7

CakePHP 2.0 には、どこでも動作する新しい CakeEmail クラスがあります。

http://book.cakephp.org/2.0/en/core-utility-libraries/email.html

于 2012-01-25T20:26:59.623 に答える
2

私はジャスティンと一緒です。

ユーザー、管理者、および自動化されたプロセスのシェルスクリプトから発生する可能性のある特定のアクションに基づいて電子メールをトリガーする一連のモデルがあります。

複数の場所で電子メールを書き直すよりも、モデルで電子メールの応答を一元化する方がはるかに簡単です (注文レコードが「キャンセル」された場合など)。

また、ビジネス ルールである他の hasOne、belongsTo、または hasMany モデルにカスケードするいくつかのコア 'ロジック' を処理するモデルのプロセスを自動化しました。

たとえば、crontab シェル スクリプトは、Offer->expire() を呼び出してオファーを「失効」させ、それから Offer->make() を呼び出して別のオファーを作成しますが、それができない場合は、Request->expire() を呼び出してオファーを作成します。元のリクエストを「期限切れ」にします。電子メールは、有効期限が切れた最初のオファー受信者、新しいオファー受信者、および/または有効期限が切れた場合はリクエスタに送信する必要があります。これらは、crontab シェル、ユーザー、またはリクエストとオファーを手動で管理できる管理者によって呼び出すことができます。すべて異なるコントローラーまたはインターフェースを使用しています。

これは私がやったことであり、モデルとコントローラー内で呼び出すことができます:

if(empty($this->MailsController)) {
    App::import('Controller','Mails');
    $this->MailsController = new MailsController();
    $this->MailsController->constructClasses();
    $this->MailsController->Email->startup($this->MailsController);
}

これで、ほぼどこからでもこれを呼び出すことができ、モデル内で呼び出される以下を介して、どのデータを見つけるか、どの電子メールを生成するか、誰に送信するかなどのすべてのロジックを一元化できます。

$this->MailsController->orderMail($user_id,$this->id,$mode);

すべての電子メール ロジックは、基本的にモデルによって MailsController を介して間接的に呼び出されるため、rscherer のコードを試してみます。

これが役に立てば幸いです、oh4real

于 2009-04-05T18:23:39.907 に答える
2

確かに、モデルでコンポーネントを使用するのは良くありません。私の問題は、電子メール ブロックをコントローラーに何百万回も書き込む必要がなかったことです。

$this->Email->delivery = 'smtp';

$this->Email->template = $template;

$this->Email->sendAs = 'テキスト';

$this->Email->from = $from;

$this->Email->to = $to;

$this->Email->subject = $subject;

$this->Email->send();

コントローラーでこれを5回使用すると、ほとんどDRYになりません。そこで、Wrapper というコンポーネントを作成し、sendEmail ルーチンを追加したので、次のように記述できます。

$this->Wrapper->sendEmail($from,$to,$subject,$template,$body);

于 2008-12-07T16:15:24.977 に答える
2

コンポーネントは、モデルではなくコントローラーで使用することになっています。

コントローラーの使用で

var $components = array('Email');

App::import(); を使用する必要はありません。

アプリと、それをモデルで使用する理由がわからない場合は、システム アーキテクチャを再考し、このロジックをコントローラーに移動することをお勧めします。

モードで確実に必要な場合は、コードに次のようなものが含まれていました...

$this->Email->delivery = ...

コンポーネントの新しいインスタンスを作成し、Email というモデルのプロパティに設定しましたか? (これがうまくいくかどうかはわかりません。)

発生しているエラーは、EmailComponent のインスタンスではない stdClass オブジェクトで send() メソッドを呼び出しているためです。

于 2008-11-24T00:44:50.027 に答える
0

モデル (model1) に単一の行を追加するアプリがあります。そのモデルは、別のモデル (model2) へのエントリをトリガーします。model1 には多くの model2 があります。model2 が正常に挿入された場合にのみメールを送信したかったのです。そのため、モデル 1 がモデル 2 に正常に挿入されるたびにメールを送信することを検討していました。

システム アーキテクチャの再構築は、現時点では時間がかかりすぎます。

私の解決策は?Model1->addRecord を実行すると、model2->addRecord() が実行されます。私は、model1 に、model2->addRecord からの各失敗または成功を追跡させます。model1->addRecord から、呼び出し元のコントローラー (model1_controller) に成功/失敗の配列を返します。そこから、model1_controller にメールを発行させます。

したがって、アーキテクチャを完全に書き直すことなく、これを正しく行うことができます。Model1 からコントローラーにさらに情報を返すだけで、コントローラーに (適切に) 電子メールを送信させることができます。

ちょっとわかりにくい文章ですみません。私の脳は今コードモードです。

于 2009-04-16T18:09:19.697 に答える
0

Eventful というプラグインを調べる

カスタムイベントをブロードキャストしてリッスンできます。下のポスターの場合: Model1Saved イベントをブロードキャストし、model2 でリッスンしてから、2 番目の保存を実行すると、成功イベントが model1 またはコントローラーにブロードキャストされます。そこからメールを送信できます。

于 2009-08-27T18:43:32.340 に答える