質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1473閲覧

受注管理で多数の注文に対して注文情報のみ異なるメールを一括で送りたい

hyou

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/09/22 14:50

編集2019/09/23 06:27

いつもお世話になっております。

現在、ショッピング系のサイトを独学でつくっており受注管理画面を構築しております。
その画面において発送完了メールや入金依頼メールを複数のレコードに対して個々の注文内容の乗せた内容で一括で送信したいと思っております。

※具体的には下記の流れを行いたいです。

受注管理画面で送りたいメールのタイトルをプルダウンで選ぶ
※共通する文章はDBでメールテンプレートテーブルとして保持されている

各注文レコード横にチェックボックスがある。メールを送りたいレコードにチェックを付ける

「メールを確認する」ボタンを押下

チェックを付けた複数のレコードの中から適当な1レコードでメール本文の確認画面を表示

「送信するボタンを押下」

送信完了画面へ

チェックが一つだけ付けたときの送信は正常にできたのですが、複数のレコードにチェックが入っていた時の一括送信が分からず知恵をお貸しください。
以下、コードです。。。

php

1//受注管理画面view 2<div>受注一覧</div> 3 <form action="/mailConfirm" method="post" id="sentMail"> 4 @csrf 5 <select form="sentMail"> 6 @foreach($mailTemplates as $mailTemplate) 7 <option value="{{ $mailTemplate->id }}">{{ $mailTemplate->name }}</option> 8 @endforeach 9 </select> 10 <button type="submit">メールを送る</button> 11<table> 12 <tr> 13 <th>選択</th> 14 <th>注文No</th> 15 <th>注文者氏名</th> 16 </tr> 17 @foreach ($orders as $order) 18 <tr> 19 <th> 20 <input type="checkbox" 21 name="check[]" 22 id="" 23 value="{{$order->id}}"> 24 </th> 25 <th>{{ $order->order_no }}</th> 26 <th> 27 <div>{{ $order->name }}</div> 28 </th> 29 </tr> 30 @endforeach 31</table> 32</form>

php

1//メール確認画面view 2 3<div>送信メールの確認</div> 4<form action="/mailSentComplete" method="post"> 5@csrf 6<div> 7 <div>タイトル</div> 8 <input id="" 9 name="title" 10 type="text" 11 value="{{ $mailTemplate->name }}" readonly> 12 <!----> 13 <div>本文</div> 14 <div> 15 {!! nl2br(e($mailTemplate->text)) !!} 16 <hr> 17 <p>お届け先氏名 : {{$order->name}}</p> 18 <p>お届け先住所 : {{$order->address}}</p> 19 <hr> 20 <p>注文No : {{$order->order_no}}</p> 21 <hr> 22 @foreach($order->orderitem as $it) 23 <p>商品名 : {{$it->item->name}}</p> 24 <p>価格 : {{$it->item->price}}</p> 25 <hr> 26 @endforeach 27 <hr> 28 </div> 29 </div> 30 <!----> 31 <div> 32 <input type="hidden" name="template-id" value="{{ $mailTemplate->id }}"> 33 @foreach($sendUsers->check_cancel as $check_id) 34 <input type="hidden" name="order_id" value="{{ $check_id }}"> 35 @endforeach 36 <button>送信する</button> 37 </div> 38</form> 39

PHP

1//web.php 2Route::post ('/mailConfirm', 'HomeController@mailConfirm');//送信メールの確認 3Route::post('/mailSentComplete', 'HomeController@mailSentComplete');//メール送信完了

php

1//Controller 2namespace App\Http\Controllers; 3//リクエスト 4use App\Http\Requests\MailConfirmRequest; 5use App\Http\Requests\MailSentRequest; 6//メール 7use Illuminate\Support\Facades\Mail; 8use App\Mail\OrderConfirmationNotification; 9//テーブルモデル 10use App\Models\AppUser; 11use App\Models\Order; 12use App\Models\MailTemplate; 13 ///////////////////////////////////////////////////////////////////////// 14 //メール送信前の確認 15 public function mailConfirm(MailConfirmRequest $req){ 16 17 return view('mailConfirm',[ 18 'mailTemplate' => MailTemplate::where("id",$req->get("mail-template-id")) 19 ->first(), 20 'order' => Order::where('id',$req->get("check"))->first(), 21 ]); 22 } 23 ///////////////////////////////////////////////////////////////////////// 24 //メール送信用 25 public function mailSentComplete(MailSentRequest $req){ 26 27 $contact = $req->all(); 28 29 $sendUsers = $req->input('order_id'); 30 31 foreach ($sendUsers as $key => $value) { 32 $sendUser = Order::where('id',$value) 33 ->first(); 34 $to = AppUser::where('id',$sendUser['user_id']) 35 ->get(); 36 //メール送信 37 Mail::to($to)->send(new OrderConfirmationNotification($contact)); 38 } 39 40 //送信完了画面 41 return view('mailSentComplete'); 42 } 43}

php

1//Mail/OrderConfirmationNotification 2<?php 3 4namespace App\Mail; 5 6use Illuminate\Bus\Queueable; 7use Illuminate\Mail\Mailable; 8use Illuminate\Queue\SerializesModels; 9use Illuminate\Contracts\Queue\ShouldQueue; 10 11use App\Models\Order; 12use App\Models\MailTemplate; 13 14class OrderConfirmationNotification extends Mailable 15{ 16 use Queueable, SerializesModels; 17 18 /** 19 * Create a new message instance. 20 * 21 * @return void 22 */ 23 protected $contact; 24 public function __construct($contact) 25 { 26 // 27 $this->contact = $contact; 28 } 29 30 /** 31 * Build the message. 32 * 33 * @return $this 34 */ 35 public function build() 36 { 37 return $this->view('emails.orderConfirmationNotification',[ 38 'order' => Order::where('id',$this->contact['order-id'])->first(), 39 'mailTemplate' => MailTemplate::where('id',$this->contact['template-id'])->first() 40 ]) 41 ->from('example@example.com') 42 ->subject($this->contact['title']); 43 } 44}

php

1//OrderConfirmationNotification.blade 2<!DOCTYPE html> 3<html> 4 <body> 5 {!! nl2br(e($mailTemplate->text)) !!} 6 <hr> 7 <p>お届け先氏名 : {{$order->name}}</p> 8 <p>お届け先住所 : {{$order->prefecture.$order->address}}</p> 9 <hr> 10 <p>注文No : {{$order->order_no}}</p> 11 <hr> 12 @foreach($order->orderitem as $it) 13 <p>商品名 : {{$it->item->name}}</p> 14 <p>価格 : {{$it->item->price}}</p> 15 <hr> 16 @endforeach 17 </body> 18</html> 19 20

見解として「public function mailSentComplete」へチェックをつけたレコードのorder_idが渡ればあとはforeachで回す感じでいけそうなのですが、その値を「public function mailSentComplete」へ渡す方法もいまいちわからず、何卒、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

checkboxのnameですが、checkですと、1つの値しか送れません
複数のcheckを送りたい場合は check[]としてください。
配列として、複数の値を送れます。

また、これはcheckbox以外のnameとしても有用で
複数のファイルを選択させたい時や、数が未定の入力欄(例えばtel_1,tel_2)をtel[]と書き換える事で任意の数にできたりします。

詳しくは html input 配列 などでお調べください。

投稿2019/09/22 15:27

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyou

2019/09/22 16:16 編集

mikkameさん ご回答有難う御座います。 勉強になりました、ちなみにcheck[]として今の状態だと値はControllerの「public function mailConfirm」へ渡ると思います。 メール送信を行うのは「public function mailSentComplete」ですので、そこまでcheck[]の値を持っていくのはどうすればいいのでしょうか? (すいません、実際のコードはcheck[]としております、teratailにup用にコード整理していたら誤って消してしまっていただけです。。。修正しておきます。。。)
mikkame

2019/09/22 16:30

スマホからなので適当になってしまいますが @foreach($request->check as $checked_id) input(type=hidden value=“$checked_id”) @endforeach みたいな感じで確認画面に持ち越してください
hyou

2019/09/23 06:28 編集

mikkameさん 有難う御座います!ご助言頂きました通りにやりましたところ、検証ツールより確認画面へ$checked_idをすべて持っていくことの確認ができました!! ただ持ってきたものを $sendUsers = $req->input('check_id'); として foreach ($sendUsers as $key => $value)でまわそうとすると 「Invalid argument supplied for foreach()」とエラーを吐かれてしまいます。 また確認画面へはcheck_idが複数個とtemplate-idが1つわたるかと思いますが メール送信を行う Mail::to($to)->send(new OrderConfirmationNotification($contact)); の$contactにはtemplate-id1つとcheck_idを一つだけを渡さなければいけないとおもっているのですが こちらは$reqからどうデータを分ければいいか、もうお付き合いいただけないでしょうか。m(_ _)m (現段階で変更した点については該当コードを変更しております。) またcheck_idは確認画面へ持ってきた段階で分かりやすいように「order_id」へ文言変更しております。
mikkame

2019/09/23 06:28

すみません、機能のやつにはnameを書き忘れていたのですが 現在はinput type hiddenにはnameついていますでしょうか。 >$contactにはtemplate-id1つとcheck_idを一つだけを渡さなければいけないとおもっているのですが こちらについてはよくわかってないのですが、単純にforeachしてchecke_idをOrder::findでorderに変換したらなんとかならないんでしょうか
hyou

2019/09/23 06:30

mikkameさん >現在はinput type hiddenにはnameついていますでしょうか。 order_idというnameを振っております。 (迅速なご返信感謝です!!)
hyou

2019/09/23 06:43 編集

>$contactにはtemplate-id1つとcheck_idを一つだけを渡さなければいけないとおもっているのですが >こちらについてはよくわかってないのですが、単純にforeachしてchecke_idをOrder::findでorderに変換>したらなんとかならないんでしょうか 分かりにくくてすいません、、現在の自分のコードだと $contact = $req->all(); としておりますため、$contactの中にはorder_idが複数個とmailTemplate_idを一つ持った状態で Mail::to($to)->send(new OrderConfirmationNotification($contact)); としております。 そうするとMail/OrderConfirmationNotification内では 'order' => Order::where('id',$this->contact['order-id'])->first(), としておりますため、結局は宛先はきちんとチェック付けた分のものが飛ぶけど、本文は同じ注文内容のものが飛んでしまうのではないかと思った為です。 つまりはController側でforeachで回す中で$contactにはmailTemplate_id一つ&order_idも一つずつ渡して回す必要があるのではないか、と考えたためです。 そして出させて頂いた質問内容は$contactにどうすれば、mailTemplate_id一つ&order_idを一個ずつもたせられるのか、そのご助言を頂きたく思った為で御座います。 ・・・・・・上記で分かりますか?(文章力・・・・・_| ̄|○)
mikkame

2019/09/23 07:01

foreach ($request-> order_id as $order_id) { $contact = []; $contact['order_id'] = $order_id; $contact['template_id'] = $request->template_id; Mail::to($to)->send(new OrderConfirmationNotification($contact)); } こんな感じですか? ここまでくると、Laravelというよりはプログラミングの仕方ですね
hyou

2019/09/23 16:29

有難う御座います!! おかげ様で無事、実装できました!! >ここまでくると、Laravelというよりはプログラミングの仕方ですね 仰る通りです。。。お付き合い頂き有難う御座いました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問