pb recup input avec GET

bonjour,
jour de pluie= jour d'ordi ;)

je fais un formulaire de recherche dans une page statique :
[== PHP==]
global $plxShow;

$html = '';
$IMAGEPATH = $plxShow->plxMotor->aConf['images'];
$urlpage= "index.php?static010/plantes"; //$urlpage= $_SERVER['REQUEST_URI'];

$plante_id = plxUtils::strCheck(plxUtils::unSlash($_GET['plante']));
$gamme_id = plxUtils::strCheck(plxUtils::unSlash($_GET['gamme']));
$nom = plxUtils::strCheck(plxUtils::unSlash($_GET['nom']));

 
# champs de recherche
echo '<form method="GET" name="f_plantes" action="'.$plxShow->plxMotor->aConf['racine'].$urlpage.'">';

	# select des gammes
	$o= array();
	$o["table"]="plantes_gamme";
	$o["out"]="array";
	$gammes = $plxShow->callHook('spxdatas::getData',$o);
	echo '<span><select name="gamme" onchange="location.href = this.value;">';   //  remplace submit(); 
			echo '<option title"toutes" value="" '.$selected.'>Toutes les gammes</option>';
			foreach ($gammes as $c)
			{	$c1 = $c['plantes_gamme_id'];
				$selected = ($c1==$gamme_id) ? 'selected': '';
				$c1 =$urlpage.'&gamme='.$c1;
				echo '<option title="'.$c1.' '.$c['desc'].'" value="'.$c1.'" '.$selected.'>'.$c['gamme'].'</option>';
			}
	echo'</select></span>';

	# recherche sur un nom
	?><span><input type="text" name="nom" value="<?php echo $nom ?>" style="width:200px;" title="entrez le mot ou texte à rechercher"	placeholder="chercher par nom"
						onChange="location.href('static010/plantes&mot='+this.value)"
						/></span><?php		
	
echo '</form>';

#créer le tableau global
	$o2= array();
	$o2["table"]="plantes";
	//$o2["filter"]=$filter; //on filtrera après le tableau $plantes
	$o2["out"]="array";
	$plantes = $plxShow->callHook('spxdatas::getData',$o2);
	$fiches_selected= array(); // tableau des fiches filtrées	
	
	
# on applique les filters à tous ses enregistrements
	foreach ($plantes as $p)
	{ 	$id_fiche = $p['plantes_id'];
		if(in_array($gamme_id, explode(' ', $p['gamme']))) { $fiches_selected[].=$id_fiche;}
		if($plante_id==$p['plantes_id']) { $fiches_selected[].=$id_fiche;}
		if($nom!="" AND strpos($p['genre'],$nom)!== false) { $fiches_selected[].=$id_fiche;}
	}
	
	if ($fiches_selected=="") {$fiches_selected[].=$plantes[0];} //si aucun tri affiche première fiche
	$fiches_selected = array_unique($fiches_selected); // supprime les fiches en doublons
	$fiches_selected = array_values($fiches_selected); // remet les clefs dans un bon ordre
	$nbfiches = sizeof($fiches_selected); // compte le nombre de fiche unique
	$i=0; // rang de fiche

# on prend dans le tableau filtré et on affiche
	echo '<div class="col1">';
	foreach ($plantes as $a)	
	{	if ($a["plantes_id"]==$fiches_selected[$i]) 
		{	$famille= $a["famille"];
			$genre= $a["genre"];
			$espece= $a["espece"];
			$urlfiche= $urlpage."&plante=".$a["plantes_id"];
			$html .='<div class="resp">
					<a href="'.$urlfiche.'" alt="no photo" title="ouvrir fiche individuelle" > 
					<b>'.$famille.' '.$genre.' '.$espece.'</b>
					<img style="height:200px;" src='.$IMAGEPATH.$a["photo"].' alt="url absente" /></a>
				</div>
				';
			$i++;
		}
	}
	#affichage (prévoir sortie html2pdf)
	echo $html;
	echo '</div>';

le select fonctionne, les 3 variables aussi si elles sont saisies en direct dans l'url

avant de polluer le forum, j'ai tenté :
- de traiter input par javascript (si ça marche pour le select) : mauvaise url
- de vider, changer form action : mauvaise url
- if (isset...){header.location....} : mauvaise url
chaque fois je me tape "index.php?gamme=index.php%3Fstatic010%2Fplantes%26gamme%3D001&nom=pho"
- je n'ai pas l'urlrewriting activé

je prends tous vos conseils, merci !

Réponses

  • Pour la racine, il vaut mieux utiliser plxUtils::getRacine();
    Après, quand tu dis mauvaise url, qu'elle est l'erreur en question ?
  • paysan hardipaysan hardi Member
    janvier 2014 modifié
    merci pour le getRacine(), il servira après les tests mais là je voulais savoir où j'allais

    j'ai mis en ligne sur http://paysanhardi.free.fr/index.php?static010/plantes&gamme=001
    (imaginez un mur en pierre qui m'a ruiné les mains en background et un slider qui marche comme en local :cool: )
  • Tu as oublié la balise de fermeture de ton slider
    <script type="text/javascript" src="http://paysanhardi.free.fr/themes/domaine1/js/s3Slider.js" </script>
    
    Dans ton formulaire, le titre des options est mal écrit :
    title"toutes"
    
    au lieu de
    title="toutes"
    

    Tu mets une balise de type bloc (form) dans une balise de type inline (span). C'est pas bien.
    Tu as un span fermant qui n'est pas ouvert.(</select></span><span>)

    De manière générale, pourquoi passer par javascript pour traiter ton formulaire ? Pourquoi n'ajoutes-tu pas un bouton de soumission et un traitement par php ?

    PS : J'ai navigué un peu. Pour la météo, tu as le site http://www.tameteo.com/ plutôt que d'inclure le site de météo france dans une iframe...
  • Hello Jerry,
    j'ai corrigé le slider et tes remarques, merci, je récupèrerai le mur plus tard

    concernant mon form :

    - avec action="'.$urlpage.'" ou action="" j'obtiens : http://paysanhardi.free.fr/index.php?nom=dfsdf&gamme=index.php%3Fstatic010%2Fplantes%26gamme%3D003
    il semble y avoir une réecriture à l'envoi

    j'ai testé avec un <input submit> j'obtiens encore ces url à rallonge
    c'est la raison pour laquelle j'avais passé le select en javascript avec value="'.$urlpage.'&gamme='.$c1.'";

    en mettant le select en commentaire j'obtiens : http://paysanhardi.free.fr/index.php?nom=dfsdf
    je décommente et ça repart : http://paysanhardi.free.fr/index.php?nom=dfsdf&gamme=index.php%3Fstatic010%2Fplantes%26gamme%3D003

    là je patauge !
  • Jerry WhamJerry Wham Member
    février 2014 modifié
    Ça vient de la méthode de préchauffage de plxMotor qui vérifie que les paramètres passés dans l'url soient ceux attendus. Si on ne les trouve pas, on tombe sur une page 404.
    Il faut utiliser un plugin qui utilise le hook plxMotorPreChauffageBegin pour pouvoir récupérer tes paramètres avant le filtrage. Regarde le fichier core/lib/class.plx.motor.php ligne 128 et inspire t'en.
  • C'est vrai que tout part de l'url (id, categ, date) !!! avec plxShow on l'oublierai presque :)

    Je viens de lire plx.motor.php, je n'y rajouterai pas une condition preg_match('/^staticBibi([0-9].../) ...quoique ce serai plus rapide ?
    Je vais essayer en désossant plxMySearch ou un autre, ce sera plus propre, puis récupérer mes filtres par un callHook() dans la statique.
    Je suis sûr que vous l'avez tous déjà fait, on a tjrs besoin d'un _GET.

    Autre solution "moins propre", envoyer la variable par javascript (comme le select) mais je crains :
    - de perdre le multicritères ou de m'emm* pour le mettre en place
    - que ça ne marche que chez moi (PC vs Mac, Linux, android, etc..)

    J'ai raison sur tout ?
  • Non, en fait il faut que tu écrives un plugin qui aura pour méthodes :
    - le constructeur de base (voir un exemple dans la doc) qui se cantonnera à appeler le hook plxMotorPreChauffageBegin,
    - le hook plxMotorPreChauffageBegin dans lequel tu ajouteras ta condition pour récupérer tes variables à la façon de plxMotor.

    Il ne faut pas modifier le fichier de plxMotor pour éviter de perdre ces modifications lors des mises à jour.

    Un conseil : le javascript ne doit être utilisé que pour faciliter la vie et pas pour faire ce qui peut être fait en html/css/php.
  • Ok, je marquerais résolu qd cette page contiendra le script du plugin.
    D'ici là je posterai surement d'autres questions, le seul plugin à mon actif est une icone qui ouvre les articles dans l'administration, je mesure le temps que ça va prendre.
    Concernant les mises à jour, j'étais croyant et je ne le suis plus, quand je tiens une version stable...avec TOUS les plugins qui suivent...je ne la lache plus.
    Forcément j'ai chargé la nouvelle version 5.3+plxdatas x.x ...je testerai le transfert, mais je dois d'abord répondre à mon besoin de base botanique car elle me sert tous les jours.
  • Quelles sont les variables que tu veux utiliser et pour quel usage ?
    Exemple :
    $_GET => correspond au titre d'un article
    $_GET => correspond à l'id d'un article
    ...

    Fais moi le listing complet de ce que tu souhaites utiliser et leur correspondance...
  • paysan hardipaysan hardi Member
    février 2014 modifié
    Je t'arrête : ce ne sont pas les articles que je requête ! ce sont des entrées dans plxData (voir code)
    Dans tous les cas mon pb vient du traitement de l'url sans javascript

    La liste des champs à requêter serait trop longue (j'utilise actuellement un outil perso php+sql avec des accordéons javascript pour ne pas surcharger l'affichage)

    concernant $_GET la variable sera utilisée sur une 20aine de champs avec
    [== PHP ==]
    if($nom!="" AND strpos($p['famille'],$nom)!== false
    OR strpos($p['genre'],$nom)!== false
    OR strpos($p['espece'],$nom)!== false
    OR strpos($p['synonymes'],$nom)!== false
    ...etc.) { $fiches_selected[].=$id_fiche;}
    
  • Jerry WhamJerry Wham Member
    février 2014 modifié
    Dans ces conditions, ton plugin sera du type :
    class myplug extends plxPlugin {
    
    	/**
    	 * Constructeur de la classe myplug
    	 *
    	 * @param	default_lang	langue par défaut utilisée par PluXml
    	 * @return	null
    	 * @author	Stephane F
    	 **/
    	public function __construct($default_lang) {
    
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    
    		# Déclarations des hooks		
    		$this->addHook('plxMotorPreChauffageBegin', 'plxMotorPreChauffageBegin');
    	}
    	/**
    	 * Méthode de modification des url
    	 *
    	 * @return	stdio
    	 * @author
    	 **/
    	public function plxMotorPreChauffageBegin() {
    		$string = 'if($nom!="" AND strpos($p[\'famille\'],$nom)!== false
    OR strpos($p[\'genre\'],$nom)!== false
    OR strpos($p[\'espece\'],$nom)!== false
    OR strpos($p[\'synonymes\'],$nom)!== false
    ...etc.) { $fiches_selected[].=$id_fiche;}
    			';
    		echo "<?php ".$string."?>";
    		}
    	}
    }
    
  • paysan hardipaysan hardi Member
    février 2014 modifié
    je viens d'activer le plugin pxlStatic10 qui contient ton code
    dans ma statique j'appelle le plugin par
    [== PHP ==]
    # on applique les filters à tous les enregistrements
    	foreach ($plantes as $p)
    	{ 	$id_fiche = $p['plantes_id'];
    		if(in_array($gamme_id, explode(' ', $p['gamme']))) { $fiches_selected[].=$id_fiche;}
    		if($plante_id==$p['plantes_id']) { $fiches_selected[].=$id_fiche; $col=2;}
    		//if($nom!="" AND strpos($p['genre'],$nom)!== false) { $fiches_selected[].=$id_fiche;}
    		$plxShow->callHook('plxStatic10'); 
    		
    	}
    
    et l'url retournée est tjrs structurée http://localhost/Domaine/index.php?nom=ar&amp;gamme=index.php?static010/plantes
    j'ai raté qq chose non ?

    pour que le plugin intervienne avant l'envoi du get, c'est tout le code qui précède le tri et l'affichage qui part dans le plugin ?
    qu'est-ce qui reste dans la statique et qui part dans le plugin ?
  • Il faut que tu filtres les données avant que préchauffage ne fasse son office. Il faut ajouter une condition dans le plugin du style
    if($this->get AND preg_match('/^static([0-9]+)\/?([a-z0-9-]+)?/',$this->get,$capture)) {
    
    N'ayant pas tous les éléments à ma dispo, c'est un peut difficile de te donner tout le code.
  • Hello Jerry,
    l'intégralité du code est en début de post, mais je serais gêné que tu te tapes tout le boulot, j'ai juste besoin d'indications précises pour connaitre la procédure.
    Ce matin je testerai les filtres dans le plugin.
    Je pense préférable d'en mettre le moins possible dans le plugin:
    - pour éviter la syntaxe de tous les échappements, entre doubles et simples quotes
    - pour avoir un plugin qui puisse servir pour toutes les forms suivantes style $champ1=$plxShow->callhook('forms', 'input', 'champ1')

    bonne journée
  • Tout ce qui est affichage du formulaire et mise en forme des résultats reste dans la page statique. Par contre, tout ce qui est traitement des données (passées en get ou post) se fera via le plugin qui retournera par exemple un array.

    Le plugin peut prendre des paramètres. Relis la documentation du développeur pour savoir comment faire (globalement, les paramètres sont dans un array, chaque index correspondant à un paramètre).
Connectez-vous ou Inscrivez-vous pour répondre.