Mémos

M é m o - l a b .

Formulaires – Aller plus loin

Après avoir posé les bases dans le chapitre précédent, nous allons voir comment aller plus loin en utilisant le plugin ACF. Nous avons vu que le formulaire pouvait être développé directement en html pour un affichage frontend. ACF nous offre d’une part une technique d’intégration frontend différente et d’autre part la possibilité de gérer le formulaire et des données dans la partie admin.

Nous allons reprendre l’exemple développé dans le chapitre précédent. Un groupe de champs va être créé depuis le plugin ACF et sera appelé « Visit ». Dans ce groupe les 3 champs « lastname » (type Texte), « email » (type e-mail) et « place » (type Zone de texte) sont créés. Ce groupe est affecté au CPT « visit » (Type de publication est égal à visit).





Template.php

Affichage du formulaire
// A placer avant le get_header()
<?php acf_form_head(); ?>

...

<h1>Soumettre un lieu de visite</h1>
<?php
// Affichage du formulaire
acf_form([
    // id html du formulaire
    'id' => 'new_recette_form', 
    // identifiant du formulaire
    'post_id' => 'new_visit',
    // id du groupe de champs ACF que l’on retrouve dans
    // le dashboard : ACF > Outils > Générer le php
    'field_groups' => ['group_xxx'],
    // value du bouton submit
    'submit_value' => 'Envoyez votre avis'
]);
?>



functions.php

Traitement du formulaire
<?php 
function mytheme_save_post($post_id) {
    // On cible le formulaire validé (ici "new_visit")
    if ($post_id == 'new_visit') {
        // Tableau des valeurs entrées dans le formulaire
        $values = get_fields($post_id);

        // Cette fonction non obligatoire permet d'épurer
        // les données saisies par l'utilisateur. 
        function sanitize_data($data) {
            // Supprime les espaces (ou d'autres caractères) 
            // en début et fin de chaîne 
            $data = trim($data);
            // Supprime les antislashes
            $data = stripslashes($data);
            // Convertit les caractères spéciaux en entités HTML 
            $data = htmlspecialchars($data);
            return $data;
        }
        $lastname = sanitize_data($values['_post_title']);
        $email = sanitize_data($values['email']);
        $message = sanitize_data($values['message']);


        // Pour le traitement des contraintes de validation,
        // se rendre au chapitre "Formulaires - Validation"


        // Sauvegarde dans la base de données
        wp_insert_post([
            'post_type'  => 'visit',
            // Pending signifie que le post est en attente de publication
            // par un utilisateur possédant les droits de publication
            'post_status'  => 'pending',           
            'post_title' => $lastname,
            'meta_input' => [
                'lastname' => $lastname,
                'email' => $email,
                'place' => $place
            ]  
        ]);


        // Pour l'envoi d'un mail, se reporter au chapitre
        // "Formulaires - Envoi d'un mail"


    }
}
add_action('acf/save_post' , 'mytheme_save_post');
?>




Pour la mise en forme du formulaire il est possible d'utiliser certains paramètres que l'on peut passer en argument de la fonction ac_form(). Pour aller plus loin il faut utiliser le filtre acf/load_field qui permet par exemple d'intégrer une classe dans un champ du formulaire.

functions.php

Mettre en forme le formulaire
<?php
function mytheme_customize_forms($field) {
    // Ajout de la classe form-control de bootstrap dans tous
    // les champs du formulaire 
    $field['class'] = 'form-control';
    
    return $field;
}
add_filter('acf/load_field', 'mytheme_cusyomize_forms', 10, 1);
?>