Bonjour,

Je cherche à ajouter des options dans mon panneau d'administration WordPress. Pour les inputs de textes et les radios, pas de problème. Par contre je bloque sur le changement d'état d'un input checkbox :
<label><input type="checkbox" name="option[scriptura_calendar]" value="1"<?php if(get_option('scriptura_calendar') == 1) { echo ' checked'; } ?>> Afficher le calendrier</label>

La valeur "1" est bien incrémentée dans la table d'option WP si l'on coche la case et que l'on valide le formulaire, mais comment supprimer la valeur par la suite en décochant le checkbox ? Je vois bien que mon code est incomplet, mais je n'arrive pas à mes fins...

Nota : je sais qu'il existe une fonction checked() sous WP, j'ai laissé le if pour plus de clarté pour l'instant.
Bonjour,

Peux-tu montrer le code qui permet de sauvegarder les infos dans la bdd, stp ?

L'erreur qu'il peux y avoir c'est de faire le test : si ce n'est pas empty ne pas renseigner en bdd.
Et comme une checkbox peut être empty, cela n'enregistre jamais la modification si tu la décoches.

Pour la fonction checked tu peux l'utiliser de cette façon :
<label><input type="checkbox" name="option[scriptura_calendar]" value="1" <?php checked( get_option( 'scriptura_calendar' ), 1 ); ?>> Afficher le calendrier</label>

Modifié par Raphi (14 Oct 2014 - 09:07)
Bonjour Raphi, merci d'intervenir.

Je vois ce que tu veux dire, ma fonction me permet effectivement de supprimer les options "vides" à l'aide d'un !empty, mais en l'état actuel de mes connaissances je ne vois pas comment y remédier...

Voici mon code :
	function pannel_test() {
		if(isset($_POST['pannel-update'])) {
			foreach ($_POST['option'] as $name => $value) { // options en tableau
				if(empty($value)) {
					delete_option($name); // Supprimer les options vides de la table
				} else {
					update_option($name, $value); // Créer une option si valeur existante
				}
			}
			echo '<div id="message" class="updated">';
			echo '<p>Options sauvegardées avec succès.</p>';
			echo '</div>';
		}
	?>

<tout-le-formulaire-ici>

	<?php }

Modifié par Olivier C (14 Oct 2014 - 19:28)
Ça me parait être la bonne logique dans ton code.
C'est à quel niveau que ça coince ? L'update option fonctionne correctement ?
Tu peux faire un var_dump() de $_POST['option'] sinon ?

Ah moins que la page ne te le permette pas, auquel cas, tu peux tester en stockant le contenu de $_POST['option'] dans une option de ta bdd en faisant un serialize($_POST['option']) lors du stockage.
Et un unserialize(get_option( 'scriptura_calendar' )) lors de la lecture de l'option.
L'option s'enregistre sans difficulté dans la bdd, c'est bien la suppression/remplacement de cette valeur via la checkbox qui me pose problème.

Avec mes boutons radio, aucun souci...
Tu as testé la solution de stocker le contenu de $_POST['option'] dans l'option scriptura_calendar par exemple ?
Comme ça tu verra si ce que tu passes est cohérent.

Tu écris :
function pannel_test()
{
	if(isset($_POST['pannel-update']))
	{
		update_option('scriptura_calendar', serialize($_POST['option']));
	}
?>
<tout-le-formulaire-ici>
<?php
}


Et lors de la lecture de ton option :
$scriptura_calendar = unserialize(get_option( 'scriptura_calendar' ));
var_dump($scriptura_calendar);
Bonjour,

Pour ne pas laisser ce fil sans réponse : je n'ai toujours pas trouvé la solution, mais j'ai contourné le problème en utilisant un sélect (option "oui" et "non").

Voilà pour l'instant. Merci de ton aide Raphi.
Je crois que dans un formulaire, si une case est cochée, sa valeur dans $_POST est 1 (true), mais si elle est décochée, sa valeur n'est pas 0 (false), elle n'est simplement pas définie

Il faudrait peut-être donc tester avec isset() au lieu de empty() dans le traitement du formulaire ?
Modérateur
a écrit :

Je crois que dans un formulaire, si une case est cochée, sa valeur dans $_POST est 1 (true), mais si elle est décochée, sa valeur n'est pas 0 (false), elle n'est simplement pas définie

Sa valeur est soit true soit celle definie dans "value", si cet attribut est renseigné, par contre le checkbox est bien en effet absent du tableau $_POST

Donc au lieu de

foreach ($_POST['option'] as $name => $value) { // options en tableau
  if(empty($value)) {
    delete_option($name); // Supprimer les options vides de la table
  } else {
  update_option($name, $value); // Créer une option si valeur existante
    }
}


il faudrait quelque chose comme:

  $options = array('option1', 'uneAutre', 'option3'); // Ou récupérer de quelque part la liste de toutes les options possibles
  foreach ($options as $option) {
    if(isset($_POST[$option])) {
      update_option($option, $_POST[$option]); // Créer une option si valeur existante
    } else {
      delete_option($option); // Supprimer les options vides de la table
    }
  }

Modifié par kustolovic (19 Nov 2014 - 19:08)
kustolovic a écrit :
... par contre le checkbox est bien en effet absent du tableau $_POST

Heu... si pourtant. La valeur get_option( 'scriptura_calendar' ) étant récupérée ici :
$_POST['option'] as $name => $value

Et il me semble que mon code s'apparente au votre, à ceci près que je récupère les options en tableau afin d'éviter de devoir toutes les déclarer un par une et que mes conditions font à la fois appel à isset et à empty. D'ailleurs aucun problème pour l'enregistrement de l'info dans la bdd si le checkbox est coché, c'est pour enlever cette info de la base en décochant le checkbox que j'ai un souci.

En fait, et depuis le début de ce problème, j'ai l'intuition que mon problème se situe moins au niveau du foreach que de la règle php écrite dans l'input, mais je ne sais pas comment y remédier...
Modifié par Olivier C (21 Nov 2014 - 15:21)
Modérateur
Olivier C a écrit :

Heu... si pourtant. La valeur get_option( 'scriptura_calendar' ) étant récupérée ici :

non, dans le tableau des options, tu ne reçois que les options cochées. Si tu ne coche aucune checkbox, le tableau $_POST['option'] sera donc un tableau vide. Lorsque tu écris:


foreach ($_POST['option'] as $name => $value) {
  if(empty($value)) { // Ne passera jamais dans ce test avec succès
    delete_option($name);
  } else {
  update_option($name, $value); 
    }
}

le code passera donc toujours dans le else. Car les checkbox vide, au lieu d'envoyer une valeur vide ou fausse, n'envoie juste rien du tout, contrairement à tous les autres éléments de formulaire. La seule manière de connaître les checkboxs non cochées est donc de savoir lesquelles on pourrait attendre.

Dans le code suivant:

 $options = array('option1', 'uneAutre', 'option3'); // Ou récupérer de quelque part la liste de toutes les options possibles
  foreach ($options as $option) {
    if(isset($_POST[$option])) {
      update_option($option, $_POST[$option]); // Créer une option si valeur existante
    } else {
      delete_option($option); // Supprimer les options vides de la table
    }
  }

on pourait avoir dans $options:

Array
(
    [0] => option1
    [1] => uneAutre
    [2] => option3
)

alors que dans $_POST['option'], si on a cochée que la seconde option on aura:

Array
(
    [uneAutre] => Blabla bla
)

Boucler sur l'un ou l'autre sera donc radicalement différent, surtout si on souhaite déclencher une action pour les options vides.
Modifié par kustolovic (21 Nov 2014 - 16:42)
Ok merci. Je commence à comprendre...

Je vais tenter de mettre ce procédé en place demain et je vous ferais un retour. Merci encore.