Formulaire avec method GET

danielsandanielsan Member
juillet 2012 modifié dans Entraide
Bonjour à vous,


je souhaite faire un formulaire dans une page static avec la méthode GET.

J'ai un sérieux doute et trou de mémoire sur le fonctionnement ...
Car ça me redirige sur la page /index.php?dep=06 ... d'où une erreur pour article inconnu !
Je souhaite une redirection vers /index.php?static2/nos-revendeurs&dep=06
( note: la méthod en post fonctionne bien, je souhaite passer en get pour un partage d'url )


Quel est l'action à renseigner pour le formulaire ?


Voici mon code actuel:
<form action="<?php $plxShow->urlRewrite("index.php?static2/nos-revendeurs"); ?>" method="get">
	<label for="dep"><h3>Entrez un code d&eacute;partement</h3></label>
	<INPUT type="text" name="dep" size="3" maxlength="3">
	<input type="submit" value="Chercher">
</form>



Le code de traitement des données de la page static2/nos-revendeurs:
<?php
$catTab = $plxShow->plxMotor->aCats; // récupération du tableau des catégories
$catUrl_rev = array(); // création d'un tableau avec seulement les id catégories + url
$catName_rev = array(); // création d'un tableau avec seulement les id catégories + nom

foreach($catTab as $k=>$value) {
	$catUrl_rev[$k] = $catTab[$k]['url'];
	$catName_rev[$k] = $catTab[$k]['name'];
}

if (isset($_GET["dep"]) AND !empty($_GET["dep"]) ){ // récupération des données formulaires
	if(in_array("dep-".$_GET["dep"], $catUrl_rev)) { // vérification de l'adéquation du paramètre avec nos données possibles
		$get_dep = "dep-".$_GET["dep"]; // article du département
		$catNum = intval(array_search($get_dep, $catUrl_rev)); // formatage du numéro de la catégorie
		$catName = array_search($get_dep, $catName_rev); // définition du nom de la catégore
	}else{
			echo "<p>Code d&eacute;partement non valide</p>\n";
	}
} else{}

$urlCat = "index.php?categorie".$catNum."/".$get_dep; // formatage de l'url de la catégorie visée
$catSearch = str_pad($catNum, 3, "0", STR_PAD_LEFT); // formatage du numéro de la catégorie ( 3 > 003 )

?>

Puis selon le résultat, on redirige vers la catégorie ou on affiche un message d'erreur:
<?php
if($get_dep){
	$motif = '/^[0-9]{4}.+'.$catSearch.'+.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
	if($aFiles = $plxMotor->plxGlob_arts->query($motif,'art','rsort', 0, false, 'before')) { // s'il y a des articles dans la catégorie visée
		header('Location: '.$urlCat); // on redirige vers la catégore
	}else{ // sinon message d'erreur
		echo "<p>Contactez-nous</p>";
	}
}else{} ?>


Quelqu'un a une idée ?

Merci.
_____
D.San

Réponses

  • Le problème doit venir de l'objet $plxShow qui n'est pas initialisé :
    Place la ligne
    <?php $plxShow = plxShow::getInstance(); ?>
    au début de ta page

    Edit : Préfère <?php global $plxShow; ?>, qui est plus performant.
  • Bonjour Amoweb,


    ça ne change rien. Les 2 solutions écrites autant au début de la page static, ou du formulaire ( il est à part et est intégré un peu partout sur le site ... ), ou dans le header.php.

    Qu'entends-tu par "$plxShow qui n'est pas initialisé", s'il ne l'était les fonctions de cet objet fonctionneraient quand-même ?


    Merci de ton aide.
  • J'ai pensé que ton problème ne venait pas du script de traitement (que je n'ai pas testé), mais de ton formulaire. J'ai donc commencé à tester la ligne <?php $plxShow->urlRewrite("index.php?static2/nos-revendeurs"); ?> qui me renvoyait http://serveur/localhost/.
    Que renvoie cette ligne chez toi ?


    Pour que cette ligne fonctionne :
    Il te faut avoir mis <?php global $plxShow ?> en amont.


    NB. J'ai parlé de $plxShow non initialisé, car si on veut avoir accès aux fonctions de plxShow, il faut que la variable $plxShow contienne une référence vers un objet plxShow. C'est ce que permet de faire le global ou le getInstance.
  • <?php $plxShow->urlRewrite("index.php?static2/nos-revendeurs"); ?>
    
    affiche http://localhost/le-site/index.php?static2/nos-revendeurs


    ça joue donc bien sa fonction ... sans avoir mis le plxShow en global en amont ( il doit y être déjà quelque part ... ;) mais je n'ai pas le souvenir de l'avoir mis ! ^^^)
  • Le problème vient du fait que l'url rewriting n'est pas activée.

    Il y a un ? dans ton url. Après validation de ton formulaire ça en ferait deux... ce qui n'est pas possible...

    http://localhost/le-site/index.php?static2/nos-revendeurs?dep=26

    Donc, il faut que tu actives l'url rewriting (en plus c'est plus joli... :-))
  • merci de t'être penché sur mon soucis.
    Je vais continuer de creuser dans ce sens ( l'url est bien devenue comme je l'attendais, mais ça bloque après apparemment ... ).
    Normalement le script devrait fonctionner avec ou sans l'urlRewriting.
    ( je l'active une fois tout le site fini, publié etc ... )
  • Par contre, pense à toujours protéger tes $_GET (et $_POST aussi d'ailleurs).

    Fais un $_GET = intval($_GET); pour être sûr que ta variable ne contienne que des chiffres.
  • je la compare avec les données d'un tableau ...
  • Ah oui exact...
  • StéphaneStéphane Member, Former PluXml Project Manager
    Hello
    Initialise proprement tes variables car si on passe pas dans ton if, $catNum et $get_dep sont pas définis, or tu les utilises plus bas dans ton code. Si ton environnement de dev est bien paramétré, tu devrais avoir des warnings.

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • alors:

    j'ai fait un test dans un PluXml propre et vierge:

    dans le template static par défaut
    <?php include(dirname(__FILE__).'/header.php'); ?>
    
    	<div id="section">
    
    		<div id="article">
    
    				<h2><?php $plxShow->staticTitle(); ?></h2>
    				<div class="static-content"><?php $plxShow->staticContent(); ?></div>
    
    				<?php $plxShow->get(); // va afficher le get envoyé par le formulaire ?>
    				
    				<form action="<?php $plxShow->urlRewrite("index.php?static1/static-1"); ?>" method="get">
    				<label for="dep">Pour la France, entrez un code d&eacute;partement</label>
    				<INPUT type="text" name="dep" class="search_dep" size="3" maxlength="3">
    				<input type="submit" value="Chercher" class="submit btn-form">
    				</form>
    				
    				
    		</div>
    
    		<?php include(dirname(__FILE__).'/sidebar.php'); ?>
    
    	</div>
    
    <?php include(dirname(__FILE__).'/footer.php'); ?>
    

    avec le mode urlRewrite activé:

    si on met 06 dans le champ recherche, cela devrait m'afficher 06 sur la page ... mais non ça n'affiche que "static1/statique-1"


    C'est moi ou il y a un bug quelque part ..?
  • décidément !


    GROSSE RECTIFICATION: les codes ci-dessus étaient écrits dans le template static-revendeurs.php ( et la page static2/nos-revendeurs appelait ce template ).
    ça doit changer la donne ( genre insérer global $plxShow ... qui doit-être prévu si le code est inséré dans la static ... )


    Les essais d'écritures dans le template comme dans l'article static ne change rien quant à la variable GET.
    L'url générée est du type http://localhost/le-site/static2/nos-revendeurs?dep=06
    Lorsque j'écris manuellement http://localhost/le-site/static2/nos-revendeurs&dep=06, tout se passe comme prévu.


    Est-ce que quelqu'un a déjà fait un formulaire avec la method GET ?
    La method POST me pose aussi pb lorsque l'internaute clique sur page précédente ...


    Note: je souhaite écrire ce code dans le template pour laisser libre au client de modifier le contenu de la page static


    En attendant, je vais rester en mode POST pour ma présentation de demain :cool:
  • Jerry WhamJerry Wham Member
    juillet 2012 modifié
    L'écriture http://localhost/le-site/static2/nos-revendeurs correspond déjà un passage de variables car il faut lire en fait : http://localhost/le-site/index.php?p=static2/nos-revendeurs

    Plutôt que d'utiliser $plxShow->urlRewrite(index.php?p=static2/nos-revendeurs) dans l'attribut action de la balise form, j'utiliserais plutôt $plxShow->urlrewrite() tout court et un champ input de type hidden indiquant la page à traiter (ici static2/nos-revendeurs).


    La récupération du tableau des variables passées (getGets) devrait permettre de retrouver tous ses petits.
  • je reviens car ça ne marche pas ...


    */ Déjà, lorsque j'écris ce lien
    <?php echo $plxShow->plxMotor->urlRewrite('?static2/nos-revendeurs&amp;dep=06'); ?>
    

    j'obtiens
    http://localhost/mon-site/static2/nos-revendeurs&#;dep=06
    
    le & devient &#; ( avec ou sans la réécriture de lien )

    Par contre
    <?php echo $plxShow->plxMotor->urlRewrite('?static2/nos-revendeurs&dep=06'); ?>
    
    fonctionne bien mais me renvoie une erreur W3C à cause du & seul ...


    ( j'utilise ces liens dans le footer. Il n'y a pas de formulaire )



    */ La recherche par formulaire maintenant:
    dans le template static-revendeurs.php
    <form action="<?php $plxShow->urlRewrite(); ?>" method="get">
    	<input type="hidden" name="p" id="p" value="static2/nos-revendeurs" />
    	<input type="text" name="dep" id="dep" size="3" maxlength="3" />
    	<input type="submit" value="Go !"  />
    </form>
    
    génère l'url:
    http://localhost/mon-site/?p=static2%2Fnos-revendeurs&dep=06
    

    si je tape directement dans la barre d'adresse:
    http://localhost/mon-site/index.php?static2/nos-revendeurs&dep=06
    
    tout fonctionne bien.


    C'est que je commence un peu à criser là ... :D
    Si vous avez des lumières, je suis preneur !


    Merci
    D.San
  • Est-ce que tu as essayé ça :
    <?php echo $plxShow->plxMotor->urlRewrite('?static2/nos-revendeurs'); ?>&amp;dep=06
    
  • yeah ! là c'est bon pour les liens en footer, merci !
    fallait y penser.


    Me reste la génération de l'url via le formulaire maintenant ... et je suis à court d'idée.
    Ta suggestion de mettre le paramètre "static2/nos-revendeurs" dans un champ hidden ne fonctionne pas :(


    Cordialement,
  • Jerry WhamJerry Wham Member
    juillet 2012 modifié
    Tu peux essayer comme ça :
    <form action="<?php $plxShow->urlRewrite(); ?>" method="get">
    	<input type="hidden" name="t" id="p" value="static2" />
    	<input type="hidden" name="p" id="p" value="nos-revendeurs" />
    	<input type="text" name="dep" id="dep" size="3" maxlength="3" />
    	<input type="submit" value="Go !"  />
    </form>
    

    et ensuite, en haut de page :
    if (isset($_GET['t'] && isset($_GET['dep'] && !empty($_GET['dep'] && isset($_GET['p'] && in_array($_GET['t'],array('static2'))) {
            header('location:'.$plxShow->plxMotor->urlRewrite('?'.$_GET['t']/$_GET['p']).'&amp;dep='.$_GET['dep'] );
    exit(); 
    }
    

    Je te laisse le soin de sécuriser un peu plus les $_GET, mais l'idée est là.


    PS: à la réflexion, plutôt qu'un input pour le choix du département, je mettrais un select avec tous les départements disponibles afin d'éviter les erreurs de saisie.
  • merci de te pencher sur mon pb Jerry.
    Je trouve ça quand même bizarre de passer par ce genre méthode ...
    Je devrais pouvoir renvoyer les résultats du formulaire vers une page donnée et non sur l'accueil pour refaire une redirection vers la page appropriée.
    Faudrait voir si c'est un pb de PluXml ...


    Concernant une liste de choix plutôt qu'un champ recherche:
    il y a plus de 90 départements, ça fait une sacrée liste !
    Autant faire comme dans le footer ... :D
    ( bon, ça me résoudrait pas mal de pb, je vais tenter pour voir )
  • Jerry WhamJerry Wham Member
    juillet 2012 modifié
    Oui en effet, c'est con ce que j'ai fait.
    Essaies ça :
    <form action="<?php $plxShow->urlRewrite('?static2/nos-revendeurs'); ?>" method="get">
    	<input type="text" name="dep" id="dep" size="3" maxlength="3" />
    	<input type="submit" value="Go !"  />
    </form>
    

    et ensuite, en haut de page :
    if (isset($_GET['dep'] && !empty($_GET['dep']) {
            header('location:'.$plxShow->plxMotor->urlRewrite('?static2/nos-revendeurs').'&amp;dep='.$_GET['dep'] );
    exit(); 
    }
    


    Question à deux sous : pourquoi tu tiens absolument à passer tes paramètres en get ?
    Pour résoudre le problème de la page précédente en post, essaie avec un header après traitement des tes arguments.
  • Voici mes pistes de réflexions et de solutions pour le problème évoqué dans ce post.

    http://amoweb.fr/fichiers/forum/12_0730-RAP-pagesStatiquesAmp.pdf
    http://amoweb.fr/fichiers/forum/12_0730-RAP-pagesStatiquesAmp.odt

    Amaury
  • @amoweb : Vraiment bien résumé. Tout y est. C'est vrai que tes solutions sont plus propres mais elles nécessitent de modifier le core de pluxml. Je ne sais pas quelle est la volonté de danielsan à ce sujet.


    Note pour moi-même : il faut vraiment que je me repenche sur les règles de ré-écriture du module apache !
  • wow, Amoweb c'est exactement ça.


    Je pensais que les URLs de PluXml était du style
    http://mon-site.fr/index.php?page=static1
    


    D'ailleurs, pourquoi n'avoir pas suivi ce modèle ?
    http://mon-site.fr/index.php?categorie=categorie1&page=article1
    


    Perso, je ne touche plus au core :D
    J'ai finalement fait un formulaire avec les 2 méthodes puis une redirection en fonction.


    Bien cordialement,
  • danielsan, Jerry Wham,

    Nous allons effectuer des tests sur ces modifications, et essayer de les porter nativement dans PluXml. La modification du .htaccess est obligatoire (pour moi, c'est un bug), la modification de urlRewriting est une fonctionnalité.
Connectez-vous ou Inscrivez-vous pour répondre.