Quelle fonction JS pour éxécuter un fichier PhP ?

Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013 - 10 mai 2012 à 16:26
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013 - 11 mai 2012 à 20:06
Bonjour à toutes et tous,

Je voudrais faire exécuter le contenu d'un fichier PhP au clic sur un bouton :

" onclick=".........."; set_spans_show('sp_number3','','sp_number4','next');" > 


Ma question est : quelle fonction Javascript dois-je mettre à la place des points pour que cela déclanche l'exécution du fichier PhP ? Je n'ai pas besoin d'avoir quoique ce soit qui s'affiche à l'écran.

Merci par avance pour votre aide et vos réponses.

Je précise que je connais un peu le HTML, peu le PhP et pas le JavaScript (c'est un forum de PhP qui m'a conseillé de venir voir chez JS).

13 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 mai 2012 à 19:24
Salut,

une fonction PHP se déroule côté serveur. Il faut donc que ton action envoie une requête côté serveur. Tu as alors deux possibilités qui s'offrent à toi :
- un submit normal, facile à faire mais génère un refresh de la page côté client,
- faire ta requête en Javascript avec l'objet XmlHttpRequest (Ajax), c'est beau côté client mais un peu plus long à coder.

Si tu ne sais faire aucun des deux, google est ton ami.
Si tu coinces dans ton code, on est là pour t'aider.
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
10 mai 2012 à 19:46
Merci pour ta réponse et ton aide.

Google est quasiment toujours ouvert chez moi, réflexe sain quand on cherche !

Si je coince ? Bah, j'ai juste 7 onglets d'ouvert sur différents tutos, sites et autres forums pour tenter de comprendre ^^ Ca donne une idée du coinçage auquel je suis confronté !!!

J'ai opté pour la fonction XMLHttpRequest qui me semble être la plus proche du résultat escompté (tout se passe de manière transparente côté client).

Par contre, je vais avoir besoin de faire exécuter ce type de fonction plusieurs fois pour différents fichiers PhP. Dans ce cas, puis-je écrire ceci :
function getXMLHttpRequest-1 () {

pour faire exécuter le fichier PhP n°1
function getXMLHttpRequest-2 () {

pour faire exécuter le fichier PhP n°2
function getXMLHttpRequest-3 () {

pour faire exécuter le fichier PhP n°3

Ensuite, je crois qu'il faut écrire le reste de la fonction comme ça :
var xhr = getXMLHttpRequest ();

xhr.open ("get", "nom_du_fichier_a_executer.php", true);
xhr.send (null);


Pour "nom_du_fichier_a_executer.php", puis-je également inclure dans les guillemets en plus du nom, le chemin du fichier à exécuter : "dossier/sous-dossier/nom_du_fichier_a_executer.php" ?

Comme tu le vois, mon niveau est pitoyable
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 mai 2012 à 19:57
Plusieurs choses :
- un nom de fonction ne doit pas contenir de signe moins (-),
- s'il s'agit juste d'un fichier PHP en particulier, fais une seule fonction qui le prend en paramètre,
- getXMLHttpRequest() n'est pas une fonction native, tu dois avoir son code quelque part,
- tous les chemins de fichier de type URI sont acceptables,
- ton niveau n'est pas pitoyable et au moins tu cherches à comprendre ;)
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
10 mai 2012 à 20:06
Ok, merci pour les encouragements !

1/ ok, pas de signe "-" mais cela veut aussi donc dire que je peux avoir 5 fonctions identiques mais avec un nom différent (c'est ce nom qui ira remplacer les points de mon permier post) si j'ai 5 fichiers PhP différents à faire exécuter en arrière-plan,

2/ getXMLHttpRequest() est un exemple quie j'ai trouvé sur le site du zéro, tout simplement (pour avoir l'idée de la manière dont se construit une fonction sous JS),

3/ je cherche à comprendre parce que je n'ai pas envie de dépendre des autres (surtout pour ce qui est du PhP et/ou du JS qui restent des "loisirs" bien loin de mon job quotidien) et que cela maintient mes neurones de quadra très avancé encore en forme


Je vais tâcher de rédiger mon code de A à Z (HTML + PhP + JS) en expliquant ce que je veux obtenir et je viendrai le poster ici pour comprendre.

Encore merci à toi pour ta patience et ta disponibilité.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 mai 2012 à 20:23
Pour orienter un peu tes recherches, voilà à quoi pourrait ressembler le HTML :



Côté JS t'aurais un truc du genre :
function doAjax(filepath) {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", filepath, true); 
  xhr.send(null); 
}


Tu peux aussi utiliser le callback xhr.onreadystatechange qui permet d'associer une fonction aux retours du serveur (requête bien reçue, demande en attente, réponse livrée avec ou sans erreur).
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
10 mai 2012 à 20:42
Voilà à quoi ressemblerait mes codes, à la lumière de tes explications et de tes conseils :
L'exemple est l'insertion du tracking code de Google Analytics sur toutes les pages d'un site.

HTML :
<td><?php echo JTEXT::_('GOOGLE_TRACKING_CODE'); ?></td>
<td></td>
........
<td>
" onclick="install_code (); set_spans_show('sp_number3','','sp_number4','next');" > 
</td>

1/ le code UA est affecté à la variable "tracking_code",
2/ la fonction Javascript "install_code" déclenche l'exécution du fichier PhP (ensuite, le bouton 'NEXT' fait passer à l'étape suivante du processus),

PhP :
<?php
function verification {

// Récupérons le code UA 
function onAfterRender()
{
$mainframe = &JFactory::getApplication();
$web_property_id = $this->params->get('web_property_id', '');
if($web_property_id '' || $mainframe->isAdmin() || strpos($_SERVER["PHP_SELF"], "index.php") false)
{
return;
}

// Maintenant, le script
$buffer = JResponse::getBody();
$google_analytics_javascript = "
<script type='text/javascript'>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '".$web_property_id."']);
_gaq.push(['_trackPageview']);
(function() {
var ga document.createElement('script'); ga.type 'text/javascript'; ga.async = true;
ga.src ('https:' document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();</script>";

// Insère le code UA sur chaque page du site
$buffer = str_replace ("</head>", $google_analytics_javascript."</head>", $buffer);
JResponse::setBody($buffer);
return true;
}
}
?>

1/ je ne l'ai pas écrit tout seul, c'est une évidence ...


JavaScript :
JavaScript :

function install_code () { 

function XMLHttpRequest1() {
var xhr = null;

if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest(); 
}
} else {
alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
return null;
}

return xhr;
}

var xhr = XMLHttpRequest1(); 

xhr.open("GET", "verification.php", true);
xhr.send(null);

1/ je retrouve ma fonction "install_code" qui est présente dans la partie HTML,
2/ je demande à la fonction d'aller ouvrir le fichier "verification.php"



Verdict ?
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 mai 2012 à 21:01
Le verdict c'est ton browser préféré qui te le donnera, ça marche ou ça marche pas

Sinon à vue de nez tu as un souci d'accolade dans ton JS, supprime la première ligne (ton appel ne doit d'ailleurs pas fonctionner). Pour ce qui est du PHP c'est pas tellement la question, tu y fais bien ce que tu veux.
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
10 mai 2012 à 21:09
bon, ben, je vais tester ça en l'état et je jugerai de la réussite ou de l'échec !

Il faudra aussi que je bricole l'affichage d'un message d'erreur en cas d'échec d'une des fonctions exécutées par les différents fichiers PhP en arrière plan. Mais ça, c'est une autre histoire ^^.
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
10 mai 2012 à 21:18
Verdict : décevant !

Lorsque je clique sur 'NEXT', il ne se passe rien si le champ "tracking_code" est renseigné.
Lorsqu'il est vide, j'accède sans souci à l'étape suivante.

J'ai donc une erreur quelque part ...
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
10 mai 2012 à 21:46
En modifiant le code JS comme ceci :
function install_code() { 

var xhr = XMLHttpRequest(); 

xhr.open("GET", "verification.php", true);
xhr.send(null);
}

le bouton 'NEXT' redevient fonctionnel mais le code UA n'est pas insérer dans les pages du site.


Comment puis-je m'assurer que l'instruction visant à exécuter le fichier "verification.php" est bien réalisée ?
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 mai 2012 à 08:14
XMLHttpRequest possède un callback appelé onreadystatechange.
Tu lui associes une fonction qui gère les retours du serveur.

Cela peut donner un truc du genre :
xhr.onreadystatechange =  mafonction;

Dans cette fonction il y a deux membres de xhr à scruter :

- xhr.readyState : retourne l'état de la requête (UNINITIALIZED, LOADING, LOADED ...), la valeur qui t'intéresse est "4" (COMPLETED). Pour en savoir plus regarde =vs.85).aspx ici.

- xhr.status : statut HTTP de ta requête lorsqu'elle est COMPLETED. Cette valeur peut être n'importe quel retour HTTP (ex. "404" pour "ERROR NOT FOUND"). Celle qui t'intéresse est "200" ("OK").

Du coup, tu auras un callback du genre :
function mafonction() {
  if (xhr.readyState == 4) {
    if (xhr.status == 200) {
        alert("SUCCEDED");
    } else {
        alert("ERROR " + xhr.status);
    }
}


Enfin, lorsque ta requête est finie (readyState 4) et réussie (status 200) tu peux récupérer le retour de ton fichier PHP avec l'attribut xhr.responseText. Ainsi ton fichier PHP pourrait écrire "1" pour une action réussie, et "0" pour un échec. Et donc tu pourrais avertir ton utilisateur que l'action c'est bien ou mal passée.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 mai 2012 à 08:14
oups, manque une accolade dans mon exemple ...
0
Pesselles Messages postés 22 Date d'inscription dimanche 30 mai 2010 Statut Membre Dernière intervention 28 septembre 2013
11 mai 2012 à 20:06
Désolé pour la réactivité tardive (vraie vie + vrai boulot oblige ^^).

Je vais lire ton code et essayer de le comprendre avant de le copier/coller et de le tester.

Le callback me sera surtout utile pour vérifier la bonne exécution du fichier php.
Encore merci pour tes explications et pour le temps consacré à m'aider.
0
Rejoignez-nous