2 votes

Comment pré-remplir une liste déroulante lorsque le formulaire est soumis sur la même page?

J'ai créé un filtre en utilisant un formulaire avec des listes déroulantes. Le filtre est utilisé pour filtrer les résultats d'une base de données mySQL. Le formulaire est traité sur la même page que les résultats. Je veux faire en sorte que les listes déroulantes du filtre conservent les paramètres du filtre une fois que les résultats ont été filtrés.

J'ai déjà fait cela par le passé en utilisant une session, cependant c'était quand j'utilisais une autre page pour traiter la requête. J'ai essayé d'appliquer cette même théorie mais cela ne fonctionne pas. J'ai cherché sur ce site ainsi que sur Google et je n'ai trouvé que des réponses liées à une page séparée pour le traitement.

Actuellement, le code que j'ai ne pré-remplira le formulaire qu'après avoir été soumis deux fois. La première fois qu'il est soumis, il affiche le paramètre par défaut "Sélectionner..."

Voici les sections pertinentes de mon code :

session_start();
if(isset($_SESSION['submitted_filter_values']))
{
extract($_SESSION['submitted_filter_values']);
}

Sélectionner...
 value="PDM">PDM
 value="TB">TB
 value="JNL">JNL

$_SESSION['submitted_filter_values'] = $_REQUEST;

J'ai essayé de placer la variable de session à différents endroits mais cela n'a pas fonctionné. J'ai pensé que peut-être rafraîchir la page fonctionnerait mais ensuite je me suis dit que cela supprimerait effectivement le filtre comme cela se produit lorsque je soumets le formulaire deux fois. Point intéressant à noter est que c'est très cohérent en ce sens qu'il fonctionne littéralement une fois sur deux, donc à chaque soumission impaire il ne se pré-remplit pas et à chaque soumission paire il se pré-remplit.

3voto

Chris Points 1881

Essayez ceci:

                        Sélectionner...
                         value="PDM">PDM
                         value="TB">TB
                         value="JNL">JNL

2voto

hakre Points 102271

Il s'agit d'un problème de demande et de session que vous avez. Si je suis le traitement de votre script correctement, vous avez la situation suivante :

Lors de la première soumission, la session submitted_filter_values n'est pas définie. Vous verrez que l'entrée par défaut, $prefix reste non définie.

Lors de la deuxième soumission, vous définissez ensuite la session submitted_filter_values après avoir affiché la balise select. Vous verrez toujours l'entrée par défaut ensuite en raison de cet ordre.

Lors de la troisième soumission, vous verrez le filtre de la deuxième soumission.

Lors de la quatrième soumission, vous verrez le filtre de la troisième soumission. Et ainsi de suite.

Si vous ne soumettez pas mais demandez simplement via GET, cette valeur reste cependant vous définissez également la session submitted_filter_values de retour à la valeur par défaut car $_REQUEST ne contient plus prefix.

Voir cet ordre aide également à modifier le script. Une règle de base est de gérer les variables d'entrée - définies ou non - en haut du script. En écrivant, @Chris a déjà fourni du code pour cela - j'aurais fait un peu différemment, mais son exemple montre comment cela peut fonctionner.

Je définirais tout d'abord le(s) filtre(s) en haut, les traiter un par un à la fois avec la logique de demande et de session, puis afficher le formulaire. Cela a l'avantage que vous changez la logique de données en haut et la logique de sortie dans la sortie.

 array(
        'value' => null,
        'list' => array('PDM', 'TB', 'JNL')
    )
);

$filtersSessionName = 'submitted_filter_values';

/**
 * traiter l'état de votre(s) filtre(s) avec l'entrée de la demande et l'état de session
 */
foreach($filters as $name => $filter) {

    // la demande a-t-elle la valeur du filtre définie ?
    if (isset($_REQUEST[$name])) {
        $requestValue = $_REQUEST[$name];
        // est-ce que cela valide ?
        if (in_array($requestValue, $filter['list'])) {
            $filter['value'] = $requestValue;
            $_SESSION[$filtersSessionName][$name] = $requestValue;
            continue;
        }
    }

    // la session a-t-elle la valeur du filtre définie ?
    if (isset($_SESSION[$filtersSessionName][$name])) {
        $sessionValue = $_SESSION[$filtersSessionName][$name];
        // est-ce que cela valide ?
        if (in_array($sessionValue, $filter[$list])) {
            $filter['value'] = $sessionValue;
            continue;
        }
    }
}

/**
 * afficher le(s) filtre(s) dans le formulaire
 */
?>

     $filter) { ?>

                        Sélectionnez ...

                             value="">

Cela peut être encore amélioré en utilisant des paires de clés/valeurs pour les listes de filtres, de sorte que le libellé d'un filtre puisse différer de la valeur qui est soumise. De plus, les variables $_REQUEST pourraient également être préfixées de manière à ce que le nom du filtre soit namespace avec les variables de demande comme c'est déjà le cas dans la session.

1voto

didierc Points 8128

Vous devez changer la manière dont vous traitez le résultat de votre $REQUEST.

 enregistrons-la en session

    $_SESSION['submitted_filter_values']['prefix'] = $REQUEST['prefix'];
    $prefix = $REQUEST['prefix'];

} else {  // non -> essayons de le récupérer depuis la session

   if(isset($_SESSION['submitted_filter_values']))
   {
      $prefix = extract($_SESSION['submitted_filter_values']['prefix']);
   }

}
?>

Sélectionner...
 value="PDM">PDM
 value="TB">TB
 value="JNL">JNL

En ce qui concerne extract, il est très mauvais d'utiliser cette fonction avec des entrées non fiables comme le tableau $REQUEST, qui peut contenir des valeurs non souhaitées. Imaginez quelqu'un forgeant une URL ciblant cette page avec certains paramètres remplaçant certaines valeurs dans votre script, comme vous utilisez $REQUEST, vous extrairiez ces valeurs et pourriez éventuellement écraser vos variables avec des valeurs dangereuses. C'est pourquoi je ne copie que la valeur de prefix du tableau $REQUEST.

0voto

GBD Points 9139

Je pense qu'avec votre extrait de code actuel, vous devez définir la séquence de votre code comme suit

if(isset($_REQUEST))
{
   $_SESSION['submitted_filter_values'] = $_REQUEST;
}

if(isset($_SESSION['submitted_filter_values']))
{
   extract($_SESSION['submitted_filter_values']);
   unset($_SESSION['submitted_filter_values']);
}

0voto

Andrew Fox Points 181

Après avoir réalisé que la session n'était pas une bonne idée pour mon application, car elle n'est utilisée que sur une seule page et non pas sur l'ensemble du site, j'ai adopté une approche nouvelle au problème.

En haut de mon filtre, j'ai ceci pour chaque option :

if(isset($_POST['prefix']))
    {
    $prefix = $_POST['prefix'];
    }

Ensuite dans ma liste déroulante, j'ai ceci pour chaque option :

 value="PDM">PDM

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X