実現したいこと
(事前)Controllerで use App\Http\Requests\Article\ArticleRequest;
(事前)ArticleRequestに、public function rulesで、name|required のバリデーションルール設定
既存のデータ(例えば名前=鈴木、年齢=45、趣味=チェックボックス群の中から、カメラを選択)をUPDATEするための各項目編集画面を表示する
↓
・名前を空欄にする
・趣味のチェックボックス群において、カメラのチェックを外し、温泉旅行にチェックを入れる
↓
入力内容確認ボタンを押下(正常な動作なら、入力内容確認画面に遷移)
↓
名前が空欄なので、バリデーションエラーメッセージが表示された編集画面が表示される
↓
その際、趣味のチェックボックス群では、温泉旅行にチェックが入っている状態にしたい(元々のカメラのチェックは外れた状態にしたい)
現状
既存のデータ(例えば名前=鈴木、年齢=45、趣味=チェックボックス群の中から、カメラを選択)をUPDATEするための各項目編集画面を表示する
↓
・名前を空欄にする
・趣味のチェックボックス群において、カメラのチェックを外し、温泉旅行にチェックを入れる
↓
入力内容確認ボタンを押下(正常な動作なら、入力内容確認画面に遷移)
↓
名前が空欄なので、バリデーションエラーメッセージが表示された編集画面が表示される
↓
その際、趣味のチェックボックス群では、カメラにチェックが入っている。温泉旅行のチェックは外れている
ソースコード(edit.blade.php)
PHP
1<div class="form-group @if(!empty($errors->first('media1'))) has->error @endif"> 2 <label> 3 <input type="hidden" name="media1" value=""> <!--チェックボックスが非選択だった時、valueを空で送るための記述 --> 4 @if(empty($errors->first('media1'))) <!-- チェックボックスに関するエラーがない場合--> 5 <input type="checkbox" name="media1" value="{{$info['media1']}}" @if($info['media1']== "WEB") checked @endif>WEB <!--DBの値がvalueに入る。更にその内容次第で、チェックボックスを選択済みに --> 6 @else <!-- エラーが発生したとき--> 7 <input type="checkbox" name="media1" value="{{Request::old('media1')}}" @if(Request::old('media1') == "WEB") checked @endif> <!-- エラー直前にこのチェックボックスが選択されていたら、選択済みを保持--> 8 @endif 9 </label> 10 <span class="help-block">{{$errors->first('media1')}}</span> 11</div> 12<div class="form-group @if(!empty($errors->first('media2'))) has->error @endif"> 13 <label> 14 <input type="hidden" name="media2" value=""> <!--チェックボックスが非選択だった時、valueを空で送るための記述--> 15 @if(empty($errors->first('media2'))) 16 <input type="checkbox" name="media2" value="{{$info['media2']}}" @if($info['media2']== "TV" ) checked @endif>TV <!--DBの値がvalueに入る。更にその内容次第で、チェックボックスを選択済みに --> 17 @else <!-- エラーが発生したとき--> 18 <input type="checkbox" name="media2" value="{{Request::old('media2')}}" @if(Request::old('media2') == "TV") checked @endif> <!-- エラー直前にこのチェックボックスが選択されていたら、選択済みを保持--> 19 @endif 20 </label> 21 <span class="help-block">{{$errors->first('media2')}}</span> 22</div>
#ソースコード(ArticlesController.php)
PHP
1/** 2 * Display a listing of the resource. 3 * 4 * @return \Illuminate\Http\Response 5 */ 6 public function send_data($id) //編集画面にデータを送る 7 { 8 $info = Article::find($id); 9 return view('article/edit', ['info' => $info]); 10 } 11 12
ソースコード(ArticleRequest.php)
PHP
1/** 2 * Get the validation rules that apply to the request. 3 * 4 * @return array 5 */ 6 public function rules() 7 { 8 return [ 9 'name' => 'required' 10 ]; 11 } 12}
#テーブル定義
SQL
1CREATE TABLE articles ( 2id int(10) unsigned NOT NULL AUTO_INCREMENT, 3name varchar(255) NOT NULL, 4email varchar(255) NOT NULL, 5age int(11) unsigned, 6area varchar(255) NOT NULL, 7gender int(2) unsigned, 8media1 varchar(255), 9media2 varchar(255), 10note varchar(255) NOT NULL, 11image varchar(255) NOT NULL, 12created_at timestamp NOT NULL default 13current_timestamp, 14updated_at timestamp NOT NULL default 15current_timestamp 16on update current_timestamp, 17primary key(id)) ENGINE=InnoDB CHARSET=utf8;
insert文
PHP
1$info = array( 2 'name' => $request->name, 3 'email' => $request->email, 4 'age' => $request->age, 5 'area' => $request->area, 6 'gender' => $request->gender, 7 'media1' => $request->media1, 8 'media2' => $request->media2, 9 'note' => $request->note, 10 'image' => $request->image, 11 ); 12 Article::insert($info);
DBの値の表示が優先されているようで、どのように記述すればoldの値がvalueに入れられるか分かりません。
また、上記ソースコードだと、
・名前、年齢を正しく入力
・温泉旅行にもチェック(カメラと温泉旅行両方にチェックが付いた状態)
して編集実行しても、温泉旅行がnullになってしまいます。
Laravelにお詳しい方、お知恵をお貸しいただけると有難く存じます。よろしくお願いいたします。
(5/15追記)
以下のように書き換えることで、
・エラーが無く、テーブルの値を参照した際、値が"WEB"であった場合には、チェックボックスはchecked
または
・他の項目でエラーが発生した際、チェックボックスにチェックを入れていた場合(=直前の値が"WEB"であった場合)、チェックボックスはchecked
とすることができました。
ソースコード(edit.blade.php)
PHP
1<label> 2 <input type="checkbox" name="media1" value="WEB" {{(!$errors->has('*') && $info['media1']== "WEB") || old('media1') == "WEB" ? 'checked' : ''}} >WEB <!--DBの値がvalueに入る。更にその内容次第で、チェックボックスを選択済みに --> 3 </label>
回答2件
あなたの回答
tips
プレビュー