根据@xfra35在我问题中的建议,我选择了第二种可能性——添加
provider_number.id
到表单本身并从那里开始。如果您有任何进一步的建议或意见,请随时与我们分享!
表单已修改,以便将值插入
provider_numbers[provider_number][] and provider_numbers[practice_site_id][]
而不是
practice_site_1, practice_site_2, etc
。这使得代码可以动态插入行
容易得多
像
*_n
不再需要跟踪。
<div class="delete-array">
放置在表单内,每当单击删除按钮时,都会插入以下内容:
<input type="hidden" name="provider_numbers[delete][]" value="' + id + '" />
.
新按钮获取下一个
AUTO_INCREMENT
值,如果一次添加多个提供者编号,则具有一些基本逻辑。(
警告:如果多个用户同时操作此功能,将中断
)
var new_id;
$('.btn-add-provider-number').click(function() {
if (typeof(new_id) === "undefined") {
$.getJSON({url:'{{ @BASE }}/provider_numbers/new_id.json', async:false}).done(function(data) {
new_id = data;
});
} else {
new_id++;
}
var newRow = ' .... ';
$('.provider-numbers').append(newRow);
}
表单提交现在看起来类似于:
Array
(
[id] => 1
[first_name] => Amy
[last_name] => Doctor
[abn] => 66627819264
[mobile] => 0472888798
[email] => amy.doctor@email.com
[provider_numbers] => Array
(
[delete] => Array
(
[0] => 6
)
[provider_number] => Array
(
[0] => 64872HJF
[1] => 182947KD
)
[practice_site_id] => Array
(
[0] => 1
[1] => 2
)
[id] => Array
(
[0] => 1
[1] => 7
)
)
)
然后使用以下代码进行处理:
$updated = [];
$provider_numbers = [];
$provider_numbers_delete = [];
foreach ($f3->get('POST') as $key => $val) {
if ($key == 'provider_numbers') {
foreach ($val as $pn_key => $pn_val) {
if ($pn_key !== 'delete') {
foreach ($pn_val as $pnk_key => $pnk_val) {
$provider_numbers[$pnk_key][$pn_key] = $pnk_val;
}
} else {
$provider_numbers_delete = $pn_val;
}
}
} else if (is_scalar($val) && $practitioner->exists($key)) {
$practitioner->set($key, $val);
$updated[] = $key;
}
}
if (!empty($provider_numbers)) {
foreach($provider_numbers as $pn) {
$provider_number->load(['id = ?', $pn['id']]);
if ($provider_number->dry()) {
$provider_number->set('practitioner_id', $f3->get('POST.id'));
}
$provider_number->copyfrom($pn);
$provider_number->save();
$updated['provider_numbers'][] = $pn;
}
}
if (!empty($provider_numbers_delete)) {
foreach ($provider_numbers_delete as $pnd) {
$provider_number->load(['id = ?', $pnd]);
if (!$provider_number->dry()) {
$provider_number->delete();
}
}
}