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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2432閲覧

Javascriptでフォームタグを書き換えたい

mikeko0901

総合スコア227

Laravel

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/03/11 15:23

編集2020/03/13 14:54

Laravelで開発しています。モーダルウィンドウで写真に対してコメントを付ける機能を実装しています。
Javascripでモーダルウィンドウにphoto_idを引き継ぐところまでできました。
モーダルウィンドウ内のFormタグをJavascriptを使って書き換えようと思っているのですが、うまくできません。アドバイスいただけますと幸いです。
###試したこと1 (innerHTMLでformタグを書き換えようとしました)

photo.blade.php

@extends('layouts.app_admin') @section('content') <script> window.onload = function() { $('#Modal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) //モーダルを呼び出すときに使われたボタンを取得 var recipient = button.data('whatever') //data-whatever の値を取得 //Ajaxの処理はここに var modal = $(this) //モーダルを取得 modal.find('.modal-title').text('photoid:' + recipient) //モーダルのタイトルに値を表示 //formタグの書き換え var formmodel = document.getElementById('formmodel') formmodel.innerHTML = "{{ Form::open(['route' => ['admin.photoupdate', " + recipient + "], 'method' => 'put']) }}" }) } </script> <h1>Photo一覧</h1> <div class="row mt-5"> @if (count($photos) > 0) @foreach ($photos as $photo) <div class="col-xs-12 col-md-3 text-center contents-cats mb-5"> <img src="{{ $photo->image_path }}"> ※省略 猫の情報をいくつか記載※ </div> <p>{{ $photo->comment }}</p> @if ($photo->reply === Null) {{-- {!! link_to_route('admin.photoedit', '返信', ['id' => $photo->id], ['class' => 'btn btn-apply applybtn']) !!} --}} <button type="button" class="btn btn-apply applybtn" data-toggle="modal" data-target="#Modal" data-whatever="{{ $photo->id }}"> 返信 </button> @endif </div> @if ($photo->reply === Null) @else <div class="small reply-fromadmin mt-2"> <p>{{ $photo->reply }}</p> </div> @endif </div> @endforeach @endif {{--★モーダルウィンドウ--}} <div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true">  <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <h4 class="modal-title" id="ModalLabel">返信:</h4> </div> <div class="modal-body"> <div id="formmodel"> {{ Form::open(['route' => ['admin.photoupdate', $photo->id], 'method' => 'put']) }} </div> {{ csrf_field() }} <div class="form-group"> {!! Form::label('reply', 'ヒトコト返信') !!}<span class="small">(50文字以内)</span> <div> {!! Form::textarea('reply', null, ['size' => '40x5']) !!} </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">キャンセル</button> {!! Form::submit('更新', ['class' => 'btn btn-apply']) !!} {{ Form::close() }} </div> </div> </div> </div> @endsection

上部に<script>タグがあります。script内の//formタグの書き換え部分のinnerHTMLで、
{{--★モーダルウィンドウ--}} の、<div id="formmodel">にある

{{ Form::open(['route' => ['admin.photoupdate', $photo->id], 'method' => 'put']) }}

の$photo->id部分を各photoごとに書き換ようとしました。
↓しかし、このように、script自体がよみこまれなくなってしまいます。。
イメージ説明

innerHTML部分をテキストにするとうまく書き換えられます
イメージ説明

追加 試したこと2

こちらの記事を見つけて、innerHTMLではなくて、actionを書き換えてみました。
https://www.sejuku.net/blog/28720

それで、コードを以下に変更しました。

@extends('layouts.app_admin') @section('content') <script> window.onload = function() { $('#Modal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) //モーダルを呼び出すときに使われたボタンを取得 var recipient = button.data('whatever') //data-whatever の値を取得 //Ajaxの処理はここに var modal = $(this) //モーダルを取得 modal.find('.modal-title').text('photoid:' + recipient) //モーダルのタイトルに値を表示 }) function clickEvent() { document.myform.action = "{{ route('admin.photoupdate', ['id' => " + recipient + " ]) }}"; } } </script> <h1>Photo一覧</h1> <div class="row mt-5"> @if (count($photos) > 0) @foreach ($photos as $photo) <div class="col-xs-12 col-md-3 text-center contents-cats mb-5"> <img src="{{ $photo->image_path }}"> ※省略 猫の情報をいくつか記載※ </div> <p>{{ $photo->comment }}</p> @if ($photo->reply === Null) {{-- {!! link_to_route('admin.photoedit', '返信', ['id' => $photo->id], ['class' => 'btn btn-apply applybtn']) !!} --}} <button type="button" class="btn btn-apply applybtn" data-toggle="modal" data-target="#Modal" data-whatever="{{ $photo->id }}"> 返信 </button> @endif </div> @if ($photo->reply === Null) @else <div class="small reply-fromadmin mt-2"> <p>{{ $photo->reply }}</p> </div> @endif </div> @endforeach @endif {{--★モーダルウィンドウ--}} <div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true">  <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <h4 class="modal-title" id="ModalLabel">返信:</h4> </div> <div class="modal-body"> <div id="formmodel"> <form name="myform" method="POST" action="{{ route('admin.photoupdate', ['id' => $photo->id ]) }}" id="myform"> <input type="hidden" name="_method" value="PUT"> </div> {{ csrf_field() }} <div class="form-group"> {!! Form::label('reply', 'ヒトコト返信') !!}<span class="small">(50文字以内)</span> <div> {!! Form::textarea('reply', null, ['size' => '40x5']) !!} </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">キャンセル</button> <button onclick="clickEvent()">送信</button> </form> </div> </div> </div> </div> @endsection

document.myform.actionで、モーダルウィンドウ中の<form>タグの

<form name="myform" method="POST" action="{{ route('admin.photoupdate', ['id' => $photo->id ]) }}" id="myform">

のactionを書き換えるようにしてみました。しかし、
イメージ説明

2, 3, 4の返信ボタンをクリックして返信を登録しても、5にupdateされてしまい、photo->idがうまく指定できていないようです…
(modal.find('.modal-title').text('photoid:' + recipient) //モーダルのタイトルに値を表示)はできているようで、モーダルウィンドウに各photo->idは表示されます。

何か良い方法あれば、アドバイスお願いします・・!

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

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

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

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

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

guest

回答1

0

ベストアンサー

Laravel

1 2{{ Form::open(['route' => ['admin.photoupdate', " + recipient + "], 'method' => 'put']) }} 3

だとエスケープされた安全なものになってしまうので

Laravel

1 2{!! Form::open(['route' => ['admin.photoupdate', " + recipient + "], 'method' => 'put']) !!} 3

https://readouble.com/laravel/6.x/ja/blade.html
の『エスケープしない出力』を参照。

ddして貰えばわかるともらいますが、
<が<

が>

になってしまってるので正しく解釈されません。
(詳しく解析してないのでわかりませんが、おそらく内部ではhtmlspecialchars()をechoする処理になってるはずです。

echoを使うのも手です。

Laravel

1 2echo Form::open(['route' => ['admin.photoupdate', " + recipient + "], 'method' => 'put']); 3

投稿2020/03/13 14:57

編集2020/03/13 15:03
kyoya0819

総合スコア10429

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

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

mikeko0901

2020/03/14 02:50

回答、ありがとうございます!すみません、質問です… アドバイスいただきました通り、<script>のformタグの書き換えのinnnerHTHLを以下のように書き換えてみました。 ``` <script> window.onload = function() { $('#Modal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) //モーダルを呼び出すときに使われたボタンを取得 var recipient = button.data('whatever') //data-whatever の値を取得 //Ajaxの処理はここに var modal = $(this) //モーダルを取得 modal.find('.modal-title').text('photoid:' + recipient) //モーダルのタイトルに値を表示 //formタグの書き換え var formmodel = document.getElementById('formmodel') formmodel.innerHTML = "{!! Form::open(['route' => ['admin.photoupdate', " + recipient + "], 'method' => 'put']) !!}" }) } ``` ただ、そうするとモーダルウィンドウに表示されていたphotoid:がなくなり、scriptがうまく読み込まれなくなってしまいます… htmlの方でいただきましたコードを記載すると ``` {{--★モーダルウィンドウ--}} <div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true">  <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <h4 class="modal-title" id="ModalLabel">返信:</h4> </div> <div class="modal-body"> <div id="formmodel"> {!! Form::open(['route' => ['admin.photoupdate', " + recipient + "], 'method' => 'put']) !!} <input type="hidden" name="_method" value="PUT"> </div> {{ csrf_field() }} <div class="form-group"> ``` idが渡らずエラーになってしまいます… https://gyazo.com/db10aee2490e1a80872f315a3ef17817 ・・・私のやり方、間違っていると思いますが、どの部分が間違っているのか、お分かりになりましたら教えていただけると嬉しいです。 的外れなことをやっておりましたらすみません…
kyoya0819

2020/03/14 03:16

すみません。私の配慮が足りませんでした。コードを編集します。
kyoya0819

2020/03/14 03:19

" + recipient + " ですがどのような意図で書いておられますか?
mikeko0901

2020/03/14 05:11

<script>中の var recipient = button.data('whatever') //data-whatever の値を取得 で変数recipientが定義されています。 data-whateverは、htmlの方から、$photo->idを渡しています。 <button type="button" class="btn btn-apply applybtn" data-toggle="modal" data-target="#Modal" data-whatever="{{ $photo->id }}"> 返信 </button> 部分です。 $photo->idは、form::openタグで引数として渡しています。 {!! Form::open(['route' => ['admin.photoupdate', $photo->id], 'method' => 'put']) !!} 1ページ内に複数の写真($photo)があり、モーダルウィンドウでupdateしたいので、 {!! Form::open(['route' => ['admin.photoupdate', $photo->id], 'method' => 'put']) !!} の$photo->id部分を、Javascriptで受け取った変数recipientに置き換えたいのですが、その方法がわからず苦戦しております・・・ すみません・・・
mikeko0901

2020/03/14 15:28

こちら、できましたので、大丈夫です!失礼しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問