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

Signaler
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013
-
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013
-
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

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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.
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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 ;)
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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é.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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).
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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 ?
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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.
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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 ^^.
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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 ...
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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 ?
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
oups, manque une accolade dans mon exemple ...
Messages postés
22
Date d'inscription
dimanche 30 mai 2010
Statut
Membre
Dernière intervention
28 septembre 2013

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.