Forum CMS Made Simple FR

Version complète : [Résolu]UDT : Ajax + requête SQL
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: #1.10.3
#~ Url du site :
#~ Hébergeur / Soft : OVH
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~

Bonjour,

je souhaite mettre en place un système d'affichage "dynamique" pour mes données stocker dans ma BDD. Je souhaite donc faire l'affichage dans la même page.

Je suis parti de cet exemple : http://www.w3schools.com/php/php_ajax_database.asp

Code :
[== PHP ==]
echo '<script type="text/javascript">
function showUser(str)
{
if (str=="")
  {
  document.getElementById("txtHint").innerHTML="";
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","./uploads/getuser.php?q="+str,true);
xmlhttp.send();
}
</script>';

echo 'Sélectionnez le client : ';
echo '<form name="frm">';
echo '<select size=1 name="client" onchange="showUser(this.value)>'."\n";
echo '<option value="-1">Choisir un client<option>'."\n";  
$liste_client = $bdd->query('SELECT DISTINCT nom_entreprise FROM espacewcln ORDER BY nom_entreprise');    
while ($resultat = $liste_client->fetch()) {
echo '<option value="'.$resultat['id_client'].'">'.$resultat['nom_entreprise'];
echo '</option>'."\n";
}
echo '</select>'."\n";
echo '</form>';

Ma liste de nom d'entreprise s'affiche bien, mon fichier getuser.php :
Code :
[== PHP ==]
/* Connexion BDD */

$q=$_GET["q"];

$test= $bdd->query("SELECT nom_entreprise ,id_question_reponse, question,reponse,statut,site,date_creation FROM espacewcln WHERE id_client = '.$q.' ORDER BY STR_TO_DATE(date_creation, '%Y-%m-%d') DESC LIMIT 0, 10");

Mais hélas ça ne fonctionne pas, il n'a pas l'air de récupérer ma variable. Pensez vous déjà que c'est possible et si oui avez vous une idée

Merci
1er point : Pourquoi utiliser cmsmadesimple si tu place ton code PHP dans des fichiers pas sécurisés, que dalle ?

Citation :xmlhttp.open("GET","./uploads/getuser.php?q="+str,true);

Transforme moi vite ca en une UDT dans une page avec une URL précise :

Citation :xmlhttp.open("GET","{/literal}{root_url}{literal}"/index.php?page=truc&q="+str,true);


2eme point : J'ai quand même l'impression que tu aimes faire compliqué quand c'est faisable simplement toi... Rolleyes

JQuery.get : http://api.jquery.com/jQuery.get/
Connexion Bdd : http://www.cmsmadesimple.fr/blog/16/15/R...imple#main

3eme point : astuce gratuite du jour :


Citation :{/literal}{root_url}{literal}"/index.php?page=truc&q="+str

amènera vers une page avec le contenu de l'UDT mais également avec tout le template, ce que tu ne recherches pas. Pour cela tu ajoutes un paramètre spécial cmsmadesimple

Citation :&showtemplate=false

ce qui donne

Citation :{/literal}{root_url}{literal}"/index.php?page=truc&showtemplate=false&q="+str
Merci pour tes astuces,

donc maintenant j'ai deux UDT différentes, une vueArchive et une requeteArchive.

Du coup maintenant j'ai cette ligne :

xmlhttp.open("GET","{/literal}{root_url}{literal}"/index.php?page=archive&showtemplate=false&q="+str);

Avec ma page archive qui contient ma balise requeteArchive, c'est bien ça ?
oui.

A ceci près que Jquery te réduirait ton code JS avec un ratio 1:10 facile

mais oui
Donc techniquement je peux aussi faire :
Code :
[== PHP ==]
echo '<form name="frm" action="{literal}{root_url}{/literal}"/index.php?page=archive2&showtemplate=false&q="+str)>';

Pour traiter mon formulaire ?
si tu fais un echo de code contenant du smarty il te faudra forcer le parcing smarty, sinon le code HTML généré sera simplement

Code :
<form name="frm" action="{literal}{root_url}{/literal}"/index.php?page=archive2&showtemplate=false&q=maChaine)>


Au passage je te corrige :


Citation :echo '<form name="frm" action="{literal}{root_url}{/literal}/index.php?page=archive2&showtemplate=false&q='.$str.'">';

Fais gaffe aux appostrophe/guillemet et utilisation de tes variables.

Bref je te parlais de forcer le parsing Smarty. La méthode est la suivante, à coller en bas de ton UDT qui produit le code HTML/Smarty

Code :
$HTML = '<form name="frm" action="{literal}{root_url}{/literal}/index.php?page=archive2&showtemplate=false&q='.$str.'">';

//Compilation Smarty
$smarty->_compile_source('temporary template', $HTML, $_compiled );
@ob_start();
$smarty->_eval('?>' . $_compiled);
$_contents = @ob_get_contents();
@ob_end_clean();
echo $_contents;

En utilisant intelligemment la syntaxe heredoc tu t'épargnes les soucis d'ouverture/fermeture de guillemets


Code :
$HTML = <<<EOT
  <form name="frm" action="{literal}{root_url}{/literal}/index.php?page=archive2&showtemplate=false&q=$str">
EOT;

//Compilation Smarty
$smarty->_compile_source('temporary template', $HTML, $_compiled );
@ob_start();
$smarty->_eval('?>' . $_compiled);
$_contents = @ob_get_contents();
@ob_end_clean();
echo $_contents;
Donc maintenant j'ai :

Code :
[== PHP ==]
$HTML = <<<EOT
  <form name="frm" action="{literal}{root_url}{/literal}/index.php?page=archive2&showtemplate=false&q=$str">
EOT;
echo '<select size=1 name="client">';
echo '<option value="-1">Choisir un client<option>';
$liste_client = $bdd->query('SELECT DISTINCT nom_entreprise FROM espacewcln ORDER BY nom_entreprise');    
while ($resultat = $liste_client->fetch()) {
echo '<option value="'.$resultat['id_client'].'">'.$resultat['nom_entreprise'];
echo '</option>'."\n";
}
echo '</select>';
echo '<input type=submit value="Envoyer"/>';
echo '</form>';

//Compilation Smarty
$smarty->_compile_source('temporary template', $HTML, $_compiled );
@ob_start();
$smarty->_eval('?>' . $_compiled);
$_contents = @ob_get_contents();
@ob_end_clean();

Mais quand je clique sur envoyer, la nouvelle page ne se charge pas :/ ...
refais la proprement :

I - pourquoi j'ai l'impression qu'il me manque un bout de ton code :

$liste_client = $bdd->query('SELECT DISTINCT nom_entreprise FROM espacewcln ORDER BY nom_entreprise');

d’où vient $bdd ? tu as lu mon article sur Comment bien requêter une base de donnée sur cmsms ? reprend plutôt mon code.

II - pourquoi jongler entre syntaxe heredoc et une autre syntaxe ? toujours le plaisir de complexifier ton code j'ai l'impression

Code :
$HTML = <<<EOT
  <form name="frm" action="{root_url}/index.php?page=archive2&showtemplate=false&q=$str">
  <select size=1 name="client">
  <option value="-1">Choisir un client<option>
EOT;

Ce n'est pas le seul endroit ou tu peux/dois faire ce genre d'optimisation.

III - comment peux tu imaginer qu'en jonglant entre une variable $HTML et des écho tu arrive à compiler ton code HTML/smarty en entier ????


Tu vas trop vite sans chercher à comprendre le code que je te file, documente toi en php parce que je vais pas faire ton UDT à ta place. Je peux te montrer la voie à suivre mais je suis pas taxis.

Allez hop au boulot Wink
I. Pour ma variable BDD, j'ai mes initialisions de connexion plus haut, juste que j'ai sélectionné la partie de code qui me pose problème

II. Effectivement j'ai été un peu trop vite, j'ai pas assez analysé ton code.
Code :
[== PHP ==]
$HTML = <<<EOT
  <form method="post" name="frm" action="{root_url}/index.php?page=archive2&showtemplate=true">
<select size=1 name="client[]">
<option value="-1">Choisir un client<option>
EOT;

//Compilation Smarty
$smarty->_compile_source('temporary template', $HTML, $_compiled );
@ob_start();
$smarty->_eval('?>' . $_compiled);
$_contents = @ob_get_contents();
@ob_end_clean();
echo $_contents;

$liste_client = $bdd->query('SELECT DISTINCT nom_entreprise FROM espacewcln ORDER BY nom_entreprise');    
while ($resultat = $liste_client->fetch()) {
echo '<option value="'.$resultat['id_client'].'">'.$resultat['nom_entreprise'];
echo '</option>'."\n";
}

$HTML = <<<EOT
</select>
<input type=submit value="Envoyer"/>
</form>
EOT;

//Compilation Smarty
$smarty->_compile_source('temporary template', $HTML, $_compiled );
@ob_start();
$smarty->_eval('?>' . $_compiled);
$_contents = @ob_get_contents();
@ob_end_clean();
echo $_contents;

J'ai changé ma méthode en passant pas POST, je suppose que ça ne prose pas de soucis et ça évite de passé la variable dans l'url.
J'ai aussi enlevé les balises {literal} vu que je "passe" par du HTML à cette endroit.
Du coup je peux clôturer ?