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

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

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

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

PHP

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

3109閲覧

jqueryでインライン編集をする際に、カラムと紐づくIDの内容を取得、受け渡しをしたい

ocms

総合スコア53

Laravel

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

PHP

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2016/09/03 18:46

jqueryを利用してテーブル内をインライン編集(php側に渡してmysqlに保存)しようとしています。

特定の値(下記のshop_name)のインライン編集と値の取得はできるようになったのですが、値に紐づくIDを同時にPHP側に渡したいのですがうまく取得できません。

jqueryでの取得につきましてサンプルコードをご教示いただけなないでしょうか。
jqueryコードの注釈の1と2の取得と受け渡しが解決できれば、PHP側での処理は可能となります。

どうぞよろしくお願いいたします。

php

1 <table class="table" id="edit-table"> 2 <thead> 3 <th>id</th> 4 <th>shop_name</th> 5 </thead> 6 <tbody> 7 @foreach($shops as $shop) 8 <tr> 9 <td>{{ $shop->id }}</td> 10 <td id="edit-table2">{{ $shop->shop_name }}</td> 11 </tr> 12 @endforeach 13 </tbody> 14 </table>

jquery

1 2 (function(documet){ 3 4 $(document).ready(function(){ 5 $("#edit-table > tbody > tr > td.edit-table2").click(edit_toggle()); 6 7 }); 8 9 10 11 function edit_toggle(){ 12 var edit_flag=false; 13 return function(){ 14 if(edit_flag) return; 15 var $input = $("<input>").attr("type","text").val($(this).text()); 16 console.log($input.val()); 17 18 19//1.ここで、shop-idを取得して、saveファンクションにidと、shop_name を渡したい 20 21 $(this).html($input); 22 23 $("input", this).focus().blur(function(){ 24 save(this); 25 $(this).after($(this).val()).unbind().remove(); 26 edit_flag = false; 27 }); 28 edit_flag = true; 29 } 30 } 31 32 function save(elm){ 33 alert("「"+$(elm).val()+"」を保存しました"); //保存する処理をここに書く 34 35 $.ajax( 36 { 37 type: "POST", //POSTで渡す 38 url: "http://hack.dev/admin/jquerypost", //POST先 39 data: 40 { 41 "id": , //2.IDを格納したい 42 "shop_name":$(elm).val(), //shop_name 43 "_token":"xxxxxxxxxxxxxxxxxxxxx" 44 }, 45 46 success: function(hoge) //通信成功、dataaddcon.phpからの返り値を受け取る 47 { 48 if(hoge==0) //返り値が0→成功 49 { 50 alert('正常終了しました'); 51 } 52 else if(hoge==1) //返り値が1→失敗 53 { 54 alert('失敗しました'); 55 } 56 }, 57 error: function(XMLHttpRequest,textStatus,errorThrown) //通信失敗 58 { 59 alert('処理できませんでした'); 60 } 61 }); 62 63 64 } 65 })(document); 66

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

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

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

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

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

kei344

2016/09/04 05:05

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況をお教えください。
guest

回答2

0

idを独自データ属性として埋め込んでおく方法もあります。

ビューは例えばこんな感じ。

php

1<td class="edit-table2" data-id="{{ $shop->id }}">{{ $shop->shop_name }}</td>

データ属性はjQueryのdataメソッドで扱えるので、

javascript

1// data-idを取得 2var id = $(this).data('id'); 3 4// data-idを設定 5$(this).data('id', newValue);
  • edit_toggle()で、td.data-idを取得し新しく作るinput要素にdata-idをセット
  • save()の引数として渡ってくるelm(input)にはdata-idをセット済みなのでそれを読み取る

という流れで取得可能だと思います。

参考

独自データ属性 - グローバル属性 - HTML5 タグリファレンス - HTML5.JP
http://www.html5.jp/tag/attributes/data.html

カスタムデータ属性を使う時はIEに気をつけろ | 銀ねこアトリエ
http://ginneko-atelier.com/blogs/tips/384/

投稿2016/09/04 03:09

nnssn

総合スコア1221

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

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

ocms

2016/09/04 05:48

nnssnさま ご助言ありがとうございました! アドバイス頂きました方法でも無事に再現を行うことができました。 data-id こちらを今まで知らなかったため、以降存分に利用させていただこうと思います! どうもありがとうございます。
guest

0

ベストアンサー

HTMLの変更

php

1<td id="edit-table2">{{ $shop->shop_name }}</td>

HTMLに於けるidは、同じHTML文書内でユニークになるべきものなので、
同じ要素がforeachで複製されるような時はclassを使うようにしましょう。
…と思ったのですが、jQueryのセレクターはclass前提ですね。修正済みだったのでしょうか?

ということで、HTML(PHP)を以下に変更したと仮定して回答します。

PHP

1@foreach($shops as $shop) 2 <tr class="shop"> 3 <td class="id">{{ $shop->id }}</td> 4 <td class="show_name">{{ $shop->shop_name }}</td> 5 </tr> 6@endforeach

$shop->shop_nameと変数名からshopが重複しているようにも思えますが、
$shop->name(店長名等?)が別にありそうだったので上記のようにしてみました。

イベントの発火

JavaScript

1$("#edit-table > tbody > tr > td.edit-table2").click(edit_toggle());

今も同じ仕様かどうかはわかりませんが、
jQueryのセレクターは右から探索していく仕様なので、
一度セレクターを切ってしまいfind等を用いて改めて探索するようにすると速度面で有利になります。

JavaScript

1$("#edit-table").find(".shop .shop_name").click(edit_toggle());

親の要素を見に行く

ようやく本題です。
jQueryにはparentやparents等の上部階層に遡るメソッドが用意されています。

上記でHTMLの修正要請をしたのは、以下のような分かりやすいコードでスパっと拾得する目的からです。

JavaScript

1//1.ここで、shop-idを取得して、saveファンクションにidと、shop_name を渡したい 2$(this).parents(".shop").find(".id").text(); 3$(this).parent().find(".id").text();

ちなみに質問文そのままのHTMLで拾得する場合、以下の指定になるかと思います。
idの場所に名前が振られていないので、全てのtdを拾得してからeqで最初のtdを抜き出しています。
こういうやり方はhtmlへの修正がコードの修正に繋がりやすくなります。

JavaScript

1//1.ここで、shop-idを取得して、saveファンクションにidと、shop_name を渡したい 2$(this).parent().children("td").eq(0).text();

投稿2016/09/04 01:51

miyabi-sun

総合スコア21158

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

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

ocms

2016/09/04 03:41

ご助言ありがとうございます! 現在取り組んでおりまして、引き続き進めてまいりますが、 現状コードを修正しましたが、うまく取得ができかねております。 コンソールに出力しているのですが、結果が1となってしまいました。 2つ目のご助言とともにもう少し取り組んでいきます。 途中経過までとなります。 $shop = $(this).parents(".shop").find(".id").text(); $shop_id = $(this).parent().find(".id").text(); ↓ console.log('$shop出力 : ',$shop); 結果:1 console.log('$shop_id出力 : ',$shop_id); 結果:1 ```html(php) <table class="table table-hover " id="edit-table"> <thead> <th>id</th> <th>shop_name</th> </thead> <tbody> @foreach($shops as $shop) <tr class="shop"> <td class="id">{{ $shop->id }}</td> <td class="shop_name">{{ $shop->name }}</td> </tr> @endforeach </tbody> </table> ``` ```javascript <script> (function(documet){ $(document).ready(function(){ // $("#edit-table > tbody > tr > td.edit-table2").click(edit_toggle()); // $("#edit-table").click(edit_toggle()); $("#edit-table").find(".shop .shop_name").click(edit_toggle()); }); function edit_toggle(){ var edit_flag=false; return function(){ if(edit_flag) return; //デフォルトのパターン console.log('this1 : ',this); var $input = $("<input>").attr("type","text").val($(this).text()); console.log('$input出力 : ',$input.val()); //teratailのパターン $shop = $(this).parents(".shop").find(".id").text(); $shop_id = $(this).parent().find(".id").text(); console.log('$shop出力 : ',$shop); console.log('$shop_id出力 : ',$shop_id); //HTML http://js.studio-kingdom.com/jquery/manipulation/html //.html()をセットに使用した場合、対象のコンテンツは新しいコンテンツに完全に入れ替わります。 $(this).html($input); console.log('this2 : ',this); console.log('$(this).html($input) : ',$(this).html($input)); $("input", this).focus().blur(function(){ save(this); $(this).after($(this).val()).unbind().remove(); edit_flag = false; }); edit_flag = true; } } function save(elm){ // alert("「"+$(elm).val()+"」を保存しました"); //保存する処理をここに書く $.ajax( { type: "POST", //POSTで渡す url: "http://hack.dev/admin/jquerypost", //POST先 data: { "newLat":"test", //名前 // "password":$('#password').val(), //パスワード // "_token": $('meta[name=csrf-token]').attr('content') "_token":"L9v1wei4EMRG8dXQfyIUEwqXdy54wLHjylcUZhZB" }, // async: false, success: function(hoge) //通信成功、dataaddcon.phpからの返り値を受け取る { if(hoge==0) //返り値が0→成功 { // alert('正常終了しました'); console.log('正常終了しました'); } else if(hoge==1) //返り値が1→失敗 { // alert('失敗しました'); console.log('失敗しました'); } }, error: function(XMLHttpRequest,textStatus,errorThrown) //通信失敗 { // alert('処理できませんでした'); console.log('処理できませんでした'); } }); } })(document); </script> ```
ocms

2016/09/04 03:49

スミマセン。そもそもid=1のデータで検証していました。 再度確認しまして、結果をご報告します。 また、2番めの方法で無事再現できました!ありがとうございます。
ocms

2016/09/04 05:45

@miyabi-sunさま ありがとうございました!無事確認をすることができました。 いずれでも動作確認ができまして、今回は前者のほうを利用する形で作成いたしました。 ありがとうございます。 他の方へのご参考用に、その他の箇所も掲載いたします。 ```php view <table class="table table-hover " id="edit-table"> <thead> <th>id</th> <th>shop_name</th> </thead> <tbody> @foreach($shops as $shop) <tr class="shop"> <td class="id">{{ $shop->id }}</td> <td class="shop_name">{{ $shop->shop_name}}</td> </tr> @endforeach </tbody> </table> ``` ```javascript (function(documet){ $(document).ready(function(){ //デフォルトのパターン // $("#edit-table > tbody > tr > td.edit-table2").click(edit_toggle()); //teratailのパターン $("#edit-table").find(".shop .shop_name").click(edit_toggle()); }); function edit_toggle(){ var edit_flag=false; return function(){ if(edit_flag) return; //デフォルトのパターン console.log('this : ',this); var $input = $("<input>").attr("type","text").val($(this).text()); $shop_name= $input.val(); console.log('$input出力 : ',$shop_name); $shop_id = $(this).parent().find(".id").text(); console.log('$shop_id出力 : ',$shop_id); //CSRF取得 $csrf = $('meta[name=csrf-token]').attr('content'); console.log('$csrf : ',$csrf); $(this).html($input); $("input", this).focus().blur(function(){ save(this); $(this).after($(this).val()).unbind().remove(); edit_flag = false; }); edit_flag = true; } } function save(elm){ $shop_name= $(elm).val(); console.log('saveメソッド : ',$shop_id,$shop_name,$csrf); $.ajax( { type: "POST", //POSTで渡す url: "http://hack.dev/admin/jquerypost", //POST先 data: { "shop_id":$shop_id, //id "shop_name":$shop_name, // "_token":$csrf }, // async: false, success: function(hoge) //通信成功 { if(hoge==0) //返り値が0→成功 { console.log('正常終了しました'); } else if(hoge==1) //返り値が1→失敗 { console.log('失敗しました'); } }, error: function(XMLHttpRequest,textStatus,errorThrown) //通信失敗 { console.log('処理できませんでした'); } }); } })(document); ``` ```php contorller public function postDB(Request $request) { $id = $request->input('shop_id'); $shop_name= $request->input('shop_name'); DB::table('shops') ->where('id', $id) ->update(['shop_name' => $shop_name]); return Response::make('0'); } ``` ```php route // jquery Route::any('admin/jquerypost', 'AdminFunctionController@postDB'); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問