http://appendgrid.apphb.com/で紹介されているappendGridをコンタクトフォームに埋め込んでいます。
appendGridのデモ。
http://appendgrid.apphb.com/Demo
入力した内容をメールで送信すると云う寸法ですが、メールの送信自体は問題無いのですが
入力した内容をCookieで保持したいのですが方法が分かりません。
名前や住所等を必須項目にしておりますが、必須項目を空白のまま送信しようとした場合、
送信せずにページはそのままで注意を表示するようになっていますが、現状はappendGridに入力した文字が消えてしまいます。
これを短時間でも良いので保持できればと思っております。
よろしくお願いします。
実際のコードは以下です。
lang
1 $('#order').appendGrid({ 2 caption: '', 3 initRows: 1, 4 columns: [ 5 { name: '品番', display: '品番', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '100px'} }, 6 { name: '品名', display: '品名', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '250px'} }, 7 { name: '色', display: '色', type: 'text', ctrlAttr: { maxlength: 20 }, ctrlCss: { width: '100px'} }, 8 { name: 'サイズ', display: 'サイズ', type: 'text', ctrlAttr: { maxlength: 4 }, ctrlCss: { width: '40px'} }, 9 { name: '数量', display: '数量', type: 'text', ctrlAttr: { maxlength: 4 }, ctrlCss: { width: '40px'} }, 10 ], 11 12 hideButtons: { 13 moveUp: true, 14 moveDown:true, 15 removeLast: true 16 } 17 18 }); 19 20});
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
クッキー対応版
F5だけ不具合があります。カラムの上下移動にも対応しています。
コピペして一切修正せずに、ローカルで動作確認完了したら、本番に反映してください。
lang
1<html> 2<head> 3<meta http-equiv="content-type" content="text/html;charset=utf-8" /> 4<!--jQuery UI Core, Widget and Button components are mandatory--> 5 6<!-- 7 jQuery-UI download: 8 http://jqueryui.com/download/ 9 jQUery-Cookie download: 10 https://github.com/carhartl/jquery-cookie/releases 11 jQuery 1.11.2 download 12 http://jquery.com/download/ 13 Download the compressed, production jQuery 1.11.2 14 15 Google Chrome で動作しない件について 16 http://goweb.jp/blog/2011/05/27/1497/ 17 chrome はローカル環境では、クッキーを生成しないとか。 18 19 動作確認ブラウザ: 20 windows IE9 21 windows Firefox 20.0.1(ちょっと古いですね) 22 mac osx Safari 23 動作確認ができていないブラウザ 24 mac osx Chrome 25 windows 版はインストールしてないので知らず 26 27 28 29 30--> 31<link href="jquery-ui-1.11.2.custom/jquery-ui.css" rel="stylesheet"/> 32<link href="jquery.appendGrid-1.5.1/jquery.appendGrid-1.5.1.css" rel="stylesheet"/> 33<script type="text/javascript" src="jquery-1.11.2.min.js"></script> 34 35<script type="text/javascript" src="jquery.cookie.js"></script> 36 37<script type="text/javascript" src="jquery-ui-1.11.2.custom/jquery-ui.js"></script> 38<script type="text/javascript" src="jquery.appendGrid-1.5.1/jquery.appendGrid-1.5.1.js"></script> 39 40 41<script type="text/javascript"> 42$.cookie.raw = true; 43$(function () { 44 45 var tblSelector = "#order"; 46 47 var initData = restoreCookies2JsonData(); 48 49 // ここからappendGrid 初期化 50 $(tblSelector).appendGrid({ 51 caption:'', 52 initRows:1, 53 columns:[ 54 {name:'品番',display:'品番',type:'text',ctrlAttr:{maxlength:100},ctrlCss:{width:'100px'}}, 55 {name:'品名',display:'品名',type:'text',ctrlAttr:{maxlength:100},ctrlCss:{width:'250px'}}, 56 {name:'色',display:'色',type:'text',ctrlAttr:{maxlength:20},ctrlCss:{width:'100px'}}, 57 {name:'サイズ',display:'サイズ',type:'text',ctrlAttr:{maxlength:4},ctrlCss:{width:'40px'}}, 58 {name:'数量',display:'数量',type:'text',ctrlAttr:{maxlength:4},ctrlCss:{width:'40px'}} 59 ], 60 hideButtons:{ 61 moveUp:true, 62 moveDown:true, 63 removeLast:true 64 } 65 }); 66 67/* 68 $(tblSelector).appendGrid({ 69 caption: 'My CD Collections', 70 initRows: 1, 71 columns: [ 72 { name: 'Album', display: 'Album', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '160px'} }, 73 { name: 'Artist', display: 'Artist', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '100px'} }, 74 { name: 'Year', display: 'Year', type: 'text', ctrlAttr: { maxlength: 4 }, ctrlCss: { width: '40px'} }, 75 { name: 'Origin', display: 'Origin', type: 'select', ctrlOptions: { 0: '{Choose}', 1: 'Hong Kong', 2: 'Taiwan', 3: 'Japan', 4: 'Korea', 5: 'US', 6: 'Others'} }, 76 { name: 'Poster', display: 'With Poster?', type: 'checkbox' }, 77 { name: 'Price', display: 'Price', type: 'text', ctrlAttr: { maxlength: 10 }, ctrlCss: { width: '50px', 'text-align': 'right' }, value: 0 }, 78 { name: 'RecordId', type: 'hidden', value: 0 } 79 ] 80 }); 81*/ 82 // クッキー保存値があればそれを復帰する 83 if (initData.length > 0) { 84 //alert("initData.length = " + initData.length); 85 86 $(tblSelector).appendGrid("load", initData); 87 } 88 89 $(tblSelector).on("click blur", "input,select",function() { 90 91 window.saveCookie(); 92 }); 93 94 window.saveCookie = function() { 95 // シリアライズデータをクッキーに保存 96 $.cookie( 97 "GRID2", 98 $(document.forms[0]).serialize(), 99 1); // 有効期限(1日) 100 } 101 102 // 初期化ここまで 103 // クッキーをデコードし、appendGrid("load",data); 104 // を実行する。 105 function restoreCookies2JsonData() { 106 var cookies = $.cookie("GRID2"); 107 108 // このプレフィックスとsuffixの "_x" を除去したものがカラムのラベル名になる 109 var colNamePrefix = $(tblSelector).attr("id") + "_"; 110 var rowOrderName = colNamePrefix + "rowOrder"; 111 112 // appendGrid "load" 用 JSON データを作成する 113 var initData = []; 114 115 //alert(cookies); 116 117 if (cookies) { 118 var map = []; 119 // クッキー登録パラメータを展開する。 120 // 変数名_x "_x" が行番号なので、これを取得して各行のマップリストを作成する 121 $(cookies.split("&")).each(function() { 122 var keyVal = this.split("="); 123 var key = decodeURI(keyVal[0]); 124 var val = decodeURI(keyVal[1]); 125 var rowIndex = key.substring(key.lastIndexOf("_") + 1); 126 127 if (!map[rowIndex]) { 128 map[rowIndex] = {}; 129 } 130 map[rowIndex][key] = val; 131 }); 132 133 // 並べ替え順序を退避し、配列に変換する 134 var rowOrders = null; 135 if (map["rowOrder"][rowOrderName]) { 136 rowOrders = eval("[" + 137 map["rowOrder"][rowOrderName].replace(/\%2C/g, ",") + "]");; 138 } else { 139 rowOrders = []; 140 } 141 delete map["rowOrder"]; 142 143 // 仮配列に各行のマップを詰める 144 var tmpArr = []; 145 for (var x in map) { 146 var colMap = []; 147 var entryCount = 0; 148 for (var z in map[x]) { 149 if (z.indexOf(colNamePrefix) == 0) { 150 var colName = z.substring(colNamePrefix.length); 151 colName = colName.substring(0, colName.lastIndexOf("_")); 152 colMap[colName] = map[x][z] || ""; 153 entryCount += 1; 154 } 155 } 156 if (entryCount > 0) { 157 tmpArr.push(colMap); 158 // alert(map2(colMap)); 159 } 160 } 161 // rowOrder を適用する 162 // alert(rowOrders); 163 for (var i=0;i < rowOrders.length;i++) { 164 // 行の順序は、1から始まる。3、1、2のとき、 165 // tmpArr は、1、2、3と入っているので、これを 166 // 正しい順序に直す。 167 168 initData.push(tmpArr[rowOrders[i] - 1]); 169 } 170 } 171 return initData; 172 } 173 174 function map2(m) { 175 var arr = []; 176 for (var a in m) { 177 arr.push(a + "=>" + m[a]); 178 179 } 180 return arr.join(", "); 181 } 182}); 183</script> 184</head> 185<body> 186<form> 187 Mail:<input type="text" name="mailAddress" /><br /> 188 Name:<input type="text" name="userName" /><br /> 189 <div id="gridOuter"> 190 <table id="order"></table> 191 </div> 192 <button onclick="saveCookie();">送信</button> 193</form> 194<hr /> 195<p>このサンプルが動作するための必要構成</p> 196<pre> 197 appendGridDemo/ 198 jquery-1.11.2.min.js 199 jquery.cookie.js 200 jquery.appendGrid-1.5.1/ 201 jquery.appendGrid-1.5.1.css 202 jquery.appendGrid-1.5.1.js 203 jquery-ui-1.11.2.custom/ 204 jquery-ui.css 205 jquery-ui.js 206 jquery-ui.min.css 207 demo.html (このHTMLのファイル) 208 209※Mac OSX Safari で動作確認済み 210 211※動作内容 212 一覧のクリック、フォーカスIN でクッキーに入力内容を保存する。 213 送信ボタン(submit)でクッキーに入力内容を保存する。 214 ページリロード(F5)では保存されません。注意!! 215 再表示(初期表示含む)時、クッキーを読み込み、クッキーに前回の値が 216 保存されているときだけ appendGrid の初期データを生成して appendGrid を初期化する 217 クッキー保存日数は1日です。 218 とりあえず、これをコピペして、そのまま動作させてみてください。 219 問題なければ、本番に適用となります。 220 手順1:JavaScript を開始・終了タグまるごとコピーし、本番に貼り付けます。 221 手順2:appendGrid のテーブルタグをフォームの中に入れてください。 222 手順3:appendGrid の id が order ならばこのままでOKです。違う場合は、メソッド戦闘に tblSelector 変数 223 があるのでそれを書き換えてください。 224 手順4:送信ボタン用のメソッドがあるので、送信ボタンに設定してください。 225 jQuery で設定する場合は、 226 $("ボタンID").click(function() { window.saveCookie() }); 227 228 229 追記: appendGrid のテーブル名が"order" で、 他に "order_xxxx" とかフォーム要素が 230 あるとまずいことになります。 231 232 以上です。 233 234</pre> 235 236</body> 237</html> 238 239 240
投稿2015/02/03 08:07
総合スコア1693
0
>>PS. appendGridで追加した複数行に入力した全ての内容がメールで送信出来ております。
これ聞いて安心しました。複数行がメールフォームに記載できないのでは?と思っていました。
なので、自分の仕事は、当初の目的どおり、クッキーを使った例を示します。
クッキーは1日を設定しました。
別途、保存した情報から自動的に行数を算出して JSON パラメータを作成したものをアップしますね。
lang
1<html> 2<head> 3<!--jQuery UI Core, Widget and Button components are mandatory--> 4 5<!-- 6 jQuery-UI download: 7 http://jqueryui.com/download/ 8 jQUery-Cookie download: 9 ? 10 jQuery 1.11.2 download 11 jQuery HP 12 13 14--> 15<link href="jquery-ui-1.11.2.custom/jquery-ui.css" rel="stylesheet"/> 16<link href="jquery.appendGrid-1.5.1/jquery.appendGrid-1.5.1.css" rel="stylesheet"/> 17<script type="text/javascript" src="jquery-1.11.2.min.js"></script> 18 19<script type="text/javascript" src="jquery.cookie.js"></script> 20 21<script type="text/javascript" src="jquery-ui-1.11.2.custom/jquery-ui.js"></script> 22<script type="text/javascript" src="jquery.appendGrid-1.5.1/jquery.appendGrid-1.5.1.js"></script> 23 24 25<script type="text/javascript"> 26$.cookie.raw = true; 27 28 29$(function () { 30 31 var saveRows = $.cookie("ROWS") || 1; 32 33 //alert(saveRows); 34 35 $('#tblAppendGrid').appendGrid({ 36 caption: 'My CD Collections', 37 initRows: saveRows, 38 columns: [ 39 { name: 'Album', display: 'Album', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '160px'} }, 40 { name: 'Artist', display: 'Artist', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '100px'} }, 41 { name: 'Year', display: 'Year', type: 'text', ctrlAttr: { maxlength: 4 }, ctrlCss: { width: '40px'} }, 42 { name: 'Origin', display: 'Origin', type: 'select', ctrlOptions: { 0: '{Choose}', 1: 'Hong Kong', 2: 'Taiwan', 3: 'Japan', 4: 'Korea', 5: 'US', 6: 'Others'} }, 43 { name: 'Poster', display: 'With Poster?', type: 'checkbox' }, 44 { name: 'Price', display: 'Price', type: 'text', ctrlAttr: { maxlength: 10 }, ctrlCss: { width: '50px', 'text-align': 'right' }, value: 0 }, 45 { name: 'RecordId', type: 'hidden', value: 0 } 46 ] 47 }); 48 49 50 $("#tblAppendGrid").on("blur", "input,select",function() { 51 52 //alert("名前:" + $(this).attr("id") + " / 値:" + $(this).val() + " / 有効日:1"); 53 54 //alert($(document.forms[0]).serialize()); 55 56 // シリアライズデータを退避 57 $.cookie( 58 "GRID", 59 $(document.forms[0]).serialize(), 60 1); // 有効期限(1日) 61 62 63 //alert("f行数は:" + $("#tblAppendGrid tbody")[0].childNodes.length); 64 65 // グリッドの行数を退避 66 $.cookie( 67 "ROWS", 68 $("#tblAppendGrid tbody")[0].childNodes.length, 69 1); 70 71 //alert("クッキー登録済み:" + $.cookie("GRID")); 72 }); 73 74/* 75 $("#gridOuter").on("", "",function() { 76 // グリッドの行数を退避 77 //alert("f行数は:" + $("#tblAppendGrid tbody")[0].childNodes.length); 78 $.cookie( 79 "ROWS", 80 $("#tblAppendGrid tbody")[0].childNodes.length, 81 1); 82 }); 83*/ 84 85 var cookies = $.cookie("GRID"); 86 87 $(cookies.split("&")).each(function() { 88 var keyVal = this.split("="); 89 var key = decodeURI(keyVal[0]); 90 var val = decodeURI(keyVal[1]); 91 92 var item = $("#" + key); 93 94 // チェックボックスとラジオボタンは、val が "" ブランクのとき、チェック無しとする 95 if (/(checkbox|radio)/i.test(item[0].type)) { 96 item.attr("checked", val != null && val != "" ? "checked" : ""); 97 } else { 98 item.val(val || ""); 99 } 100 }); 101 102}); 103</script> 104</head> 105<body> 106<form> 107 <div id="gridOuter"> 108 <table id="tblAppendGrid"></table> 109 </div> 110 <button>送信</button> 111</form> 112</body> 113</html> 114
投稿2015/02/03 04:27
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/03 13:46
0
http://mypacecreator.net/blog/archives/2063
このHPを見ると、入力項目が細かくてフロントの見た目に凝りたい場合はカスタムで!
ってかいてあります。
PHPができないとまずいのでは?
appendGrid は、画面で「+」を押すと入力行が追加され、「−」を押すと入力行が減ります。
つまり、入力可能な行数が可変なのですが、この可変という部分がまずポイントになるかと。
wordpress のHPを結構見てみました。MW_WP_Formメールフォームと jQuery を連携する
場合の具体的なやり方を書いている人が居ないか探しました。
MWメールフォームプラグインの管理画面では、ベタのHTMLはゴリゴリ記述可能なようですが、
appendGrid は入力のパラメータに基づいて画面を動的に構築します。なので、最初に言った
初期値をJSON形式で設定すればいけるんじゃ?ないの、という話は管理画面では記述できない
ようです。そもそも、JavaScript に変数の内容を埋め込む、というやり方も出来なさそうで
すし。
無理やりこじつけで実装する場合もなくはないとおもいますが、僕が知りたいのは以下の通りです。
これがわかればたぶん、appendGrid でもいけるとおもいますが、行数が「可変」するという部分
に関しては制限が必要になるかもしれません。例えば最大10行まで入力可能として、最初から10
行出しておく、あるいは、「+」ボタン押下で最大行数を判定するか、appendGrid に最大行数の
設定が可能かもしれませんが。。。
知りたいこと
(1)ワードプレスで作成したメールフォームのHTMLが知りたい。
品番、品名、色、数量、を2個ずつ管理画面に記述して、生成された画面のHTMLソースの
これらの入力欄のHTMLを見せてください。
管理画面でフォームを記述する場合、同じ名前だと配列で取れるのか、同じ名前はNGで
部品1個につき固有の名前である必要があるのかを確認してください。
※ワードプレスの管理画面に記述したフォームは、F5や画面を更新(SUBMITボタン)しても
入力内容は保持されるのですよね?
たぶん、上記HPの作者さんは、凝った画面の場合はPHPをガリガリ描いたほうがいいみたいなこと言っているのでワードプレスとPHPに詳しい方の意見も聞いたほうがいいとおもいます。自分は残念ながらPHPは疎いです。
僕の「知りたいこと」から実現可能な画面は、
(1)「+」ボタンは無限に押せない。最大入力行数に制限をかける必要がある。
(2)(1)の制限以外はすべて JavaScript で実現し、PHPなどは使わない。
(3)最大行数が例えば5行のとき、品番、品名、色、数量、サイズ、で合計5項目x5行=25項目を
あらかじめ定義しておき、画面上見えないように配置する(CSSで非表示にする)。隠しておいた
フォーム内容を画面の onload で appendGrid に設定する。
(4)送信ボタン押下時に、イベントをハンドルして、appendGridの入力内容を隠してあるフォームに
貼り付けてから送信する。
MW_WP_Form プラグインのフォームがF5や送信ボタン押下前後の入力内容が保持されるのは、管理画面に
証跡があるからだと踏んでいます。つまり、管理画面にフォーム部品として定義したものだけが入力内容が
保持されると。なので、最大行数に制限を設ける、というのは管理画面の制約になります。
以上です、考え方間違っているかもしれませんが、PHPで専用フォームを作った方が早いとおもいますが、
PHPに詳しくない自分にはなんとも言えません。JavaScript だけでできる範疇での回答になります。
たぶんですが、送信されるメール内容も、画面の入力行数が5行なら、メール本文も5行固定になる
かもしれません。2行しか入力していなくても、5行(残り3行はブランク?)になります。
JavaScriptだけだとこれが限界だと思いますね。
いっぱい書いといて、、、、最初の質問読み返してふと疑問が・・・
>入力した内容をメールで送信すると云う寸法ですが、メールの送信自体は問題無いのですが
>入力した内容をCookieで保持したいのですが方法が分かりません。
これって、appendGrid で2行入力しても、メールに2行の入力内容が貼り付けられるとこまでは完成している、ってことですか?だから本当に、知りたいのはクッキーで送信前の値を保持しておいて、入力内容が消えない
ようにしたいってことだけなんですか?
appendGrid のシリアライザーは、
「品番」カラムが3個あるとき、品番1, 品番2, 品番3 て感じで通し番号を割り振ります。
数字部分が行番号になるわけです。
投稿2015/02/02 14:26
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/02 16:24
退会済みユーザー
2015/02/02 23:40
0
メール送信用データがフォーム送信されてきたら、
再表示用の画面を作る PHP?JSP?内で、
lang
1 $('#tblAppendGrid').appendGrid('load', [ 2 { 'Album': 'Dearest', 'Artist': 'Theresa Fu', 'Year': '2009', 'Origin': 1, 'Poster': true, 'Price': 168.9, 'RecordId': 123 }, 3 { 'Album': 'To be Free', 'Artist': 'Arashi', 'Year': '2010', 'Origin': 3, 'Poster': true, 'Price': 152.6, 'RecordId': 125 }, 4 { 'Album': 'Count On Me', 'Artist': 'Show Luo', 'Year': '2012', 'Origin': 2, 'Poster': false, 'Price': 306.8, 'RecordId': 127 }, 5 { 'Album': 'Wonder Party', 'Artist': 'Wonder Girls', 'Year': '2012', 'Origin': 4, 'Poster': true, 'Price': 108.6, 'RecordId': 129 }, 6 { 'Album': 'Reflection', 'Artist': 'Kelly Chen', 'Year': '2013', 'Origin': 1, 'Poster': false, 'Price': 138.2, 'RecordId': 131 } 7 ]);
こうしてあげれば良いかと。
サンプルそのまま貼り付けただけですが。
投稿2015/02/02 06:50
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/02/02 07:10
2015/02/02 07:59
2015/02/02 08:03
2015/02/02 08:09
退会済みユーザー
2015/02/02 09:21
0
Demo の Load Data サンプルのHTMLサンプルコードを見ると、初期値は JSON 形式で指定できるようですよ。
クッキー使わなくてもいけるのでは?
投稿2015/02/02 05:40
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/02/02 06:44
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/02/03 13:43
2015/02/03 14:02
2015/02/03 14:06
退会済みユーザー
2015/02/03 14:10
2015/02/03 14:14
2015/02/03 14:19
退会済みユーザー
2015/02/03 14:34
2015/02/03 14:55
退会済みユーザー
2015/02/03 15:16
2015/02/04 06:23
2015/02/04 06:47
退会済みユーザー
2015/02/05 15:13