Forum CMS Made Simple FR

Version complète : [Résolu] Problème d'autocompletion en Ajax
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.

Ajja

Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS: ?
#~ Nom de l'hébergeur :
#~ Informations Système :
#~ ----------------------------------------------
#~ Cms Version: 1.7.1
#~ Installed Modules:
#~ * CMSMailer: 2.0
#~ * FileManager: 1.0.2
#~ * MenuManager: 1.6.3
#~ * ModuleManager: 1.3.3
#~ * News: 2.10.5
#~ * nuSOAP: 1.0.1
#~ * Printing: 1.0.4
#~ * Search: 1.6.3
#~ * ThemeManager: 1.1.1
#~ * TinyMCE: 2.7.0
#~ * FCKeditorX: 1.1.0
#~ * FormBuilder: 0.5.11
#~ * Album: 0.9.3
#~ * FCKeditorX: 1.1.0
#~ Config Information:
#~ * php_memory_limit:
#~ * process_whole_template: false
#~ * max_upload_size: 32000000
#~ * default_upload_permission: 664
#~ * assume_mod_rewrite: false
#~ * page_extension:
#~ * internal_pretty_urls: false
#~ * use_hierarchy: false
#~ Php Information:
#~ * phpversion: 5.3.2-1ubuntu4.5
#~ * md5_function: On (Vrai)
#~ * gd_version: 2
#~ * tempnam_function: On (Vrai)
#~ * magic_quotes_runtime: Off (Faux)
#~ * E_STRICT: 0
#~ * E_DEPRECATED: 0
#~ * memory_limit: 128M
#~ * max_execution_time: 30
#~ * safe_mode: Off (Faux)
#~ * session_save_path: /var/lib/php5 (1733)
#~ * session_use_cookies: On (Vrai)
#~ Server Information:
#~ * Server Api: apache2handler
#~ * Server Db Type: MySQL (mysql)
#~ * Server Db Version: 5.1.41
#~ ----------------------------------------------
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~



Bonjour à tous,

Premièrement , je m'excuse de poser une question alors que je n'ai pas la dernière version du cms. Cependant, le client pour qui je travaille ne m'a pas permis de faire cela. J'ai un petit problème pour une recherche par autocompletion:

Voici mon script php sensé gérer l'auto completion
[ins]
{ouvrirbase}
{php}
echo 'plop';
var_dump($_POST['organisme']);
// AUTO-COMPLETION - Recherche des Organismes
if($_POST['organisme'] != NULL){ echo 'coucou';
$sql_org = "SELECT *
FROM organismes
WHERE nomorganisme LIKE '".$_POST['organisme']."%'";
$req_org = mysql_query($sql_org);

$i_org = 0;
echo '<ul class="contacts">';[/ins]

[ins] while($autoCompletion_org = mysql_fetch_assoc($req_org)){
echo '
<li class="contact"><span class="informal" style="display:none;" >'.$autoCompletion_org['numorganisme'].'-idcache</span><div class="nom">'.$autoCompletion_org['nomorganisme'].'</div>
<div class="prenom">
<span class="informal" >'.substr($autoCompletion_org['villeorganisme'],0,20).'</span>
</div>
</li>';[/ins]

[ins] if (++$i_org >= 10)
die('<li>...</li></ul>');
}
echo '</ul>';
die();
}
{/php}
[/ins]

Seulement, voyez le $_POST en rouge n'est pas actualisé. Ce script devrait lui envoyé l'info :
[ins]
<input type="text" id="organisme" name="organisme" /><br />
<div class="update" id="organisme_update"></div>
<input type="hidden" id="organisme_id" name="organisme_id"/>
<span id="organisme_log" style="display:none;"></span>[/ins]

[ins]{literal}<script type="text/javascript">
new Ajax.Autocompleter ('organisme',
'organisme_update',
'index.php?page=carnet-du-journaliste-recherche-organisme',
{
method: 'post',
paramName: 'organisme',
afterUpdateElement: ac_return
});
</script>{/literal}
[/ins]

Il fait lui-même appel à cette fonction :

[ins]
function ac_return(field, item){
// on met en place l'expression régulière
var regex = new RegExp('[0123456789]*-idcache', 'i');
// on l'applique au contenu
var nomimage = regex.exec($(item).innerHTML);
//on récupère l'id
id = nomimage[0].replace('-idcache', '');
// et on l'affecte au champ caché
$(field.name+'_id').value = id;
// log
// $(field.name+'_log').innerHTML = '<br/>'+id+' - '+$F(field.name)+'<br/><img src="personne/'+id+'-mini.jpg" />';
}[/ins]



Si quelqu'un peut me dire quel est le truc qui cloche ou tout simplement est-ce que ma version est trop vieille pour réaliser cela, je lui en serait reconnaissant.

Merci d'avance,

Lorris
Citation :Premièrement , je m'excuse de poser une question alors que je n'ai pas la dernière version du cms. Cependant, le client pour qui je travaille ne m'a pas permis de faire cela.

tu peux lui dire officiellement que sa version n'est plus supporté ni par nous ni par la team .org Big Grin


Concernant ton soucis :

* remplace l'utilisation de {php} {/php} par l'utilisation de balise utilisateur, c'est plus propre et préconisé dans cmsms question sécurité.
* Si tu appel ta page "index.php?page=carnet-du-journaliste-recherche-organisme" avec une méthode GET pour pouvoir faire tes tests, elle réagit correctement ? penses évidement à changer le $_POST en $_GET pour ce test partout dans ton code

Sinon ta version n'est pas sencée poser problème. Ton script a t il fonctionné un jour sur cmsms ?
Et un petit coup de
{ouvrirbase}
{php}
echo $_POST['organisme']; // au lieu de 'plop' te dira automatiquement si cette variable existe.

Ajja

Et non, le GET ne marche pas non plus, je ne comprend pas. Je n'utilise pas de balise utilisateur pour mes tests mais ça ne change pas le code. Est-ce que par hasard, quelqu'un aurait un script d'autocompletion qu'il a déjà testé sur made simple? Je n'en ai pas trouvé dans la partie "Développement et Astuces".



Jean le Chauve a écrit :Et un petit coup de
{ouvrirbase}
{php}
echo $_POST['organisme']; // au lieu de 'plop' te dira automatiquement si cette variable existe.

Le var_dump($_POST['organisme']) revient au même.
Normalement avec le passage en GET, si tu attaques ta page ainsi :

index.php?page=carnet-du-journaliste-recherche-organisme&organisme=plop

devrait te retourner au moins echo 'coucou'; d'après ton code. Si ce n'est pas le cas tu as un soucis dans ton code PHP

Sinon je pense à un truc : essai de remplacer $_POST['organisme']; par $params['organisme'];

autre test si ca foire :

sous firefox, Crtl + maj + J

durant le refresh de ta page as tu une erreur JS qui traine ?

Ajja

Merci d'essayer de trouver des solutions, mais ça ne marche toujours pas... effectivement, j'ai deux erreurs js >>
[em]Erreur : element.dispatchEvent is not a function
Fichier Source : http://dev.clubpresse.org/js/autocomplet...ototype.js
Ligne : 4619[/em]

[em]Erreur : this.element.setAttribute is not a function
Fichier Source : http://dev.clubpresse.org/js/autocompletion/controls.js
Ligne : 73[/em]

Peut-être il y a un conflit de made simple avec prototype?
entre cmsmadesimple et prototype non.

entre jquery et prototype oui Big Grin

Soit tu vire totalement prototype et tu passes sur full jquery, ce que je te conseil vu que cmsms se base pas mal sur jquery.

Soit tu conserves les deux et il te faut passer par une phase de modification des appels Jquery avec ceci : http://api.jquery.com/jQuery.noConflict/ mais ca va pas être coton

Ajja

Ok, alors changement de stratégie Tongue
J'ai trouvé un script d'autocompletion jquery. Cependant, encore un autre soucis de je ne sais où.

Voila mon code du head :
[ins]
<script type="text/javascript" src="js/autocompletion/jquery.js"></script>
{literal}<script type="text/javascript">
$.noConflict();[/ins]

[ins] function lookup(inputString) {
if(inputString.length == 0) {
// Hide the suggestion box.
$('#suggestions').hide();
} else {
$.post({global_content name='autocompletion'}, {queryString: ""+inputString+""}, function(data){
if(data.length >0) {
$('#suggestions').show();
$('#autoSuggestionsList').html(data);
}
});
}
} // lookup

function fill(thisValue) {
$('#inputString').val(thisValue);
setTimeout("$('#suggestions').hide();", 200);
}
</script>{/literal}
[/ins]

Normalement le code que j'ai mis en rouge link vers une page php en fait "autocompletion.php" qui "include" d'autres pages php. J'ai essayer de mettre le tout dans un global content comme ci-dessus. J'ai pas d'erreur js Wink Est-ce la bonne méthode à employer? En tout cas ,ça ne marche pas dans une balise utilisateur.

Voici le code autocompletion.php à tout hasard

[ins]
function transform_specialchars(&$table){
if(is_array($table))
while(list($key, $value) = each($table))
if(is_array($table[$key]))
transform_specialchars($table[$key]);
else
$table[$key] = &htmlspecialchars($value);
else
$table = &htmlspecialchars($table);
}[/ins]

[ins]function mysql_DateTime($d) { [/ins]

[ins] $date = substr($d,8,2)."-"; // jour
$date = $date.substr($d,5,2)."-"; // mois
$date = $date.substr($d,0,4); // ann馥

return $date;
} [/ins]


[ins]// Description: mySQL4.1 (mySQL)
class db {
var $link=0;
var $num_queries=0;
var $query_result;

function db($db_host,$db_user,$db_pass,$db_name) {
$this->link = mysql_connect($db_host,$db_user,$db_pass,true);
@mysql_select_db($db_name,$this->link);
}[/ins]

[ins] function sql_close(){
if($this->link)
return mysql_close($this->link);
else
return false;
}[/ins]

[ins] function sql_query($query){
unset($this->query_result);
$this->num_queries++;
$this->query_result = mysql_query($query, $this->link);
if($this->query_result)
return $this->query_result;
else
return false;
}[/ins]

[ins] function sql_numrows($query_id=0){
if(!$query_id)
$query_id=$this->query_result;
return ($query_id)?mysql_num_rows($query_id):false;
}[/ins]

[ins] function sql_affected(){
return ($this->link)?mysql_affected_rows($this->link):false;
}[/ins]

[ins] function sql_dataseek($query_id=0, $num_row){
if(!$query_id)
$query_id = $this->query_result;[/ins]

[ins] if($query_id)
return mysql_data_seek($query_id,$num_row);
else
return false;
}[/ins]

[ins] function sql_fetchrow($query_id=0,$special=true)
{
if(!$query_id)
$query_id = $this->query_result;[/ins]

[ins] if($query_id){
$result = mysql_fetch_array($query_id, MYSQL_ASSOC);
if($special==true)
transform_specialchars($result);
return $result;
}
else
return false;
}[/ins]

[ins] function sql_fetchrowset($query_id=0,$special=true)
{
if(!$query_id)
$query_id = $this->query_result;[/ins]

[ins] if($query_id){
$temp = 0;
$result = array();
$this->sql_dataseek($query_id, 0);
while($temp = mysql_fetch_array($query_id, MYSQL_ASSOC))
$result[] = $temp;
if($special==true)
transform_specialchars($result);
$this->sql_dataseek($query_id, 0);
return $result;
}
else
return false;
}[/ins]



[ins] function sql_insertid(){
return ($this->link)?mysql_insert_id($this->link):false;
}[/ins]

[ins] function sql_listtables($db_name){
$tables_list = array();
$temp_result = mysql_list_tables($db_name);
while($temp_data = mysql_fetch_row($temp_result))
$tables_list[] = $temp_data[0];
return $tables_list;
}[/ins]

[ins] function sql_error(){
$result['message'] = mysql_error($this->link);
$result['code'] = mysql_errno($this->link);[/ins]

[ins] return $result;
}[/ins]

[ins] function get_version(){
$version_result = $this->sql_query("SELECT VERSION() AS version");
$version_data = $this->sql_fetchrow($version_result);
return $version_data['version'];
}
}[/ins]




[ins]$queryString = $_POST['queryString'];
$db = new db($hostname,$username,$password,$database);
if(!$db) {

echo 'ERROR: Could not connect to the database.';
} else {
if(isset($_POST['queryString'])) {
$queryString = $_POST['queryString'];

if(strlen($queryString) >0) {

$query = $db->sql_query("SELECT value FROM countries WHERE value LIKE '$queryString%' LIMIT 10");
if($query) {

while ($result = $db ->sql_fetchrow($query)) {
echo '<li onClick="fill(\''.$result['value'].'\');">'.$result['value'].'</li>';
}
} else {
echo 'ERROR: There was a problem with the query.';
}
} else {

}
} else {
echo 'erreur';
}
}[/ins]




[ins]$hostname = "-----------";
$username = "----------";
$password = "-------";
$database = "test";[/ins]
{global_content name='autocompletion'} est entre {literal}{/literal}

donc ce n'est pas compilé en smarty

solution : le remplacer par

{/literal}{global_content name='autocompletion'}{literal}

je n'ai pas vérifié le reste mais déjà corrige ca et regarde si t'as pas fait l'erreur ailleurs

Ajja

Ok c'est noté : nouvelle erreur >>
[em]Erreur : unterminated string literal
Fichier Source : http://dev.clubpresse.org/index.php?page...herche-nom
Ligne : 45, Colonne : 22
Code Source :
$.post(string(359) "Smarty error: [in globalcontent:autocompletion line 3]: syntax error: unrecognized tag: if(is_array($table)) [/em]

Je crois que je vais abandonner :/ Jme fais du mal là à persister
sans vouloir t'offenser tu t'y prends juste mal. Passe par des balises utilisateurs comme on t'avait dit

Lis ces documentations attentivement :

Faire des requêtes SQL sous CmsMadeSimple

le passage de paramètres pour les balises

et éventuellement d'autres chose sur le dernier lien pour bien comprendre le principe des balises. Personnellement j'use et abuse des balises tellement elles sont puissantes. ton problème d'auto-complétion n'en n'est pas un.

PS : après si vraiment tu ne le sens pas de te le faire seul ce code en balise, on peut s'arranger autrement mais ca sera hors cadre du forum Wink

Ajja

Ca y est j'ai trouvé la solution. Au risque de te décevoir Bess, la solution que j'ai trouvé ne passe pas par une balise utilisateur Tongue

En fait, c'est tout simple. Voici l'autocompletion que l'on peut faire avec jquery à partir de cette source : http://www.javascriptfr.com//code.aspx?ID=44399

>> Mettre la partie ci-dessous dans le head. Une seule chose change par rapport au fichier source. Nous allons remplacer la page rpc.php par une nouvelle page, liée à un nouveau gabarit dans lequel nous inscrivons tout le contenu de la page rpc.php (entre les balise {php}{/php} évidemment).

[ins]<script type="text/javascript" src="js/autocompletion/jquery.js"></script>
{literal}<script type="text/javascript">
$.noConflict(); // Rajouter ce code si vous avez des conflits avec d'autres scripts jquery[/ins]

[ins] function lookup(inputString) {
if(inputString.length == 0) {
// Hide the suggestion box.
$('#suggestions').hide();
} else {
$.post("index.php?page=autocompletion-nom""rpc.php", {queryString: ""+inputString+""}, function(data){
if(data.length >0) {
$('#suggestions').show();
$('#autoSuggestionsList').html(data);
}
});
}
} // lookup

function fill(thisValue) {
$('#inputString').val(thisValue);
setTimeout("$('#suggestions').hide();", 200);
}
</script>{/literal}
[/ins]

Un dernier petit détail pour les têtes en l'air dans mon genre Rolleyes
Ne pas oublier les balises {literal}{/literal} sur les fonctions js qui sont appelés sur le input
[ins]
<form>
<div>

<br />
<input type="text" size="30" value="" id="inputString" onkeyup=" {literal}lookup(this.value); {/literal}" onblur=" {literal}fill(); {/literal}" />
</div>

<div class="suggestionsBox" id="suggestions" style="display: none;">
<img src="images/upArrow.png" style="position: relative; top: -12px; left: 30px;" alt="upArrow" />
<div class="suggestionList" id="autoSuggestionsList">
&nbsp;
</div>
</div>
</form>
[/ins]

Merci à toi Bess pour ton aide. En espérant que ce post pourra servir à quelqu'un plus tard.
je suis heureux de voir que ton problème est résolu (oublie pas [résolu] dans le titre de ton premier message!)

mais je tiens tout de même à réagir sur ces points :

-intégrer du {php}{/php} est très fortement déconseillé car modifiable par accident très facilement
-utiliser des fichiers php externe est très fortement déconseillé pour des questions de sécurité anti-hacking (là je parles pour les développeurs débutants)

l'utilisation des balises utilisateurs sont là pour remplacer ce que tu as fait.


encore une fois tu as solutionné ton soucis, c'est le principal mais avis à ceux qui souhaiteraient faire le même style : cmsmadesimple propose ses propres outils intégrés au panel admin pour ce genre d'opération en y ajoutant une bonne dose de sécurité anti-hack Wink