我有一个有行的应用程序,每一行都包含数据。这些行由用户创建(只是克隆一个示例行)。
我的 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 中,并在提交函数中调用,问题不在于 ajax,在控制台中查看它可以很好地保存数据,就像我以前一样。
问题我无法将所有数据都放入数据库(只有最后一个 ajax 请求)看看下面的“表单数据”它显示了我的 ajax 数据的样子以及它如何插入数据库与它应该如何插入,我是使用 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,在以前使用我的自定义数据库的应用程序中,我让它工作,但使用 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"}]}
Holy Smokes Batman:我想我明白了,这一切都取决于我如何$_POST
尽快处理错误的更新并给出答案..
数据库看起来像这样
{"rows":[
{"elements":{"html":"A","breakingbad":"123"}},
{"elements":{"html":"B","breakingbad":"456"}}]
}
现在我可以继续构建.. 这真是令人头疼的问题。