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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Laravel

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

PHP

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

Blade

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

442閲覧

ループ文each内で複数userを表示され、クリックするとモーダルが開いてそのuserを削除出来たりする。

Java_student

総合スコア83

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Laravel

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

PHP

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

Blade

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2024/05/06 21:04

編集2024/05/09 01:10

実現したいこと

多人数チャット機能を作成しているのですが、チャットを立てた側が悪徳ユーザーだったりもう参加しないユーザーの強制退室を行えるような機能を考えています。
そこで複数の値を取得してループ文で回して、ユーザー名をクリックするとモーダルが開いてモーダルにもクリックしたユーザーの情報が送られるようにしたいです。

前提

現状はモーダルを開くとこまでは出来ているのですが、クリックしたユーザーの情報をモーダルに渡したいのですが、現状はどのユーザーをクリックしても最後に取得した参加者の情報が送られてきてしまいます。

発生している問題・エラーメッセージ

ユーザー名をクリックしてモーダルが開かれても配列の最後のユーザーの情報しか表示されない。

該当のソースコード

room/show

1<div class="room-enterning"> 2 @if($room->user_id == $user->id) 3 <div class="acbox room-enterning-content"><input id="ac" type="checkbox" /> 4 <label for="ac">参加者</label> 5 @foreach($myRoomMembers as $myRoomMember) 6 <div class="acbox-under room-enterning-list"> 7 <h5><a href="#modal-{{ $myRoomMember->id }}" class="modal-button" > 8 {{ $myRoomMember->user->name }} 9 </a></h5> 10 </div> 11 @endforeach 12 </div> 13 @endif 14 </div> 15 16 {{-- モーダル内容 --}} 17<div class="modal-wrapper" id="modal-{{ $myRoomMember->id }}"> 18 <a href="#!" class="modal-overlay"></a> 19 <div class="modal-window"> 20 <div class="modal-content"> 21 <p class="modal_title">{{ $myRoomMember->user->name }}</p> 22 <form method="POST" action="{{ route('member.destroy', $myRoomMember->id) }}"> 23 @csrf 24 @method('DELETE') 25 <input type="hidden" id="user_id" name="user_id" value="{{$myRoomMember->id}}"> 26 <div class="flex items-center justify-end mt-4"> 27 <x-danger-button class="ms-4" onClick='return myMemberDeleteAlert();'> 28 {{ $myRoomMember->user->name }}を強制退室 29 </x-danger-button> 30 </div> 31 </form> 32 </div> 33 <a href="#!" class="modal-close"><i class="far fa-times-circle"></i></a> 34 </div> 35</div>

room.css

1/*モーダル表示*/ 2.modal-wrapper { 3 z-index: 999; 4 position: fixed; 5 top: 0; 6 right: 0; 7 bottom: 0; 8 left: 0; 9 padding: 40px 10px; 10 text-align: center; 11} 12 13.modal-button { 14 font-weight: bold; 15 text-align: center; 16 cursor :pointer; 17 transition: all 0.3s; 18 display: block; 19 max-width:300px; 20 text-decoration: none; 21} 22 23.modal-button:active { 24 /*ボタンを押したとき*/ 25 -webkit-transform: translateY(2px); 26 transform: translateY(2px);/*下に動く*/ 27 28} 29 30 31/*ラベルホバー時*/ 32.modal-button:hover { 33 color: #FFFFFF; 34 background-color: #DDDDDD; 35 box-shadow: 0 15px 30px -5px rgba(0,0,0,.15), 0 0 5px rgba(0,0,0,.1); 36 transform: translateY(-4px); 37} 38 39.modal-wrapper:not(:target) { 40 opacity: 0; 41 visibility: hidden; 42 transition: opacity .3s, visibility .3s; 43} 44 45.modal-wrapper:target { 46 opacity: 1; 47 visibility: visible; 48 transition: opacity .4s, visibility .4s; 49} 50 51.modal-wrapper::after { 52 display: inline-block; 53 height: 100%; 54 margin-left: -.05em; 55 vertical-align: middle; 56 content: "" 57} 58 59.modal-wrapper .modal-window { 60 box-sizing: border-box; 61 display: inline-block; 62 z-index: 20; 63 position: relative; 64 width: 70%; 65 max-width: 600px; 66 padding: 10px 30px 25px; 67 border-radius: 2px; 68 background: #fff; 69 box-shadow: 0 0 30px rgba(0, 0, 0, .6); 70 vertical-align: middle 71} 72 73.modal-wrapper .modal-window .modal-content { 74 max-height: 80vh; 75 overflow-y: auto; 76 text-align: left 77} 78 79.modal_title { 80 font-size: 1.5em; 81 position: relative; 82 overflow: hidden; 83 padding: 0; 84} 85 86.modal_title::before, 87.modal_title::after{ 88 content: ""; 89 position: absolute; 90 bottom: 0; 91} 92 93/* h2 プライマリカラー*/ 94.modal_title:before{ 95 border-bottom: 4px solid #6bb6ff; 96 width: 100%; 97} 98/* h2 セカンダリカラー*/ 99.modal_title:after{ 100 border-bottom: 4px solid #c8e4ff; 101 width: 100%; 102} 103 104.modal-content p { 105 margin: 10px 0 0 0; 106} 107 108.modal-overlay { 109 z-index: 10; 110 position: absolute; 111 top: 0; 112 right: 0; 113 bottom: 0; 114 left: 0; 115 background: rgba(0, 0, 0, .8) 116} 117 118.modal-wrapper .modal-close { 119 z-index: 20; 120 position: absolute; 121 top: 5px; 122 right: 5px; 123 width: 35px; 124 color: #95979c !important; 125 font-size: 30px; 126 font-weight: 700; 127 line-height: 35px; 128 text-align: center; 129 text-decoration: none; 130 text-indent: 0 131} 132 133.modal-wrapper .modal-close:hover { 134 color: #2b2e38 !important 135}

room.js

1const a = document.querySelector("#electric-cars"); 2// 次のようにしても動作します。 3// const a = document.getElementById("electric-cars") 4 5a.dataset.columns; 6a.dataset.indexNumber; 7a.dataset.parent;

試したこと

ループ文内に記入したりをしたのですが、クリック後に画面が真っ暗になるだけでモーダルが表示されませんでした。
ループ文の中にモーダル内容を入れるとクリックしたユーザーの情報を送れますか?

!追記!
#modal-01の01の箇所を{{ $myRoomMember->user->id }}や{{ $myRoomMember->id }}に変えたのですが、最後に取得したデータしかモーダルが開きませんでした。

補足情報(FW/ツールのバージョンなど)

PHP8
Laravel10

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

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

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

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

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

tezcello

2024/05/07 03:18

Laravelは良く知りませんが、一般的にループ処理後、ループ変数を使うと起こる現象と感じます。 どんな仕組みが裏で動作しているかも解りませんが、ひとつだけ用意しているモーダルウィンドウの値が自動的に書き換わるのでしょうか? 何となく、hrefが指している idを持っている要素を表示しているだけな感じがするので、値を書き換える仕組みが存在しないと、既に用意しているモノしか表示されないのだろうと思います。 __そうじゃない場合は、必要数モーダル用の要素を用意して idを適宜設定する... Laravel特有の機能なのか、Bootstrap等の別物を利用しているのか、良く解りませんが...
usm2030

2024/05/07 11:06

Blade内で$myRoomMemberをループなどに割り当ててないので当然というか、そのような挙動以外にはなり得ないのでは?
Java_student

2024/05/07 16:58

ループ内にモーダル内容を記したコードを入れると背景(modal-overlay)の黒の画面になりモーダルが表示されません。 一つづつ調べてみると<div class="acbox room-enterning-content"><input id="ac" type="checkbox" />の中に入れると上記に書いてある真っ黒の画面になってモーダルが表示されなくなる現象が起きます。
tezcello

2024/05/08 05:19

何か勘違いされている様ですが、現在の状態だと、ループを抜けた後に(ループの最後の値がセットされている)ループ変数を使って、モーダルウィンドウ「になる要素」を記述しています。 多分、アンカー要素がクリックされる事で発動する JavaScriptで、モーダルウィンドウに target クラスを追加しているのでしょう。 そのスクリプトは自作のモノですか? 拾ってきたモノなら、そのスクリプトは固定の内容を表示するモノではありませんか? そのスクリプトでモーダルウィンドウの内容を書き換えていないなら、当然最初に記述した「ループの最後の値」のままです。 そのスクリプトを改造して、クリックした要素に従い内容を変更する様に改造出来ますか? 改造できなければ、表示したいモーダルウィンドウを事前に用意しておく必要があります。 > ループ内にモーダル内容を記したコードを入れると 精読していませんが... 参加者リストになる部分を生成した後、もう一度別のループで個別のモーダルウィンドウを(参加者毎に)作っておく必要があります。 一つのループでやろうとすると、多分スタイルシートの書き換えが必要なのでしょう。 targetをどのモーダルウィンドウに追加するかを id で見付け出していると思う(違ったら、適宜修正)ので、それぞれが同じ id になる様に生成するのが必要です。
Java_student

2024/05/08 09:36

ちなみにJavaScriptは使っていませんでした。 cssだけでクリックされたら表示されるコードの書き方をしていました。 今、回答してくださった方のjsを使ってクリックしたユーザーのデータを送るやり方を試しています。
tezcello

2024/05/08 10:17

> ちなみにJavaScriptは使っていませんでした え? そうなんですか。 スタイルシートで > .modal-wrapper:target { ... } ってやっているので、てっきりクラスに target を追加したり削除したりをやっているのだと思っていました。
Java_student

2024/05/08 18:44 編集

すみません。 cssだけで作成するモーダルを参考にしていました。 javascriptで値を渡す方法を探しています。
tezcello

2024/05/09 02:00

> cssだけで作成するモーダル そうなのね。 それだと、先にコメントした通り、モーダル表示用の要素を、アンカータグと同数用意する必要があります。 __自己解決したとあるけど、コメントで指摘した内容なんだけどなぁ... > javascriptで値を渡す方法を探しています モーダルで表示したいモノ全てをアンカータグ自身、あるいはその周辺に置いておく必要があります。 アンカータグのクリックイベントでそれらをモーダル内に書き込む事になるのですが、JavaScriptが動作するのはクライアントサイドなので、Bladeがどの様に展開しているのか調べられない(Laravelを使っていないので)僕は、具体的なサンプルを示す事が出来ません。
guest

回答2

0

自己解決

解決しました。
モーダルの内容のコードも@foreach($myRoomMembers as $myRoomMember)で囲んだ、データを送れました。

<div class="room-enterning"> @if($room->user_id == $user->id) <div class="acbox room-enterning-content"><input id="ac" type="checkbox" /> <label for="ac">参加者</label> @foreach($myRoomMembers as $myRoomMember) <div class="acbox-under room-enterning-list"> <h5><a href="#modal-{{ $myRoomMember->id }}" class="modal-button" > {{ $myRoomMember->user->name }} </a></h5> </div> @endforeach </div> @endif </div> {{-- モーダル内容 --}} @foreach($myRoomMembers as $myRoomMember) <div class="modal-wrapper" id="modal-{{ $myRoomMember->id }}"> <a href="#!" class="modal-overlay"></a> <div class="modal-window"> <div class="modal-content"> <p class="modal_title">{{ $myRoomMember->user->name }}</p> <form method="POST" action="{{ route('member.destroy', $myRoomMember->id) }}"> @csrf @method('DELETE') <input type="hidden" id="user_id" name="user_id" value="{{$myRoomMember->id}}"> <div class="flex items-center justify-end mt-4"> <x-danger-button class="ms-4" onClick='return myMemberDeleteAlert();'> {{ $myRoomMember->user->name }}を強制退室 </x-danger-button> </div> </form> </div> <a href="#!" class="modal-close"><i class="far fa-times-circle"></i></a> </div> </div> @endforeach

投稿2024/05/08 19:06

Java_student

総合スコア83

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

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

0

ループ外でループ内に利用された変数を遣おうとすると最後におさめられた情報だけ出てくるのは既にコメントの通り

PHP

1<?php 2$p = [0,1,2,3]; 3 4foreach($p as $a){ 5 echo $a; 6 echo PHP_EOL; 7} 8echo $a; 9/* 100 111 122 133 143 ← 15*/

モーダル自体は画面表示後の操作であるので、
「IDをかえたモーダルを同じループでリストの数だけ準備する」

「モーダルを1つにしてHTMLとして各パラメータを設置して操作、受け渡しする」
方法のどちらかをとることになります。
前者が数が増えれば増えるほどパフォーマンスに影響があるので後者がおススメです。

今回だと例えば、
<a href="#modal-01" class="modal-button">
このaタグがmodal起動のトリガーとなっているようなので、
このaタグにdata属性を設置して渡したい情報を属性値に設定し、
このaタグクリックイベントにて、data属性値を取得してモーダル内の任意の場所にあてるJavaScriptを時分で書くと良いと思います。

投稿2024/05/08 01:13

m.ts10806

総合スコア80875

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

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

Java_student

2024/05/08 09:46

aタグ内に id="electric-cars" data-columns=" {{ $myRoomMember->user->id }}" data-index-number="{{ $myRoomMember->id }}" data-parent="cars" などといった記述を試したのですが、うまく行きません。 こちらの記述の仕方に誤りはありますか?
m.ts10806

2024/05/10 01:17

クリック時にそのdataを取得してモーダルに設置するJavaScriptを書く必要があります。 ループ内で個別にモーダルを作るのはおすすめしません。 例えば千件あれば千件分のモーダルHTMLが埋まることになり、パフォーマンスに影響ありますし、 動的コンテンツになりませんので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問