STAFF BLOG スタッフブログ

Ajaxの大量POSTデータはjQuery.serialiseJSONで処理

実案件で、各区分ごとの曜日別に一括で登録する
画面設計をし、やりたくないけど実装することになったのですが
一フォーム内に無限に入力項目を増やしていき
大量データを投稿する画面設計をしてしまうとエラーを起こしてしまった。。。
max_input_varsの設定でひっかかったぽいですが
使っているサーバによっては特定のphp.ini項目の変更が難しかったり。。。(・囚・`;

データ量が多ければ、サーバのphp.iniを変更する可能性のある項目

memory_limit メモリー容量の設定
post_max_size 最大のPOSTリクエストサイズを設定
max_input_vars 一度にPOSTできる上限数を設定
upload_max_filesize 最大のアップロードファイル受付サイズを設定
max_execution_time 最大実行時間の設定

無理くりにでも大量データをPOSTし実装する場合、jQuery.serialiseJSONで対応可能

jQueryの標準の「$.stringify()」がありますが


<?php

<input type="text" name="hoge[]" value="" />
<input type="text" name="hoge[]" value="" />
<input type="text" name="hoge[]" value="" />

?>

上記のような、配列データは「$.stringify()」は対応されておりません。
そこで、jQuery.serialiseJSONのプラグインを使用すると配列データが対応可能です。
以下がソースコードになります。


## 画面html&JavaScript

<?php

<form method="post" id="input_form">

~ 入力フィールド ~

<button type="button" id="btn_send">送信する</button>

</form>

<form method="post" id="json_form">
	<input type="hidden" name="json_text" value="" />
</form>

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<link rel="stylesheet" href="/css/smoothness/jquery-ui-1.10.4.custom.min.css">
<script type="text/javascript" src="/js/jquery-ui-1.11.4.custom.min.js"></script>
<script type="text/javascript" src="/js/jquery.serialize-object.js"></script>
<script type="text/javascript">
$(document).ready(function() {

	$('#btn_send').on('click', function(){
		// 入力フォームのPOSTデータを一括でbase64エンコードする
		$('#json_form input[name="json_text"]').val($('#input_form').serializeJSON());

		$.ajax({
			url:  '処理実行URL',
			data: $('#json_form').serialize()
		}).done(function(json){
			// 処理実行後のJavaScript内容
			// ~ 処理内容 ~
		});
	});

});
</script>

?>

## コントローラー側

<?php

	public function post_exec()
	{
		// POSTしたデータをbase64デコードすると、素でPOSTしたい際の配列データと同じになります
		$post_data = json_decode(\Input::post('json_text', ''), true);

		// バリデーションrunする場合、実行メソッドの引数にbase64デコードのデータをセットするとvalidation実行可能。
		$val = \Validation::forge();
		if ( ! $val->run($post_data) )
		{
			// validationエラーがでた場合の処理内容
		}

		// base64デコードのデータからDB保存する場合
		$ins_data = array(
			'hoge1'  => \Arr::get($post_data, 'hoge1', ''),
			'hoge2'  => \Arr::get($post_data, 'hoge2', ''),
			'hoge3'  => \Arr::get($post_data, 'hoge3', ''),
		);
		$rec = \Model_モデル名::forge($ins_data);
		$rec->save();
	}

?>

ご参考まで。。

(・囚・)ノ

INDEXブログ一覧へ
CONTACTお問い合わせはこちら