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

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

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

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

JavaScript

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

4453閲覧

[Ajax] <form>データをFormDataオブジェクトに格納できない

teradog

総合スコア19

PHP

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

JavaScript

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2017/02/16 02:25

編集2017/02/16 02:35

お世話になります。
WordPressでサイトを構築しています。
archive(記事の一覧)ページにフィルター(検索)機能を作っています。
Ajaxを用いて、フィルター結果を表示させたいのですが、データの授受が思い通りにいかず悩んでおります。

些細なことでも構いません。ご助言いただきたく何卒よろしくお願いいたします。

###前提
Ajax(JavaScript,jQuery)の知識、経験はほぼ0です。用語や概念に誤りがあるかもしれません。ご了承ください。
素人の語彙力でネット情報を漁りながらコーディングしています。
WordPressでのサイト構築も初めてで、PHPやCSSなども同程度です。

###目標
記事のフィルタリングは、タクソノミー(一般的なブログで、カテゴリーやタグと呼ばれるもの)を<form>で選択させ、画面遷移を伴わずにAjaxでフィルタリングした記事一覧を表示する仕組みを実現したいです。

<form>データをFormDataオブジェクトに格納し、Ajaxでサーバに送信し、PHPで条件に応じた記事を取得しようと考えています。

###現実
formデータをFormDataオブジェクトに格納して送信していますが、送信できていないように見えます。
(実際には送信していて、私が取り出せていないだけかもしれません。)

###やったこと
HTML,javaScript,PHPをそれぞれ以下のようにコーディングしました。

HTML

1<form id="search-form" action="[自身のURL]" method="POST"> 2 <ul id="dropdown-filter" class="collapsible" data-collapsible="accordion"> 3 <li> 4 <div class="collapsible-header font-base back-sub-l5"> 5 <div class="container"> 6 <i class="fa fa-book fa-fw" title="filter-Status" aria-hidden="true"></i>Status 7 </div> 8 </div> 9 <div class="collapsible-body font-base back-sub-a15"> 10 <div class="container"> 11 <dl> 12 <dt>DATA 1</dt> 13 <dd> 14 <div class="row flex"> 15 <div class="col s12 m4 l3 margin-clear"> 16 <input type="checkbox" class="filled-in" id="parameter" name="Status[]" value="parameter" checked="checked"> 17 <label for="parameter">parameter</label> 18 </div> 19 </div> 20 </dd> 21 <dt>DATA 2</dt> 22 <dd> 23 <div class="row flex"> 24 <div class="col s12 m4 l3 margin-clear"> 25 <input type="checkbox" class="filled-in" id="parameter2" name="Status[]" value="parameter2" checked="checked"> 26 <label for="parameter2">parameter2</label> 27 </div> 28 <div class="col s12 m4 l3 margin-clear"> 29 <input type="checkbox" class="filled-in" id="parameter3" name="Status[]" value="parameter3" checked="checked"> 30 <label for="parameter3">parameter3</label> 31 </div> 32 </div> 33 </dd>> 34 </dl> 35 </div> 36 </div> 37 </li> 38 <li> 39 <div class="collapsible-header font-base back-sub-l5"> 40 <div class="container"> 41 <i class="fa fa-flask fw" title="filter-Status2" aria-hidden="true"></i>Status2 42 </div> 43 </div> 44 <div class="collapsible-body font-base back-sub-a15"> 45 <div class="container"> 46 <div class="row flex"> 47 <div class="col s6 m3 l3 margin-clear"> 48 <input type="checkbox" class="filled-in" id="fact" name="Status2[]" value="fact" checked="checked"> 49 <label for="fact">fact</label> 50 </div> 51 <div class="col s6 m3 l3 margin-clear"> 52 <input type="checkbox" class="filled-in" id="fact2" name="Status2[]" value="fact2" checked="checked"> 53 <label for="fact2">fact2</label> 54 </div> 55 <div class="col s6 m3 l3 margin-clear"> 56 <input type="checkbox" class="filled-in" id="fact3" name="Status2[]" value="fact3" checked="checked"> 57 <label for="fact3">fact3</label> 58 </div> 59 </div> 60 </div> 61 </div> 62 </li> 63 <li class="active"> 64 <div class="collapsible-header font-base back-sub-l5 active"> 65 <div class="container"> 66 <div class="row"> 67 <div class="col s12 m4 l4"> 68 <input type="reset" value="reset" class="btn w100"> 69 </div> 70 <div class="col s12 m4 l4"> 71 <input type="submit" value="search" class="btn w100"> 72 </div> 73 </div> 74 </div> 75 </div> 76 </li> 77 </ul> 78</form>
  • <form>タグの中は<ul>,<dl>,<div>などがいろいろ入っています。
  • cssはMaterializeというフレームワークを使っています。調整のために独自のクラスも追加してます。
  • 質問用に一部を抜粋しています。

特別なことはやってません。

<form>タグの中がわちゃわちゃしていて、ここが悪さの原因なのかも?ということを気にしています。

JavaScript

1$('form#search-form').on('submit', function(event) { 2 event.preventDefault(); //従来のPOSTイベントを解除 3 4 var fd = new FormData($(this)); //FormDataオブジェクトを生成 5 fd.append('action',ajax_arg.action); 6 fd.append('_ajax_nonce',ajax_arg.nonce); 7 8 // ajax_arg.*** は、function.phpで定義(wp_localized_scriptでJavaScript渡している) 9 10 $.ajax({ 11 type: 'POST', 12 url: ajax_arg.url, 13 data:fd, 14 processData: false, 15 contentType: false, 16 success: function( response ){ 17 $("div#search-result").html( response.data ); 18 } 19 }); 20 });
  • FormDataを生成して、ajaxのdataとして送信します。
  • fd.append('action',ajax_arg.action);でサーバ側で実行する関数を指定しています。

php

1function myAction(){ 2 check_ajax_referer( 'myAction' ); //CSRF対策 3 $query_args = get_form_post('lg_archive_filter'); //POSTデータを整形する関数 4 $result = ''; 5 6 /*ここで、サブクエリを発行して、フィルタリングの結果を返す */ 7 8 wp_send_json_success($result); 9} 10add_action('wp_ajax_myAction','myAction'); 11add_action('wp_ajax_nopriv_myAction','myAction');
  • サーバ側では、受け取ったPOSTデータを整形して、サブクエリを発行し、その結果を返します。

###確認できたこと
JavaScriptでは、FormDataの中身がどうなっているか確認しました。

JavaScript

1console.log(fd); 2```では、何が格納されているのかわからず。 3```JavaScript 4for(item of fd) console.log(item); 5```で、確認しました。 6結果は、次の通りで、appendしたデータしかありません。 7

["action", "myAction"]
["_ajax_nonce", "**********"]

意図した、PHPの関数myActionは呼び出されています。 PHPでも$_POSTをコンソールに出力したところ、同様に2つのデータしか表示されません。

Array
(
[action] => myAction
[_ajax_nonce] => **********
)

###質問 AjaxによるPHP関数の実行と、応答を受け取ることはできましたが、そもそも<form>データが渡せていません。 FormDataオブジェクトを生成する際、<form>のデータを持たせるために何が間違っているのか分かりません。 ご助言いただければ幸いです。よろしくお願い致します。 ###補足事項 次の環境で確認しております。 OS X El Capitan 10.11.6 サーバ : Apache PHP のバージョン : 5.6.19 FireFox 50.1.0 Chrome 55.0.2883.95 (64-bit) jQuery CDN : code.jquery.com/jquery-2.1.1.min.js FormDataの対応ブラザであるか「window.FormData)」で確認済みです。 MaterializeはCDNで利用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっとしか見ていませんが、FormDataの引き数にjQueryオブジェクト渡してしまっているのが問題なのでは?

JavaScript

1var fd = new FormData( this ); //FormDataオブジェクトを生成

投稿2017/02/16 02:33

kei344

総合スコア69407

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

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

teradog

2017/02/16 02:59

早速のご回答ありがとうございます。 ご指摘のとおり修正したところ、意図通りデータを送信することができました。 DOMエレメント、jQueryオブジェクトの違いや、new FormDataにはDOMエレメントを渡すという基本的なことがわかっていませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問