Bonjour à tous,
Je viens vers vous car je rencontre des soucis dans l'élaboration de mon site web , j'ai suivi la formation PHP que propose Grafikart.
Actuellement je cherche a faire un systéme d'état pour mes articles c'est a dire "Brouillon" et "En ligne",
Pour ce système j'utilise des checkbox , générer avec la fonction Form.php

Voici mon code dans ma fonction Form.php

 public function checkbox(string $key, string $label, string $value , string $options = null): string
    {

        return <<<HTML
        <div class="form-check-inline">
        <input type="checkbox" id="field{$key}" class="form-check-input" name="{$key}" value="{$value}" >
        <label class="form-check-label" for="field{$key}">{$label} </label>
        {$this->getErrorFeedback($key)}
        </div>
HTML;
    }

Actuellement je récupère bien dans ma base de donnée la valeur 1 ou 0 selon la checkbox coché. Mais je n'arrive pas a récupérer quand j'édite l'article l'état de la checkox enregistré dans la bdd.
J'ai éessayer de reprendre le même principe que pour le select dans la formation vidéos :

public function select (string $key, string $label, array $options = null): string
    {

        $optionsHTML= [];
        $value = $this->getValue($key);
        foreach ($options as $k => $v){
            $selected = in_array($k, $value) ? " selected" : "";
            $optionsHTML[] = "<option value=\"$k\"$selected >$v</option>";
        }
        $optionsHTML = implode('', $optionsHTML);
        return <<<HTML
        <div class="form-group">
        <label for="field{$key}">{$label}</label>
        <select id="field{$key}" class="{$this->getSelectClass($key)}" name="{$key}[]" required multiple >{$optionsHTML}</select>
        {$this->getErrorFeedback($key)}
        </div>
HTML;
    }

Mais je n'y arrive pas, quelqu'un aurait une piste pour m'aider a créer la partie qui me manque pour récupérer l'état des checkbox ?
Merci d'avance.

9 réponses


thugg
Réponse acceptée

Bonsoir ,
Oui c'est bien cela . La condition est dans mon exemple ecrite en ternaire .

$options = ($etatCheckbox === 1) ? 'checked' : '' 
// en français ca donne : si la valeur de la variable $etatCheckbox est strictement égale à 1 alors  la variable $options vaudra 'checked' , 
si non la variable $options vaut '' ( vide)

Si tu n'es pas à l'aise avec le ternaire , tu peux faire la même chose avec une structure if(){....}else{....}

Bonjour,
Il te faut ajouter l'attribut checked au html de ta checkbox si elle est cochée . Tu récupères l'état de la checkbox dans ta Bdd ( ici 0 si pas coché et 1 si coché) et tu ajoutes 'checked' ou pas à ta checkbox quand tu l'affiches.

Quelquechose comme çà où $etatCheckbox = la valeur retournée par la base de données ( 0 ou 1 dans ton cas si j'ai bien compris ) :

// tu détermines la valeur de $options 
$options = ($etatCheckbox === 1) ? 'checked' : '' ;
//tu envoie $options à ta fonction checkbox($key, $label, $value, $options)

public function checkbox(string $key, string $label, string $value , string $options = null): string
    {
         return <<<HTML
        <div class="form-check-inline">
        <input type="checkbox" id="field{$key}" class="form-check-input" name="{$key}" value="{$value}" {$options} >
        <label class="form-check-label" for="field{$key}">{$label} </label>
        {$this->getErrorFeedback($key)}
        </div>
        HTML;
}
gwadas
Auteur

Bonsoir thugg,
Merci pour ta réponse.
J'ai essayer ce que tu as mis mais si je suis bien la logique il faut que je fasse une condition ?
Parce que j'essaye plein de chose mais je suis pas certains de partir sur une bonne piste.
Merci d'avance

gwadas
Auteur

Bonjour,
Oui je l'avais vu , du coup je suis entrain de faire des test pour la condition , je reviens vers vous dés que j'ai réussi ou non :)
Parce que la j'essaye de faire une condition du style :
Si dans ma bdd le champe online = 0 ou 1 selon la valeur récupérer dans la bb qu'il me coche "Brouillon" ou "En ligne" .

ça a l'air bien pourtant... Si tu regardes la source générée, ça a le bon format walmartone?

gwadas
Auteur

Bonsoir,
Alors voici ce que j'ai tenter, cependant quand j'inspecte les éléments je vois bien les bonnes valeurs et le checked mais quand on regarde bien visuellement ce n'est pas la bonne checkbox qui est cocher.

Voici le code :

public function checkbox(string $key, string $label, string $value , string $options = null): string
    {

        $etat = $this->getValue($key);
        //dd($etat);
        $options = ($etat = $value) ? '' : 'checked' ;

        return <<<HTML
        <div class="form-check form-check-inline">
        <input type="checkbox" id="field{$key}" class="form-check-input" name="{$key}" value="{$value}" checked="{$options}">
        <label class="form-check-label" for="field{$key}">{$label} </label>

        {$this->getErrorFeedback($key)}
        </div>
HTML;
    }

Bonsoir, il faut que ce soit :

<input checked>

et pas

<input ckecked="checked">

et je pense que tu t´es tromper dans l´ordre de ton ternaire. si c´est true alors checked sinon rien.
Et ensuite met un triple/double egale dans ton ternaire.
je ne sais pas si je suis claire. ^^

La doc MDN
https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input/checkbox

gwadas
Auteur

Bonjour,
Oui en effet en faisant les tests j'ai pas remis dans le bon ordre :)
Par contre j'ai du rajouter "checked =" car sinon je n'avais aucun résultats.
La en remettant comme au début je me retrouve avec aucune checkbox de cocher par rapport a la valeur de la BDD et pourtant je récupère bien la valeur.
Après j'ai oublier de mettre le code de mon formulaire :

 <label ><u>Etat de l'article </u> : <?= $post->getOnline() ?></label><br>
            <?= $form->checkbox('online', 'Brouillon ', '0'); ?>
            <?= $form->checkbox('online', 'En ligne  ', '1'); ?> <br>
gwadas
Auteur

C'est bon cela fonctionne ... alors allez comprendre pourquoi du comment mais en enlever et remettant un deuxieme checkbox sa a fini par fonctionner.

Encore merci a vous deux :)

Je met le conde fonctionnel pour ceux qui aimerais comme moi utiliser ce système :

 public function checkbox(string $key, string $label, string $value , string $options = null): string
    {
        $etat = $this->getValue($key);
        $options = ($value == $etat) ? 'checked' : '' ;

        return <<<HTML
        <div class="form-check form-check-inline">
        <input type="checkbox" id="field{$key}" class="form-check-input" name="{$key}" value="{$value}" {$options}>
        <label class="form-check-label" for="field{$key}">{$label} </label>

        {$this->getErrorFeedback($key)}
        </div>
HTML;
    }