入力データをCSV形式で保存し、作成者/ログインしたユーザーに電子メールで送信する

私はCSV形式で作成したいくつかのエントリデータを作成者/ログインしたユーザーに電子メールで送信しようとしています。私はコントローラにアクションをポストするフロントエンドフォームを持つコントローラのセットアップを持っています:

public function actionSendCSV(){
 $this->requirePostRequest();

 $entryId = craft()->request->getParam('entryId');
 $entry = craft()->elements->getElementById($entryId);

 $user = craft()->userSession->getUser();

 if ($user->id != $entry->getAuthor()->id) {
     HeaderHelper::setHeader(array('status' => 404));
     craft()->end();
 }else{
   $list = array(
     //This is test data I'll construct the entry data here
    "Peter,Griffin,Oslo,Norway",
    "Glenn,Quagmire,Oslo,Norway");
    $file = fopen("test.csv","w");
    foreach ($list as $line){
      fputcsv($file,explode(',',$line));
    }

    $email = new EmailModel();
    $email->toEmail = $user->email;
    $email->subject = 'Your CSV';
    $email->body = 'How you doin, {{ user.name }}?';

   //Im not really sure what to do next here - do I save the CSV as an asset and then link it here? 
    $email->addAttachment('path/to/csv/', 'name in e-mail.csv', 'base64', 'text/csv');

    craft()->email->sendEmail($email);
 }}

これを処理するにはこれが最善の方法ですか、CSVを資産フォルダに保存する必要がありますか(おそらく、すべてのエクスポートを保存するプロセスでそのユーザーのフォルダだけを作成しますか?)、ユーザーにリンクを送信しますか?もしそうなら、これを達成する最良の方法は何ですか?

ありがとう!

ベストアンサー

この目的のために、「最良の」方法のようなものはありません。あらゆることに長所と短所があります。あなたの目標に応じて、あなたにとって最適なものを決める必要があります。

私は個人的に私のファイルを電子メールに添付して、実際にすべてのデバイスにそのファイルがあることを確かめることができますし、毎回それを再ダウンロードすることができます。何らかの理由でリンクを張った方がよいと言う人もいます。

だから私はあなたのように一時ファイルを作成してメールに添付します。各ファイルにはそれぞれ別々に名前を付けてください。本当に大きなエントリ(csvの生成に時間がかかる)があり、同時に2人の作者がボタンをクリックすると、最終的には互いに上書きすることができます。したがって、ファイル名に著者IDなどを含めることをお勧めします。後で削除することができます。

これらのファイルを保存したい場合は、それらをCraft資産として保存できますが、これはあなたの目的には必要ではないと思います。アクティビティを追跡したい場合は、レコードを作成することができます。そのため、ダウンロードした作者の数をデータベースに挿入できる頻度を確認する必要がある場合は、

しかし、興味深いのは、エントリとフィールドをフェッチする方法です。
あなたは小枝のトークンを置き換えるために体の内容を解析しなければならないことを知っていますか?

Edit
You could use this function

 /**
 * Send Email
 *
 * @param $message string
 * @param $subject string
 * @param $mail string
 * @param array $attachments
 * @return bool
 */
public function sendMail($message, $subject, $mail, $attachments = array()){
    $adminEmail = craft()->systemSettings->getSetting('email', 'emailAddress');
    $email = new EmailModel();

    $email->fromEmail = $adminEmail;
    $email->replyTo = $adminEmail;
    $email->sender = $adminEmail;
    $email->fromName = craft()->getSiteName();
    $email->toEmail = $mail;
    $email->subject = $subject;
    $email->htmlBody = $message;

    if(is_array($attachments) && count($attachments)){
        foreach($attachments as $attachment){
            $email->addAttachment($attachment['path'], $attachment['name']);
        }
    }
    return craft()->email->sendEmail($email);
}

〜と

$attachment = [
    [
        'name' => "The name you want to display.csv",
        'path'  => $file//path/to/your/file
    ]
];

$subject = "Your CSV";
$email = $user->email;;
$message = craft()->templates->render('path/to/template', array(
    'username' => '...',
   //.....
));
if($this->sendMail($message, $subject, $email, $attachment)){
   //message send
}else{
   //some errors
}

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です