web-dev-qa-db-fra.com

API de paramètres - le moyen le plus simple de valider les cases à cocher?

J'utilise les paramètres de l'API et je ne parviens pas à faire fonctionner les cases à cocher. Si elles sont définies sur "false", elles ne sont même pas $ _POST et c'est ce qui compte.

Stephen Harris & Chip Bennett a expliqué , mais je crois que leur façon de faire n'est pas assez simple (surtout pour moi, pas du tout PHP-guy). Ai-je VRAIMENT besoin de quelques fonctions PHP personnalisées et de boutons de soumission personnalisés pour chaque formulaire afin que cette simple opération fonctionne?

Mes paramètres ressemblent beaucoup à:

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') ); 

Ensuite, je génère des cases à cocher avec cette fonction de rappel:

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'];  
}

Maintenant, tout ce dont j'ai besoin est un bon rappel de rappel:

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;  
}

La question est donc la suivante: Comment répertorier toutes les cases à cocher Paramètres Api, puis définir celles qui conviennent sur true?

Je suppose que cela ressemblerait à quelque chose comme ça:

$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;  
}

Merci :)

Voici comment Chip Bennett le fait exactement , mais même avec tous ces excellents commentaires, je ne comprends pas comment cela fonctionne.

7
Wordpressor

Si le paramètre en question est $setting et qu'il s'agit d'un type de case à cocher, vous le validez comme suit:

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

Dans ce cas, $input correspond aux données de formulaire transmises au rappel de validation , où $input correspond à un tableau de tableaux. La méthode de validation est appelée whitelisting , où le tableau de paramètres actuel est appelé (dans ce cas, sous la forme $valid_input), et chaque paramètre du tableau de paramètres n’est mis à jour que si la valeur $input[$setting] passe la validation.

Avec les cases à cocher, si la case à cocher n'est pas set , le paramètre lui-même n'est pas renseigné dans le tableau $input. Donc, la première étape pour le valider consiste à déterminer s'il a été défini dans $input. La deuxième étape consiste à vérifier que la valeur définie est true (ou 'true' ou 'on', ou à quoi que ce soit pour lequel vous définissez la valeur de case à cocher dans le formulaire des paramètres). Si ces deux conditions sont remplies, retournez true; sinon, retournez false.

Voir: c'est assez simple, vraiment. :)

Modifier

À ce sujet:

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;  
}

... ce n'est pas exactement la façon dont vous voulez le faire. Vous voulez limiter la valeur de retour à valid options; c’est-à-dire que vous souhaitez renvoyer explicitement les paramètres que vous savez avoir définis. Si, d'une manière ou d'une autre, quelqu'un peut remplir $input avec des données supplémentaires - c'est-à-dire un code malveillant - votre méthode transmettrait simplement ces données supplémentaires à la base de données .

Ne faites pas de array_merge(). Mettez à jour chaque $valid_options[$setting] séparément/individuellement et ne renvoyez jamais que $valid_options.

Voici le processus:

  1. Définissez le actuellement valide data:

    $valid_input = get_option( 'XX_theme_settings' );
    
  2. Mettez à jour le actuellement valide data avec $input uniquement si $input réussit votre validation/désinfection.
  3. Retournez ensuite le mis à jour, actuellement valide data.

Si les champs sont générés dynamiquement, vous devez également les parcourir pas à pas dynamiquement, dans votre rappel de validation. Vous avez ceci correct, avec foreach( $options as $option ).

Cela pourrait ressembler à ceci:

<?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;
}
?>
4
Chip Bennett