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

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

新規登録して質問してみよう
ただいま回答率
85.50%
jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

PHP

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

Laravel 5

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

Q&A

解決済

1回答

1415閲覧

Laravelにてjquery multiselectでoldから自動選択する

memimemi

総合スコア25

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/06/08 03:28

編集2019/06/08 08:59

前提・実現したいこと

チームの議事録を保存するためのアプリケーションを開発しております。

laravelでjqueryのmultiselectというプラグインを使用して、
参加者を複数を選択しPOST送信してDBに保存するまでは完成しました。
それをSHOWで表示する画面も問題なく作成できましたが編集画面を作るところで苦戦してしまいました。

以前の質問でvalueにどのように記述すれば画面に反映されるかを検証しそれがわかったので、
現在そこの改善を行っています。

バリデーションに失敗時に、oldで選択された状態で表示したいのと
編集画面に入ると既に投稿されたデータから、既に選択された状態でビューに表示したいです

どのように記述すればそれが達成できるかで悩んでおります^^;

jquery multiselect

イメージ説明

該当のソースコード

controllerから$teamと$userを渡しています。

View

1<div class="col-sm-12"> 2 <div class="form-group"> 3 <label> 参加者</label> 4 <select id="optgroup" class="ms" multiple="multiple" name="member[]" required> 5 @foreach($team as $teams) 6 <optgroup label="{{ $teams->name }}"> 7 @foreach($user as $users) 8 @unless($teams->id === $users->team_id) 9 @continue 10 @endunless 11 <option value="{{ $users->number }}" {{ is_array(old("member")) && in_array({{ $users->number }}", old("member"), true)? 'selected="selected"' : '' }}> 12 {{ $users->first_name }} {{ $users->last_name }}</option> 13 @endforeach 14 @endforeach 15 </optgroup> 16 </select> 17 </div> 18</div>

テーブルデータ

teams

1  name 21 チームA 32 チームB 43 チームC

users

1  number first_name last_name team_id 21 1     山田 太朗 1 32 2     上田 次郎 2 43 3     田中 三郎 2

試したこと

<option value="1" selected>山田太朗</option> とすることでビューに初期状態で表示する事には成功しています。

上記のコードのエラー

syntax error, unexpected '{' (View:

頂いた回答を元に編集したらいけました。

<div class="col-sm-12"> <div class="form-group"> <label> 参加者</label> <select id="optgroup" class="ms" multiple="multiple" name="member[]" required> @foreach($team as $teams) <optgroup label="{{ $teams->name }}"> @foreach($user as $users) @unless($teams->id === $users->team_id) @continue @endunless <option value="{{ $users->number }}" @if (is_array(old("member")) && in_array("$users->number" , old("member") , true)) selected @endif> {{ $users->first_name }} {{ $users->last_name }}</option> @endforeach @endforeach </optgroup> </select> </div> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

syntax error, unexpected '{' (View:

手元にすぐ動かせる環境がないので具体的な回答にはならないですが、、Syntaxが解消すればひとまず実現できそうということでしょうか。

たぶん下記の条件文のところだと思います。

php

1<option value="{{ $users->number }}" {{ is_array(old("member")) && in_array({{ $users->number }}", old("member"), true)? 'selected="selected"' : '' }}>

ここはもう少し丁寧に書いたほうが良いのではないでしょうか。
何をしたいのかわからない感じになっていますし、{{}}の中に{{が重なっていたりしてBladeが正しく処理を認識できないんだと思います。
Smartyとかもそうですけど、Bladeなどのテンプレートエンジンって裏ではPHPがテンプレートエンジンのルールに従って置換をしていって出力できる形にしています。
その中でルールと違った内容が放り込まれてしまえばそれはエラーとなるのは致し方ないのかなと。
素のPHPコードも書けるので、その場合はもともとのPHPの文法にも気を付ける必要があるわけですね。

三項演算子を使うのは多いの結構かと思うのですが、全体像が分かりにくくなるので、まずは普通にifで書いてから揃えていったほうが良いと思います。

Bladeに入れるのを前提ではなく、まずは素のPHPで

php

1if(is_array(old("member")) && in_array($users->number, old("member"),true)){ 2 echo " selected"; 3} 4 5//三項演算子 6echo is_array(old("member")) && in_array($users->number, old("member"),true) ? " selected" : "";

ちなみに質問者さんのコードをそのまま持ってきて素のPHPに置き換えると下記です。

php

1echo is_array(old("member")) && in_array({{ $users->number }}", old("member"), true)? 'selected="selected"' : '';

こうするとおかしいところに気づきます。

php

1echo is_array(old("member")) 2 && 3 in_array({{ $users->number }} 4/*出力ではない(ダブルクォートやヒアドキュメント内ではない)変数に{}ついている*/ 5", 6/*ここでダブルクォート?*/ 7 old("member"), true) 8? 'selected="selected"' : '';

というところで、丁寧に書き直してみてください。

投稿2019/06/08 04:33

m.ts10806

総合スコア80765

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

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

memimemi

2019/06/08 05:56

ご丁寧に回答ありがとうございました。 たしかに何がしたいかわからないコードですね… 素のphpで編集し直して、laravelのblade形式で書き直してみました。(追記) これでエラー自体は無くなったのですがselectedが反応してくれません。 おそらくold($member)の中身がうまく取得出来ていないのかなと・・・ 条件式なしでselectedをつけてループを回すと全件選択された状態になるので、 後もう少しで解決に至りそうです! 試行錯誤してみます
m.ts10806

2019/06/08 05:59

変数内容を確認したいのでしたらLaravelではお決まりのdd() またはdump()の出番ですね。
memimemi

2019/06/08 06:56

dump({{old('member')}})だと、 htmlspecialchars() expects parameter 1 to be string, array givenのエラーが出てしまいます。 ネットで調べてみた所、name属性の配列の要素をold値で取得するには name名.要素番号 で指定できる。という記事があったのでためしに以下のように記述してみるとエラーが出ず、 {{ dump(old('member'.'.'."1")) }} 複数選択してみるとdump内に数字が出るようになりました。 配列の要素をここに渡すことが出来たらと考えてますが・・・ とりあえず途中経過です。
m.ts10806

2019/06/08 07:53

すでに回答で指摘していますが{{}}の使い方を間違っていると思います。 Bladeで{{}}は「画面に出力する」ような意味を持ちます。 ので関数であるdump()の中に{{}}を書くのは構文的にNGです。 なので、二個目のように {{ dump(old('member')) }} ですね。 ※他にも色々やり方はあるようです。 https://laracasts.com/discuss/channels/laravel/can-you-write-dd-in-the-view?page=0
memimemi

2019/06/08 09:01

解決できましたのでご連絡します。 old("member")の配列はstring型となっており、記述内のin_arrayは数値型で検索をかけていてヒットしなかったようです…。 dumpの方もlaravelの@dumpを使用せず、 @php var_dump(old('member')); @endphp と記述することで配列が表示されました。 ありがとうございました^^
m.ts10806

2019/06/08 09:19

var_dumpとdumpは機能的にはほぼ同等ですよ。配列も関係なく出力できるので書き方が間違ってるだけじゃないかなあと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問