Depuis un moment j’utilise le très bon plugin Caldera Forms dans sa version gratuite pour mes formulaires. Il est simple à utiliser, complet, personnalisable et extensible… En clair, tout ce qu’on attend d’un plugin WordPress !

Aujourd’hui j’ai eu un besoin particulier qui n’est pas prévu par Caldera Forms : un menu déroulant (select) avec des groupes (optgroup). En effet vous ne trouverez nulle part mention de cette possibilité pour ce type de champ. Google a beau être mon ami, sur ce coup là, il m’a lâchement abandonné. Il m’a donc fallu remonter les manches et trouver seul la solution. La voici, c’est cadeau !

Dans l’administration d’un menu déroulant, on peut très facilement gérer les valeurs (option). Pour gérer les groupes, deux possibilités : ajouter une gestion des groupes (aïe aïe) ou trouver une astuce. J’ai opté pour l’astuce ! Je suis donc parti du principe qu’une valeur commençant par le signe * serait à convertir en groupe.

Pour ce faire, il est nécessaire d’adapter le rendu final du menu déroulant. Le fichier idoine se trouve dans « caldera-forms/fields/dropdrown/field.php ». Bien évidemment, je ne vous conseillerai absolument pas de modifier ce dernier directement, vous en perdriez le bénéfice à la moindre mise à jour. Par contre, vous pouvez créer un plugin dédié, y copier et modifier le fichier en question puis expliquer à Caldera Forms qu’il doit désormais utiliser votre fichier au lieu du sien. Et tout cela grâce à un simple filtre :

add_filter( 'caldera_forms_get_field_types', function( $fields ){
	$fields[ 'dropdown'  ]['file'] = plugin_dir_path( __FILE__ ) . '/field.php';
	return $fields;
});

Ensuite, faites preuve d’un peu de malice dans votre version de field.php en encerclant le foreach avec ceci :

$hasOptOpen = false;
foreach($field['config']['option'] as $option_key=>$option){
	if(substr($option['label'], 0, 1) == '*'){
		if($hasOptOpen){
			echo '</optgroup>';
		}
		echo '<optgroup label="'.htmlspecialchars(substr($option['label'], 1)).'">';
		$hasOptOpen = true;
		continue;					
	}

Enfin adaptez la fermeture du select comme cela :

<?php if($hasOptOpen) echo '</optgroup>'; ?>
</select>

Néanmoins, attention : comme il nous a été nécessaire de copier un fichier du plugin Caldera Forms pour l’adapter, il faudra suivre les mises à jour pour vérifier que le fichier en question n’a pas été modifié. Auquel cas, vous devrez mettre à jour en conséquence votre plugin dédié.

Laisser un commentaire

Fermer le menu