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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

5回答

6741閲覧

form入力でcreateとeditを行う際に同じbladeテンプレートを使い回したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

1クリップ

投稿2019/07/14 07:06

編集2019/07/14 07:35

Laravelでデータの入力を行うformと編集するformを作っていますが、同じテーブルを扱うので自ずとformのinputの内容が同じになります。なのでformのbladeテンプレート作って入力でも編集でも使える様にしたいです。

しかし、それぞれのパターンで微妙に違いがあるのでそこをどう一つのbladeテンプレート補えばいいのか模索しております。createの際は初期にinputには何もvalueはありませんが、editの際は初期に編集するデータがinputのvalueに入ってます。また、createとeditでformの接続先である、actionの値が違います。そこの違いを考慮して例として以下の様なformのbladeテンプレートを作りました。

PHP

1<form action="{{$action}}" method="post"> 2 @csrf 3 <input type="text" name="name" 4 value="@if(old('name') != null) 5 {{old('name')}} 6 @elseif(isset($content)) 7 {{$content['name']}} 8 @endif"> 9 <input type="submit" value="submit"> 10</form>

上記の$actionはcontorollerから渡された値です。これはこれで十分だとおもいます。

問題はinputのvalueです。create、edit共通でにvalidationで引っかかって修正することがあるのでまずold関数で古い入力した値がないか確認します。あれば、それを表示します。なかった際は編集時で編集前のデータがあるかもしれないのでisset関数でcontorollerから送られたコンテンツのデータがないか確認し、あればセットします。それもなければcreate時と判断して何もセットしません。そんな感じで上記のif文を書きましたが正直長すぎます。input数が増えるたびにあんなif文を書くのはしんどいです。

そこで質問なのですが、この様なパターンってよくあると思うので、なにか方法みたいのが確立されていると思うのですが、調べても出てきません。createとeditで同じformのbladeテンプレートを使い回すスマートな方法があれば教えてください。

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

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

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

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

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

guest

回答5

0

ベストかどうかは分かりませんが、私がよく書く方法です。

<input type="text" name="name" value="{{ $errors->has('*') ? old('name'):($content['name'] ?? '')}}">

三項演算子と、「??」を使って簡単に。

ポイントとしては、
validationエラーで戻ってきた場合に、必ずoldを参照する形にしていることです。

これは、「登録済みの項目」を「編集で空にしようとした場合」の話になりますが、
いずれかの項目でバリデーションエラーが発生した場合、old('name')を基準に判断すると、空にした項目に編集前のデータが勝手に補完されてしまうことになるので、それを回避するためです。(なので、補完されていいのであれば、old基準でも問題ないかなと思います)

「??」(Null Coalesce Operatorとかいうものらしい・・)は、{{ $a ?? '' }}と書いた場合に、{{isset($a) ? $a : ''}}と書いたのと同じ結果になります。

最後に、これだけではcreate(新規作成)時に、$contentそのものの定義がないUndefinedのerrorが出てしまうので、create(新規作成)時は、viewに['content'=>false]を渡すようにします。

ご参考までに。。。

投稿2019/07/17 03:10

mix-peach

総合スコア1910

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

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

0

ベストアンサー

質問を読む限り、

php

1old('name', $content['name']);

で十分な気がする

投稿2019/07/18 06:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/07/18 09:13

十分ですね。oldにデォフォルト値をつけられたとはありがとうございます。
guest

0

切り分け処理が施された各inputの部分を、Laravel Bladeのコンポーネント機能を使うと、部品としてまとめることが可能です。
Vue.jsを参考に実装されたtSlot機能により、HTMLの断片を呼び出し側から渡せるので、インクルードよりも柔軟性が高いです。
Laravel 5.8 Bladeテンプレート

投稿2019/07/14 08:38

aro10

総合スコア4106

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

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

退会済みユーザー

退会済みユーザー

2019/07/15 07:25

ありがとうございます。参考にいたします。
guest

0

Laravelに限ったことではないかと。 
「絶対的に確立されている手順」というのはありません。

あくまで下記を満たせば良いわけで、手段は1つではありません。

  • 同じ入力コントロールである
  • 新規の場合はデフォルト未入力、更新の場合は指定されたデータ
  • 新規の時はinsert、更新の場合はupdateを行う

以上から、
「新規か、更新か」が判別できる情報が何かしら渡されていればいいわけですから。
それさえ出来ていればactionをわける必要はありません。

アクセスのURLを下記のようにすれば
/item/add/add
/item/edit/1
ルーティングすら1つにすることも可能でしょうし。(addの最後のaddは任意パラメータならなくてもいいかもしれない)

それさえ渡せばactinも共通にしてaddならinsert,editなら渡されたパラメータ(IDなど)をWhereに渡してupdateが可能でしょう。

バリデーションを行う場合は必要なパラメータを失わないように工夫する必要がありますし、確認画面を挟む際もそれは同じですね。
「既存情報より入力情報を優先とする作り」にする必要はあります(逆にすると入力した情報で更新されないので)

機能によっては「新規では入力するけど更新では更新不可な項目」もあると思うので、入力コントロールをdisableではなくラベルするなど工夫が必要ですね。

仕様の”決め”と考え方だと思います。
今回質問に提示された内容だけだと単純すぎるので具体的な話にはなりにくいと思います)

投稿2019/07/15 07:43

編集2019/07/16 01:00
m.ts10806

総合スコア80731

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

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

退会済みユーザー

退会済みユーザー

2019/07/16 12:44

ご回答ありがとうございます。 確かにいろんなパターンがあるし上記の質問だと仕様の決めが不十分で答えにくいかもしれませんね。そしていろんなパターンがあるので絶対的とは言わなくても、メジャーな方法とかもないかもですね。一応質問を修正します。
m.ts10806

2019/07/18 06:42

自己回答確認しましたがbladeに直接関数を書いてしまうとそこしか利用できないので やはり「別のルーティングから同じビューを呼び出す」方が良いかと思います。
guest

0

php

1@php 2 function getValue($name,$data) { 3 $value = ''; 4 $old = old($name); 5 if($old != null) { 6 $value = $old; 7 } elseif(isset($data)) { 8 $value = $data[$name]; 9 } 10 return $value; 11 } 12@endphp 13 14<input type="text" name="name" value="{{getValue('name',$content)}}">

とりあえず上記のメソッドを作ってみました。一応問題なく動いています。一旦はこれでいいかなって感じですが、もし他に何かあればご意見が欲しいです。

投稿2019/07/15 07:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問