Liste Déroulante "Ajax + Prototype + MySql"

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Liste Déroulante "Ajax + Prototype + MySql"

Re: Liste Déroulante "Ajax + Prototype + MySql"

par nats » 12 janv. 2010, 16:22

Parfait je pense avoir compris.
Je vais maintenant essayer de mettre en pratique les différents points sur lesquels tu as pu m'éclairer.

Re: Liste Déroulante "Ajax + Prototype + MySql"

par Nours312 » 12 janv. 2010, 12:52

donc ... : transport.responseText.evalJSON() ...

transport est un Objet Ajax.Response il est retourné en argument dans la fonction onComplete (elle-même Option de la méthod Ajax.Request() .... Ceci est fait automatiquement par la class Ajax ...

Notre Ajax.Response nommé ici transport (nom de la variable arguments[0]) dans la déclaration onComplete : " function(transport) "
Est un Objet contenant différents attributs, dont responseText qui contient le résultat du script HTML généré pr la page appelée ...

le script généré est une chaine (string) créée par la fonction json_encode() de php de la forme :
"{artists : [{'art_id'=>'1', 'art_name'=> 'nom'},{'art_id'=>'1', 'art_name'=> 'nom'},{'art_id'=>'1', 'art_name'=> 'nom'},...]}"

pour pouvoir interpréter dynamiquement cette chaine en Javascript, on applique sur notre réponse la method evalJSON() qui va transformer cette chaine en un Objet (si celle-ci est correctement ralisée)

[javascript]
new Ajax.Request(url, {
method: "get",
onComplete: function(transport) {
var element_de_transport = transport;
var réponseHtmlDuServeur = element_de_transport.responseText;
var ObjetRécupéré = réponseHtmlDuServeurevalJON();
var TableauDesResultatDeLaRequeteMysql = ObjetRécupéré.artists ;
var PremiereLigneDeResultat= TableauDesResultatDeLaRequeteMysql[0] ;
var SecondeLigneDeResultat= TableauDesResultatDeLaRequeteMysql[1] ;
}
});

[/javascript]

J'espère que c'est plus clair .. ?

Re: Liste Déroulante "Ajax + Prototype + MySql"

par nats » 12 janv. 2010, 11:47

Justement je comprends pas bien ce que fait each et le bind reste abstrait pour moi malgré tous les efforts que tu as pu faire pour être le plus clair possible et j'en suis vraiment désolé :oops: j'ai également lu l'article que tu m'as proposé:
http://prototypejs.org/api/function/bind

J'ai essayé de comprendre en lisant ceci : http://www.prototypejs.org/api/enumerable/each
Tout comme le transport je sais approximativement ce qu'il fait c'est l'équivalent du XHR si je ne me trompe pas.

En gros si tu pouvais de decrypter ceci : transport.responseText.evalJSON

J'espère que je n'abuse pas de ta patience.

Je vais continuer de travailler de mon côté et soumettre ce que j'ai fait.

Dans tous les cas je te remercie énormément.

Re: Liste Déroulante "Ajax + Prototype + MySql"

par Nours312 » 11 janv. 2010, 22:26

donc ... pour les explications, t'en fait pas, ya pas de soucy !... j'ai l'habitude de manipuler Prototypes (un peu trop diront certains, vu que j'oublie la base du JS :oops: )

en fait le tableau que tu renvoi par ta page 'getArtists.php' doit etre de la forme

array('artists' => array(array('art_id'=>'1', 'art_name'=> 'nom'), array('art_id'=>'2', 'art_name'=> 'nom'), array('art_id'=>'3', 'art_name'=> 'nom'), ...))

ce qui fait que la réponse est de la forme :
"{artists : [{'art_id'=>'1', 'art_name'=> 'nom'},{'art_id'=>'1', 'art_name'=> 'nom'},{'art_id'=>'1', 'art_name'=> 'nom'},...]}"

ainsi, tu visualises mieux pourquoi l'on doit placer la fonction each() sur transport.responseText.evalJSON().artists et non sur le evalJson() ...

la fonction bind(elt) permet de transférer l'élément elt en temps que 'this' dans la fonction apelée.

je m'explique :

[javascript]
var maFonc = function(){
alert(this.value);
}
[/javascript]
<input id="button1" type="button" value="test1" onclick="mafonc()" />
<input id="button2" type="button" value="test2" onclick="mafonc.bind($('button1')" />
lors du click sur les deux boutons une alert s'ouvre en contenant le message "test1" ... le second bouton joins lors l'appel de la fonction le premier bouton en tant qu'élément référant (this) ...

Dans le cas qui nous intéresse, c'est pour pouvoir réutiliser notre objet GetArtists depuis la fonction appelée à l'intérieur de la fonction onComplete() ...

Voila, j'espère ne pas avoir été trop brouillon !... :D @+

Re: Liste Déroulante "Ajax + Prototype + MySql"

par nats » 11 janv. 2010, 19:38

Nours312 tu es un grand chef! Tout fonctionne parfaitement.
Pour te solliciter uniquement en cas extrême urgence j'aimerais que tu me donnes deux trois explications concernant le script que tu m'as corrigé au risque de paraître idiot car j'ai encore des zones d'ombres bien que j'essaie au maximum de documenter.

J'ai du mal à comprendre ce que fait le bind ce qui entraine une incompréhension à ce niveau

Line 14 fonc(transport.responseText.evalJSON());

Line 23 artists fait bien référence à ma table mySql

Merci

Re: Liste Déroulante "Ajax + Prototype + MySql"

par Nours312 » 11 janv. 2010, 13:24

Je ne sais pas quel est ta console d'erreur, mais chez moi, il se passe un paquet de truc !!

Dont :
Object artists=[821]
et
log: TypeError: jSon.each is not a function message=jSon.each is not a function
En clickant sur l'objet artists, on constate que c'est un tableau de 821 éléments constitutés chacun d'un Objet avec 2 attributs : art_id et art_name (ce que nous attendions par ailleurs !

Rappellons que nous avons cet affichage dans FireBug en faisant : console.log(jSon)

Si nous nous trouvons avec un Object nomé "artists" (qui lui est un énumérable) c'est que nous devons faire notre fonction each() sur l'objet contenu, et non l'objet contenant ....

Donc :

[javascript]

fillInArtistSelect: function(jSon) {
console.log(jSon.artists); // insertion dans la console de fireBug le jSon, pour vérifier qu'il arrive bien correctement.
this.response = jSon;
try{
jSon.artists.each(function(elt) {
console.log(elt)// vérification de la structure de notre elt.
$('artistes').options[$('artistes').options.length] = new Option(elt.art_name, elt.art_id); // insertion des options
});
} catch(e){
console.log(e);/*insertion dans la console des erreurs produites*/
}
}
[/javascript]

devrait mieux répondre à la demande ;)

Re: Liste Déroulante "Ajax + Prototype + MySql"

par nats » 11 janv. 2010, 10:49

J'ai testé le script et il ne se passe rien au niveau de la page comme dans la console d'erreurs.
Vous pouvez tester le script ici : http://morethanmusicradio.com/admin_rad ... s_ajax.php

Re: Liste Déroulante "Ajax + Prototype + MySql"

par Nours312 » 10 janv. 2010, 11:42

donc ... je reprends celui-ci en mode "débug" :D

[javascript]
var GetArtist = Class.create({
response: null,
initialize: function() {
if ($('artistes')) {
if ($('artistes').options.length > 0)
$('artistes').childElements().invoke('remove'); // supprime tous les enfants de l'élément #artistes

$('artistes').options[0] = new Option('', ''); // insère une nouvelle option dont le texte et la valeur sont nul dans notre select#artistes
var url = 'getArtists.php';
var fonc = this.fillInArtistSelect.bind(this);
new Ajax.Request(url, {
method: "get",
onComplete: function(transport) {
fonc(transport.responseText.evalJSON());
}
});
}
},
fillInArtistSelect: function(jSon) {
console.log(jSon); // insertion dans la console de fireBug le jSon, pour vérifier qu'il arrive bien correctement.
this.response = jSon;
try{
jSon.each(function(elt) {
console.log(elt)// vérification de la structure de notre elt.
$('artistes').options[$('artistes').options.length] = new Option(elt.art_name, elt.art_id); // insertion des options
});
} catch(e){
console.log(e);/*insertion dans la console des erreurs produites*/
}
}
});
document.observe('dom:loaded', function(){
new GetArtist()
});
[/javascript]

testes ce script, regardes bien ce qui est envoyé dans la console, et en cas, fais nous un copier/coller (ou un lien vers ta page ;) )

@+

Re: Liste Déroulante "Ajax + Prototype + MySql"

par nats » 09 janv. 2010, 17:57

Salut Nours312,
C'est sympa je vois que tu n'as pas oublié mon ancien script sur lequel je galère toujours j'y ai apporté des modifs mais le problème n'est toujours pas résolu. Je vais poster les modifs pour que tu puisses y jetter un coup d'oeil (Merci Beaucoup).

J'ai testé ton script et je n'ai aucune erreur dans la console firebug et mon select ne s'alimente toujours pas je vais pas te cacher que je suis dépassé!!

Re: Liste Déroulante "Ajax + Prototype + MySql"

par Nours312 » 08 janv. 2010, 20:32

Salut !...

1. Excuses moi, j'ai pas pris le temps de m'occuper de ton autre script comme j'aurais voulu. Si il est toujours d'actualité, dis le moi, et je vais essayer de booster !...

2. j'ai remodelé ton JS avec certaines fonctions Prototypes ... tu devrais comprendre ;)

Code : Tout sélectionner

var GetArtist = Class.create({ response: null, initialize: function() { if ($('artistes')) { while ($('artistes').options.length > 0) { $('artistes').remove(0); } var opt = new Element('option'); opt.value = ""; opt.text = ""; try { $('artistes').add(opt, null); } catch(ex) { alert(ex); } var url = 'getArtists.php'; var fonc = this.fillInArtistSelect.bind(this); new Ajax.Request(url, { method: "get", onComplete: function(transport) { fonc(transport.responseText.evalJSON()); } }); } }, fillInArtistSelect: function(jSon) { this.response = jSon; jSon.each(function(elt) { var opt = new Element('option'); opt.value = elt.art_id; opt.text = elt.art_name; try { $('artistes').add(opt, null); } catch(ex) { alert(ex); } }); } }); document.observe('dom:loaded', function(){new GetArtist()});
J'ai mis une Mascule à la variable (class) pour que ce soit plus "conventionnel" ou "propre" le fat de monter une class comme ça, tu peux utiliser les this piutot que de passer par l'extérieur et apleler l'objet, en cas d'utilisation multiple du même objet, s'est bien pratique !! (attention tout de même à bind()er quand il y en a besoin ;))

Pour afficher les erreur catch(ex), perso, j'utilise la console de FireBug ou Safari, mais ne sachant pas si tu l'utilise je t'ai mis une alert() sinon, c'est : console.log(ex); à la place de alert(ex); ...

vérifie qu'il ne faille pas $H() hashé le jSon pour s'assurer qu'il soit bien énumérable ($H(jSon).each(function(elt))) ...

Dans l'état l'attribut response ne sert à rien ... mais je te l'ai laissé :D

Sinon ... Ben ... fais les tests, un peu de débug et si ça marches pas donnes nous les erreurs générée ...

@+

Liste Déroulante "Ajax + Prototype + MySql"

par nats » 08 janv. 2010, 18:15

Bonjour,
Avant toutes choses meilleurs vœux pour cette nouvelle année.
Je suis novice en ajax.
Comme vous pouvez le deviner j'ai un problème avec mon code.
Je souhaite alimenter une liste déroulante via une une table mysql et ajax en utilisant la librairie prototype.

L'erreur que j'ai dans la console d'erreur firefox est une erreur de syntaxe que je n'arrive pas à déchiffrer.

Voici mon select

Code : Tout sélectionner

<?include "_debut.php";?> <script type="text/javascript" src="lib/prototype.js"></script> <script type="text/javascript" src="scripts/albums_ajax.js"></script> <div id="Content"> <h1>Albums</h1> <div class="block"> <form action="albums_ajax.php" method="post" enctype="multipart/form-data"> <table> <tr> <th>Selectionnez Votre Artiste</th> <td><select id="artistes" name="artistes"></select></td> </tr> <tr> <th>Entrez L'Album</th> <td><input type="text" name="album" /></td> </tr> <tr> <th>Pochette Album</th> <td><input type="file" name="album_cover" size="50" /></td> </tr> <tr> <th>Année de Sortie</th> <td><input type="text" name="album_release_date" /></td> </tr> <tr> <th></th> <td><input type="submit" value="Valider" id="go" /></td> </tr> </table> </form> </div> </div> <?include "_fin.php";?>
Mon script php pour récupérer les infos dans ma base de données SQl

Code : Tout sélectionner

<?php include_once("connexion.php"); ?> <?php mysql_select_db($database, $base); $query_artists = "SELECT * FROM artists ORDER BY art_name ASC"; $artists = mysql_query($query_artists, $base) or die(mysql_error()); $row_artists = mysql_fetch_assoc($artists); $result = array(); ?> <?php do { $result[] = $row_artists; } while ($row_artists = mysql_fetch_object($artists)); echo '{"artists":'.json_encode($result).'}'; ?>
Et mon javascript ou se trouve l'erreur en rouge

Code : Tout sélectionner

var getArtist = { response: null, init: function() { if ($('artistes')) { while ($('artistes').options.length > 0) { $('artistes').remove(0); } var opt = new Element('option'); opt.value = ""; opt.text = ""; try { $('artistes').add(opt, null); } catch(ex) { $('artistes').add(opt); } var url = 'getArtists.php'; new Ajax.Request(url, { method: "get", onSuccess: function(transport) { getArtist.response = transport.responseText.evalJSON(); getArtist.fillInArtistSelect(); } }); } }, fillInArtistSelect: function() { getArtist.response.artists.each(function(elt) { var opt = new Element('option'); opt.value = elt.art_id; opt.text = elt.art_name; try { $('artistes').add(opt, null); } catch(ex) { $('artistes').add(opt); } }), [color=#FF0000]},[/color] }; document.observe('dom:loaded', getArtist.init);
Je vous remercie d'avance