我使用的是设置API,我无法让复选框工作,如果将其设置为“false”,它们甚至都不是$\\u POST,这就是重点。
Stephen Harris & Chip Bennett explained it, 但我相信他们的方法还不够简单(特别是对我来说,根本不是PHP的家伙)。我真的需要为每个表单使用一些定制的PHP函数和定制的命名提交按钮来完成这个简单的工作吗?
我的设置很像:
register_setting(\'XX_theme_settings\', \'XX_theme_settings\', \'setting_validate\' );
add_settings_section(\'theme_options\', \'Theme Options\', \'theme_options_generate\', \'page1\' );
add_settings_field( \'XX_Option1\', \'Option 1\', \'checkbox\', \'page1\', \'theme_options\', \'XX_Option1\', $args = array(\'id\' => \'checkbox1\', \'type\' => \'checkbox\') );
add_settings_field( \'XX_Option2\', \'Option 2\', \'checkbox\', \'page1\', \'theme_options\', \'XX_Option2\', $args = array(\'id\' => \'checkbox2\', \'type\' => \'checkbox\') );
然后,我使用此回调函数生成复选框:
function checkbox($args) {
$options = get_option(\'XX_theme_settings\');
echo \'<input type="checkbox" name="\'. $args[\'id\'] .\'" value="true"\'; if($options[$args[\'id\']]==true) { echo \'checked="checked\'; }; echo \'/>\';
echo $args[\'type\'];
}
现在,我需要的就是一个好的验证回调:
function setting_validate($input) {
// Firstly it should find all fields of type == "checkbox"
// (I\'m not sure why should I check which field was just being sent,
// is updating all the checkboxes from different sections a big no-no?
// it is much easier indeed.
// Now set the ones missing to false/0 and the rest to true/1.
// Then merge everything like below:
$options = get_option(\'XX_theme_settings\');
$merged = array_merge($options, $input);
return $merged;
}
所以问题是:
how to list all Settings Api checkboxes and then set the right ones to true?我想应该是这样的:
$options = array(
array(
\'id\' => \'checkbox1\',
\'type\' => \'checkbox\',
\'page\' => \'page1\',
),
array(
\'id\' => \'checkbox2\',
\'type\' => \'checkbox\',
\'page\' => \'page1\',
),
);
function setting_validate($input) {
foreach($options as $option) {
if($option[\'type\'] == "checkbox") {
//set it to 1 if sent
}
}
$options = get_option(\'XX_theme_settings\');
$merged = array_merge($options, $input);
return $merged;
}
谢谢:)
Here\'s how Chip Bennett does it exactly, 但即使有这么多好的评论,我也不知道它到底是如何工作的。
最合适的回答,由SO网友:Chip Bennett 整理而成
如果相关设置为$setting
, 并且是复选框类型,您可以这样验证它:
<?php
$valid_input[$setting] = ( isset( $input[$setting] ) && true == $input[$setting] ? true : false );
?>
在这种情况下,
$input
是传递给验证回调的表单数据,其中
$input
是一个数组。验证方法称为白名单,其中调用当前设置数组(在本例中,为
$valid_input
), 并且只有在
$input[$setting]
通过验证。
使用复选框时,如果未设置复选框,则不会在$input
大堆因此,验证它的第一步是determine if it\'s been set in $input
. 第二步是确保设置的值为true
(或\'true\'
, 或\'on\'
, 或在设置窗体中设置复选框值的任何内容)。如果这两个条件都满足,则返回true
; 否则,返回false
.
看:真的很简单。:)
编辑以下内容:
function setting_validate($input) {
foreach($options as $option) {
if($option[\'type\'] == "checkbox") {
//set it to 1 if sent
}
}
$options = get_option(\'XX_theme_settings\');
$merged = array_merge($options, $input);
return $merged;
}
。。。这不是你想要的方式。要将返回值限制为有效选项;也就是说,您希望显式地返回已知已定义的设置。如果有人可以
$input
使用其他数据(即恶意代码),您的方法只需将这些额外数据直接传递到数据库中即可。
不要执行array_merge()
. 更新每个$valid_options[$setting]
单独/单独,仅限返回$valid_options
.
流程如下:
定义当前有效的数据:
$valid_input = get_option( \'XX_theme_settings\' );
更新当前有效的数据
$input
仅当$input
通过验证/消毒然后返回更新的、当前有效的数据如果字段是动态生成的,那么您还应该在验证回调中动态地逐步执行这些字段。这是正确的foreach( $options as $option )
. 将所有这些放在一起可能会如下所示:
<?php
function setting_validate( $input ) {
// Get current setting values
$valid_options = get_option( \'XX_theme_options\' );
// Get option parameters array
// Note: XX_theme_get_option_parameters() function
// should be defined to return the array you\'ve
// defined for $options
$options = XX_theme_get_option_parameters();
// Now step through the option parameters,
// and validate each $input[$option]
foreach( $options as $option ) {
// If $option[\'type] is a checkbox
if( \'checkbox\' == $option[\'type\'] ) {
// verify that $input[$option] is set
// and is set with a valid value;
// if so, set $valid_input[$option] to 1
$valid_input[$option] = ( isset( $input[$option] && true == $input[$option] ? 1 : 0 );
}
}
// Return the updated $valid_input array
return $valid_input;
}
?>