行を持つアプリがあり、各行にはデータが含まれています。行はユーザーによって作成されます (サンプル行を複製するだけです)。
私のajax関数は次のようになります。
save : function(el) {
//Renaming the properties to match the row index and organize
jQuery('#application-builder-layout .builder-row').each(function(row) {
// Iterate over the properties
jQuery(this).find('input, select, textarea').each(function() {
// Save original name attr to element's data
jQuery(this).data('name', jQuery(this).attr('name') );
// Rewrite the name attr
jQuery(this).attr('name', 'application[rows]['+row+'][elements]['+jQuery(this).attr('name')+']');
});
});
//Looping through each row and saving them seperately with new rowkey
setTimeout(function() {
// Iterate over the layers
jQuery('#application-builder-layout .row-box').each(function(row) {
// Reindex layerkey
jQuery(this).find('input[name="rowkey"]').val(row);
// Data to send
$data = jQuery('#application-builder-layout .row-box').eq(row).find('input, textarea, select');
//$data = $data.add( jQuery('#application-builder-layout') );
jQuery.ajax(jQuery('#form').attr('action'), {
type : 'POST',
data : $data.serialize(),
async : false,
success: function( response ) {
//console.log( response );
}
});
});
}, 500);
},
これは jQuery であり、アプリケーション スタイルの形式であるため、この関数は var 内にあり、submit 関数内で呼び出されます。問題は ajax ではありません。コンソールで見ると、以前と同じようにデータが正常に保存されます。
データベースにすべてのデータを取得できない問題(最後の ajax 要求のみ) 以下の「フォーム データ」を見てください。私の ajax データがどのように見えるか、どのように DB に挿入されているか、どのように挿入されるべきかを示しています。 jsonエンコードを使用すると、通常はこれで機能しますが、最近、PHPでOOPスタイルのコーディングに切り替えたので、何か変わるかどうかわかりませんか?
PHP:
class MyApp {
const Post_Type = 'page';
public function __construct() {
// register actions
add_action('init', array(&$this, 'init'));
}
public function init() {
// Initialize Post Type
add_action('save_post', array(&$this, 'save_post'));
}
//The main save method
public function save_post($post_id) {
// Empty the builder
if($_POST['rowkey'] == 0) {
$builder = array();
}
$builder['rows'][$_POST['rowkey']] = $_POST['application']['rows'][$_POST['rowkey']];
$builder = esc_sql(json_encode($builder));
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if($_POST['post_type'] == self::Post_Type && current_user_can('edit_post', $post_id)) {
// Update the post's meta field
update_post_meta($post_id, 'MY_DATABASE', $builder);
} else {
return;
}
}
}
上記は正常に機能しますが、データを配列として挿入せず、それぞれではなく最後の ajax post 呼び出しを挿入するだけです。保存方法で何らかの方法で再構成する必要があると確信していますが、ハッキングしているだけで、ウェブ上で情報を見つけることができないため、実際に洞察を使用できます。
十分に提供したことを願っています。
私のコードの要約:ここで何が起こっているのかを明確にするために、私のアプリの基本的な HTML をいくつか紹介します。
//This gets cloned and the jQuery renames the rowkey to match the index.
<div class="row-box">
<input type="hidden" name="rowkey" value="0">
<div class="builder-row">
<textarea style="display: block;" name="html"></textarea>
<textarea style="display: block;" name="breakingbad"></textarea>
</div>
</div>
要約すると、4 つの行があるとします。jQuery は各行の名前を変更し、それぞれをループして、それぞれに対して ajax 呼び出しを送信します。次に、PHP が $_POST を処理します。カスタム DB を使用する以前のアプリケーションでは動作するようになりましたが、wp データベースを使用すると問題が発生します。メソッドに何か不足している可能性があります。
フォーム データ: ajax フォーム データは次のようになります (これは、コンソール (firbug) またはネットワーク (chrome) で見つけることができるヘッダー内のフォーム データです)
//First element
rowkey:0
application[rows][0][elements][html]:A
application[rows][0][elements][breakingbad]:123
次に、別の行がある場合は ajax が再度投稿します
//Second element
rowkey:1
application[rows][1][elements][html]:B
application[rows][1][elements][breakingbad]:456
などなど、データベースは次のようになります
{"rows":{"2":{"elements":{"html":"B","breakingbad":"456"}}}}
もっとこうあるべき
{"rows":[{"elements":{"html":"A","breakingbad":"123"},{"elements":{"html":"B","breakingbad":"456"}]}
聖なる煙のバットマン:私はそれを手に入れたと思います, それはすべて私が$_POST
答えですぐに病気の更新を処理する方法の中にあります..
データベースはこんな感じ
{"rows":[
{"elements":{"html":"A","breakingbad":"123"}},
{"elements":{"html":"B","breakingbad":"456"}}]
}
今、私は構築を続けることができます..これは大規模な頭痛の種でした..