我正在使用设置API构建一个主题。我有一个包含多个子页面的顶级菜单,除了复选框之外,其他一切都很正常。我正在将选项保存到单个选项数组中。
这是我的卫生功能:
public function sanitize($input) {
$options = get_option(THEMEOPTIONS);
$fields = gosu_adminpanel_fields();
foreach ($fields as $key => $field) {
if($field[\'callback\'] == \'gosu_controls_checkbox\') { // if the field is a checkbox
if(!isset($input[$key])) {
$options[$key] = "off";
}
}
}
foreach($input as $key => $field) {
$options[$key] = $value;
}
return $options;
}
$字段是一个数组,包含所有字段数据,如类型、默认值等。
由于取消选中该选项时,不会在POST数组中发送复选框字段,因此需要进行额外的验证。
如果我使用的是单个菜单页,这将很好,但由于我使用的是多个菜单页,当我提交一个没有复选框的页面时,它会将值设置为“off”,认为用户取消选中了该框,因为该字段不存在。
我希望只有在提交了该复选框所在的页面时,才能验证该复选框,或者有其他方法可以在复选框值设置不正确的情况下进行验证。
我只想对所有主题的设置使用一个选项数组;不可能为每个页面使用变量。
我正在考虑更改“是/否”下拉列表的复选框,但这并不是一个优雅的解决方案。
SO网友:BioXD
因为我没有得到任何答案,所以我最后使用了一个变通方法,以防有人遇到同样的问题。
我用键作为值为每个复选框添加了一个隐藏字段,然后在清理功能中,我只需检查隐藏字段而不是复选框,这样我就可以判断复选框是否属于某个页面。以下是最终代码:
public function merge_options($input) {
$options = get_option(THEMEOPTIONS);
$fields = gosu_adminpanel_fields();
if(!empty($_POST)):
foreach($_POST[\'checkbox\'] as $key) {
if($fields[$key][\'callback\'] == \'gosu_controls_checkbox\') {
if(!isset($input[$key])) {
$options[$key] = "off";
}
}
}
endif;
foreach($input as $key => $value) {
$options[$key] = $value;
}
return $options;
}
您需要检查POST数组,因为作为回调函数的参数发送的数组会清除所有未注册的变量,并且确实没有必要将字段添加为设置(可能有点不安全,但它可以工作)。