API настроек - самый простой способ проверки флажков?

Я использую API настроек, и я не могу установить флажки для работы, если они настроены на «ложь», они даже не являются $ _POST, и это точка.

Стивен Харрис & Чип Беннетт объяснил это , но я считаю, что их путь не достаточно простой (особенно для меня, а не для 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;  
}

Итак, вопрос: как перечислить все флажки Settings Api, а затем установить правильные значения в 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;  
}

Спасибо:)

Вот как это делает Чип Беннетт именно , но даже со всеми этими замечаниями я не могу понять, как это работает.

7 голосов | спросил Wordpressor 28 FebruaryEurope/MoscowbTue, 28 Feb 2012 05:51:22 +0400000000amTue, 28 Feb 2012 05:51:22 +040012 2012, 05:51:22

1 ответ


4

Если рассматриваемая настройка $setting и является типом флажка, вы проверяете ее так:

<?php
$valid_input[$setting] = ( isset( $input[$setting] ) && true == $input[$setting] ? true : false );
?>

В этом случае $input - это данные формы , переданные в обратный вызов проверки , где $input - массив массивов. Метод проверки известен как whitelisting , где вызывается текущий массив настроек (в этом случае как $valid_input), и каждый параметр в массиве настроек обновляется, только если значение в $input[$setting] проходит проверку.

С помощью флажков, если флажок не установлен установлен , то сама настройка не заполняется в $input. Итак, первым шагом для проверки этого является определить, установлено ли оно в $input . Второй шаг - убедиться, что установленное значение true (или 'true', или 'on' или что бы вы ни установили значение флажка в форме настроек) , Если оба этих условия выполнены, верните true; в противном случае return 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;  
}

... это не точно , как вы хотите это сделать. Вы хотите ограничить возвращаемое значение параметрами valid ; то есть вы хотите явно указать параметры, которые, как известно, вы определили. Если каким-то образом кто-то может заполнить $input дополнительные данные - то есть вредоносный код - ваш метод просто передаст эти дополнительные данные прямо в база данных .

Не выполняйте array_merge(). Обновляйте каждый $valid_options[$setting] отдельно /отдельно, и только когда-либо возвращайте $valid_options.

Вот процесс:

  1. Определите действующие данные :

    $valid_input = get_option( 'XX_theme_settings' );
    
  2. Обновите данные в настоящее время с помощью $input , только если $input проходит проверку /санитацию.
  3. Затем верните обновленные, в настоящее время действующие данные.

Если поля сгенерированы динамически, вы также должны выполнять их динамически, в своем обратном вызове проверки. У вас это правильно, с помощью 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;
}
?>
ответил Chip Bennett 28 FebruaryEurope/MoscowbTue, 28 Feb 2012 06:03:24 +0400000000amTue, 28 Feb 2012 06:03:24 +040012 2012, 06:03:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132