8792 sujets

Développement web côté serveur, CMS

Bonsoir,
J'ai hésité entre le salon des langages serveur et le salon javascript... il faut dire que ma question se trouve être entre les deux. Je m'excuse pour le titre qui n'est pas très explicite mais je n'ai pas su faire mieux.

Je possède plusieurs scripts javascript dont certaines variables dépendent de requêtes SQL, de variables de sessions, de données contenues dans des fichiers, etc... enfin bref, des informations collectés côté serveur.

Sachant qu'on recommande généralement de placer les scripts javascript dans des fichiers externes plutôt que dans le XHTML même pour plus de clareté et pour qu'ils puissent être réutilisables.

Maintenant, j'en viens au problème proprement dit : ce serait bien si je pouvais externaliser complètement mes scripts, mais comme certains éléments de ceux-ci dépendent de variables php, la tâche est plus difficile.

L'appel d'un deuxième fichier php (js.php par exemple) implique que j'exécute mes requêtes SQL à double, que j'accède plusieurs fois à mes fichiers, que je charge plusieurs fois la même session simultanément, car il faut bien que je transfère ces variables d'une manière ou d'une autre... ce qui demande donc le double de travail au serveur pour un script externalisé qui, au final, fait une belle jambe à l'utilisateur lambda.
Je pourrais aussi envisager une autre solution, transférer les données nécessaires par GET... avec débuggage plus compliqué et facilité de hacking (le code transmis est difficilement contrôlable je pense, il serait facile de tricher)

Vu ce que demande l'apparament simple externalisation d'un script, je me demande encore si c'est vraiment nécessaire de le faire dans ce cas. Surtout que le script en question est utilisé au plus deux ou trois fois sur tout le site...

JE ne sais pas si mes explications sont très claires...

J'ouvre donc un débat qui sera peut-être houleux : faut-il externaliser ou non ? et si oui, en utilisant quelle technique ? Vos expériences sont bienvenues. Merci.
Modifié par QuentinC (05 Feb 2007 - 22:23)
Hello,
QuentinC a écrit :
Sachant qu'on recommande généralement de placer les scripts javascript dans des fichiers externes plutôt que dans le XHTML même pour plus de clareté et pour qu'ils puissent être réutilisables.
Tu réponds toi-même à ta question : les variables générées par PHP ont justement la particularité de ne pas être réutilisables, puisqu'elles sont spécifiques à la page sur laquelle elles se trouvent.

A mon avis, l'idéal est de faire en sorte que cette information soit présente dans le HTML et que ton code JavaScript aille la récupérer. Cela permet de s'assurer que les utilisateurs qui n'ont pas accès à JavaScript ont quand même cette information.

Cela n'est pas toujours possible, auquel cas je pense que le mieux est de définir toutes les variables spécifiques à ta page dans le <head>. De toute façon, le fait de placer le code JavaScript dans un fichier séparé n'est pas une fin en soi (pas plus que pour les CSS).
Si le site est bien fait, tout le traitement PHP/SQL se fait avant la gestion de l'affichage des contenus. Dans ce cas, tu peux facilement créer un JS dans un fichier PHP que tu pourrais nommer js.php (et lui mettre le header("Content-type: text/javascript"); en entête) et ensuite l'inclure dans ton code HTML comme un fichier JS externe.
Surfoo a écrit :
Si le site est bien fait, tout le traitement PHP/SQL se fait avant la gestion de l'affichage des contenus. Dans ce cas, tu peux facilement créer un JS dans un fichier PHP que tu pourrais nommer js.php (et lui mettre le header("Content-type: text/javascript"); en entête) et ensuite l'inclure dans ton code HTML comme un fichier JS externe.
Je ne comprends pas ta réponse. Quentin a évoqué cette possibilité, et les problèmes qui en découlent.
Julien Royer a écrit :
Hello,Tu réponds toi-même à ta question : les variables générées par PHP ont justement la particularité de ne pas être réutilisables, puisqu'elles sont spécifiques à la page sur laquelle elles se trouvent.

Oui justement, c'est là le problème...


Julien Royer a écrit :

A mon avis, l'idéal est de faire en sorte que cette information soit présente dans le HTML et que ton code JavaScript aille la récupérer. Cela permet de s'assurer que les utilisateurs qui n'ont pas accès à JavaScript ont quand même cette information.

L'information en question est inutile sans javascript. IL s'agit d'une vérification de formulaire, la plupart du temps.

Julien Royer a écrit :

Cela n'est pas toujours possible, auquel cas je pense que le mieux est de définir toutes les variables spécifiques à ta page dans le <head>. De toute façon, le fait de placer le code JavaScript dans un fichier séparé n'est pas une fin en soi (pas plus que pour les CSS).


Ce qui répond à ma question, donc ce n'est pas nécessaire. Merci.
Je laisse encore le sujet en suspens quelques temps, pour voir éventuellement d'autres avis.

Surfoo a écrit :
Si le site est bien fait, tout le traitement PHP/SQL se fait avant la gestion de l'affichage des contenus. Dans ce cas, tu peux facilement créer un JS dans un fichier PHP que tu pourrais nommer js.php (et lui mettre le header("Content-type: text/javascript"); en entête) et ensuite l'inclure dans ton code HTML comme un fichier JS externe.

Tu n'as pas compris le problème : bien sûr que c'est possible, mais ça demande le double de travail au serveur, comme je l'ai expliqué dans mon premier post.
QuentinC a écrit :

L'information en question est inutile sans javascript. IL s'agit d'une vérification de formulaire, la plupart du temps.

Questions :
- quel est l'intérêt de faire une vérification en js puisque de toutes façons il faut aussi (et surtout) la faire en php avant traitement ?
- quel est le problème dans l'utilisation de session, qu'elle soit unique ou multiple ?

S'il y a utilisation de js sur un formulaire il ne faut rien envisager d'autre que du confort.
ex : info bulle sur un champ et autre gadget du même type.
Modifié par Bison (06 Feb 2007 - 09:06)
Modérateur
Salut,

Bison a écrit :
- quel est l'intérêt de faire une vérification en js puisque de toutes façons il faut aussi (et surtout) la faire en php avant traitement ?
L'intérêt d'une vérification via JS est qu'elle permet de soulager le serveur tout en donnant la possibilité de détecter les erreurs un peu plus tôt.

a écrit :
- quel est le problème dans l'utilisation de session, qu'elle soit unique ou multiple ?
A priori aucun, je pense que ça va de paire.

Pour le reste, ben j'aborderais ça d'une manière un peu différente. Si par exemple, on prend une page php qui se charge d'effectuer la transformation d'un fichier xml à l'aide de feuilles de style xsl pour générer les codes html, css et js...
Le mode opératoire serait :
On clique sur un lien ou on transmet un formulaire -> php traite la requête et met à jour le xml -> Les feuilles xsl, en fonction du code xml, se chargent de transmettre les données voulues à leur fichier respectif.

PS : J'oublie peut-être quelquechose mais ça me semble jouable... Smiley langue

QuentinC a écrit :
faut-il externaliser ou non ?
Quel est l'intérêt de séparer structure et mise en forme ?
Quel est l'intérêt de séparer structure et comportement ?
Quel est l'intérêt de séparer comportement et mise en forme ?
Quel est l'intérêt de séparer traitement et structure ?
...

A chaque fois, la souplesse d'utilisation, la maintenance du code, la portabilité, etc...

A mon sens, la question serait plus, est-ce que mon petit site perso nécessite cette grosse usine à gaz ? Smiley lol
koala64 a écrit :
L'intérêt d'une vérification via JS est qu'elle permet de soulager le serveur tout en donnant la possibilité de détecter les erreurs un peu plus tôt.

Ton argument serait porteur si et seulemnt si php/mysql ne devait pas être sollicité pour permettre le déroulement du script js, or, ce n'est pas le cas (dixit les dires de Quentin.)
a écrit :

L'intérêt d'une vérification via JS est qu'elle permet de soulager le serveur tout en donnant la possibilité de détecter les erreurs un peu plus tôt.

Smiley prix entièrement d'accord, c'est bien le but... et ça me sert aussi à mettre à jour le total en temps réel en fonction de ce qui est rempli, pour que l'utilisateur n'ait pas besoin de faire de calcul.
IL va évidemment de soi que je vérifie les données avant traitement côté php.

Pour ce qui est des infos SQL dont j'ai besoin pour construire le script js, de toute façon j'ai besoin de ces données également ailleurs dans la page, alors js ou pas js, la requête reste la même.

A noter, peut-être que ce n'est pas clair pour tout le monde, je n'utilise pas AJAX.
Modérateur
A partir du moment où les requêtes sont déjà faites et que tu ne te sers pas d'Ajax, JS peut quand même répondre à tes besoins... même si dans ce cas, on fait tout en JS... Smiley langue

J'ai fait un petit exemple édulcoré par rapport à ce que j'ai dit (parce que je suis super lent et que je pêche encore à certains endroits), pas spécialement des plus propres (peut mieux faire Smiley langue ), mais au moins, ça permet d'illustrer un peu... Smiley smile

index.php
<?php

class Doc
{
	public function __construct()
	{
		if(isset($_GET['age']))
			$this->verif($_GET['age']);
		else
			self::convert('test.xml', 'test.xsl');
	}

	static function convert($xml, $xsl)
	{
		$DomXml = DOMDocument::load($xml);
		$DomXsl = DOMDocument::load($xsl);
		$process = new XSLTProcessor;
		$process->importStyleSheet($DomXsl);
		print $process->transformToXML($DomXml);
	}
	
	public function verif($value)
	{
		$value = htmlspecialchars($value);
		if(trim($value) === '')
			echo "<p>Oui, il faut indiquer quelquechose ! [smile]</p>";
		elseif(trim($value) != '' && $value != '29')
			echo "<p>Et non ! Perdu... [langue]</p>";
		else
			echo "<p>Nickel ! T'as trouvé tout seul ! J'ai bien " . $value . "ans ! ^^</p>";
	}
}
$oDoc = new Doc;

?>


test.xml
<?xml version="1.0" encoding="utf-8" ?>
<k64 age="30" />


test.xsl
<?xml version="1.0" encoding="utf-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output
		method="xml"
		version="1.0"
		encoding="utf-8"
		omit-xml-declaration="yes"
		doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
		doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
		indent="yes" />

	<xsl:template match="/">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
			<head>
				<meta http-equiv="content-type" content="text/html; charset=utf-8" />
				<title>Test</title>
				<style type="text/css"><xsl:comment>@import url("test.css");</xsl:comment></style>
				<script type="text/javascript" src="test.js"></script>
			</head>
			<body>
				<xsl:apply-templates select="k64" />
			</body>
		</html>
	</xsl:template>

	<xsl:template match="k64">
		<p xmlns="http://www.w3.org/1999/xhtml">L'admin' s'est trompé : il dit que j'ai <span><xsl:value-of select="@age" /></span>ans. En réalité, j'ai un an de moins. Quel est mon âge ? [cligne]</p>
		<form xmlns="http://www.w3.org/1999/xhtml" action="index.php" method="get">
			<div>
				<label>Age : </label>
				<input type="text" id="age" name="age" size="3" />
				<input type="submit" id="submit" value="Test ! [smile]" />
			</div>
		</form>
	</xsl:template>

</xsl:stylesheet>


test.css
@media screen, projection
{
	body
	{
		background-color: #58f;
		color: #000;
		font-family: Verdana, Arial, Helvetica, sans-serif;
		font-size: 100%;
	}
	p, form
	{
		font-size: .8em;
	}
	p span
	{
		color: #ff0;
	}
}


test.js
var oO =
{
	_init: function()
	{
		var oSpan = document.getElementsByTagName('span')[0],
		    oForm = document.getElementsByTagName('form')[0];
		oForm.onsubmit = function() { oO._verif(oSpan.lastChild.data); return false; };
	},
	
	_verif: function(age)
	{
		var oForm = document.getElementsByTagName('form')[0],
		    oReponse = oForm.getElementsByTagName('input')[0].value;
		if(oReponse == '')
			alert("Oui, il faut indiquer quelquechose ! [smile]");
		else if(oReponse != '' && oReponse != 29)
			alert("Et non ! Perdu... [langue]");
		else
		{
			age = oReponse;
			document.body.innerHTML = "<p>Nickel ! T'as trouvé tout seul ! J'ai bien " + age + "ans ! ^^</p>";
		}
	}
};
window.onload = oO._init;


... ce qui donne cette finalité.

Ben oué ! Tout ça pour ça ! Smiley lol

Il n'y a pas de SQL et tout le tsouin tsouin mais bon, si ça peut donner des idées. Smiley ravi
Modifié par koala64 (06 Feb 2007 - 21:18)
Tu ne fais pas non plus intervenir un élément que j'ai indiqué comme essentiel dans mon cas : si je reprends l'exemple, il y aurait des variables php dans le .js.
Mais sinon c'est bien le genre d'idée.
Modérateur
A quoi te servent ces variables php ? Smiley confuse

A priori, je ne pense pas que ce soit nécessaire dans le sens où via DOM, on peut dire de récupérer une chaîne texte, un tableau, un élément, etc... sans se préoccuper du contenu...

Par exemple, si dans mon JS, je mettais d'origine :
maFonction(<? echo "'Riri'"; ?>);


Je pourrais parfaitement intégrer 'Riri' dans mon fichier xml et modifier mon appel comme suit :
maFonction(oElem.lastChild.data);
(par exemple)
Modérateur
Ah ! Juste une petite précision... Smiley langue Dans mon exemple précédent, oElem se trouve dans le fichier xml et non dans le xhtml généré... donc pour aller le chercher, ça impose l'utilisation d'Ajax... (pour envoyer le paramètre dans le JS)

Si par contre, on ne dispose pas de JS, PHP pourrait se servir des méthodes DOM pour récupérer ou mettre à jour l'élément.
A quoi servent ces variables php ? Les conditions qui font qu'un formulaire est validé ou non dépend des saisies dans les formulaires précédents, et il y a d'autres paramètres qui rentrent en compte.

Autre question, pourquoi utiliser un XML ?
Peut-on remplacer ce XML par un .txt ?
Modérateur
Salut,

a écrit :
A quoi servent ces variables php ? Les conditions qui font qu'un formulaire est validé ou non dépend des saisies dans les formulaires précédents, et il y a d'autres paramètres qui rentrent en compte.
Aurais-tu un exemple d'un formulaire où tu as eu besoin d'insérer des variables PHP dans ton JS ? (Quelquechose qui te paraît bloquant si ce n'était pas le cas)

a écrit :
Autre question, pourquoi utiliser un XML ?
Peut-on remplacer ce XML par un .txt ?
Il y a bien entendu plusieurs manières de faire mais l'avantage d'XML est sa portabilité et sa maniabilité (on peut se servir de DOM, XPath, etc...). Cela dit, tout dépend de tes besoins et de tes exigences; le passage en XML n'a rien d'obligatoire...
Je vais raccourcir mon exemple sinon ça serait un peu long... en gros c'est un truc du genre :



$nbChamps = $_POST['nbc'];
$tab = array();
// Remplissage du tableau php, calculs compliqués inutiles ici
$vals = implode(', ', $tab);
echo <<<BIPBIP
<script type="text/javascript">
function f1val () {
var nbChamps = $nbChamps;
var vals = [$vals];
for (var i=0; i < nbChamps; i++) {
var o = document.getElementById('c'+i);
if (parseInt(o.value) > vals[i]) {
alert("......");
return false;
}}

return true;
}

window.onload = function () {
......

document.getElementById('f1').onsubmit = f1val;
....
}
</script>

....

<form id="f1">
<table ..... >
<thead> .... </thead>
BIPBIP;
for ($i=0; $i < nbChamps; $i++) {
echo "<tr><td><input type=\"text\" id=\"c$i\" name=\"c$i\" /></td><td> .... </td> .... </tr>\r\n";
}
echo <<<BIPBIP
</tbody></table>
....
</form>
BIPBIP;


Bon évidemment, j'ai réduit le code au maximum possible. Le remplissage du tableau de valeurs fait intervenir MySQL.

Donc pour externaliser le js... ça risque d'être dur.[/i]
Modérateur
Salut,

On peut quand même l'externaliser mais le principe diffère un peu.
Lorsque tu récupères les valeurs provenant de ta requête, tu pourrais par exemple créer un fichier txt, JSON, XML, etc... ou réécrire ces données au sein de ce fichier puis en appeler le contenu via Ajax pour remplir le tableau JS. (La meilleure méthode dans ce cas me semble être l'utilisation d'un fichier JSON.) Smiley cligne
Modifié par koala64 (10 Feb 2007 - 11:11)
koala64 a écrit :
ou réécrire ces données au sein de ce fichier puis en appeler le contenu via Ajax pour remplir le tableau JS.

Certes !
Un habitant de Lille passe forcément par Bordeaux et Marseille pour se rendre à Paris.

Ton argumentaire en faveur de js ou tout autre action côté client ne tient pas, puisque que de toutes façons, côté serveur faudra refaire tous les contrôles.
Même si le js est quasi présent sur toutes les machines, il n'en demeure pas moins désactivable. Si c'est le cas, tout ton système ne tient plus.

Que le js soit utiliser pour apporter un confort ou une aide, je veux bien l'admettre.
Mais que ce même js soit dépendant de données fournies par le serveur, là franchement je ne vois pas l'intérêt.

Tu parles d'un contrôle js permettant de réduire la charge serveur.
Dans le sujet, le serveur a déjà été sollicité pour permettre l'envoi de données. Il est très envisageable que l'internaute remplissant le formulaire n'aie pas commis la moindre erreur, réduisant l'efficacité de ton js à néant.

Par contre, que l'internaute ai bénéficié ou non de l'action préventive de ton js, côté php, tu vas devoir contrôler toutes les données qu'il transmet.

En gros, deux fois le travail.
Modérateur
On ne partage pas le même point de vue en effet. Smiley lol

Un fichier XML ou JSON est utilisable en PHP comme en JS.
On peut parfaitement récupérer les données de ces fichiers pour monter ses pages.

Maintenant, je ne dis pas le contraire : un langage serveur reste indispensable pour que les données soient accessibles à tout le monde. JS repose sur des données déjà fournies. Il est en effet impossible pour Ajax de faire une requête directement sur la base de données; à un moment donné, il faut faire intervenir PHP mais, dans ce cas, le travail de PHP ne se réduit qu'à cela.
L'avantage de ce fichier supplémentaire est que je peux directement m'en servir en JS sans avoir à générer de requêtes supplémentaires sur la base de données donc si, au contraire, il y a bien un intérêt parce que dans le cas de données déjà présentes dans le fichier tiers, j'y pioche directement sans requête supplémentaire sur la base, ce qui permet d'être beaucoup plus réactif et de soulager le serveur.

De même, à supposer que je double mes vérif' PHP par des vérif' JS équivalentes, je suis assuré d'envoyer des données valides lorsque JS est disponible. De ce fait, la grosse fonction PHP que je lançais en faisant une condition sur un critère d'erreur ne sera pas lancée puisque la donnée reçue ne comportera pas cette erreur. Si je désactive JS, alors cette grosse fonction me sert de secours... C'est parfaitement viable.

Dans le contrôle d'un formulaire, JS intervient avant PHP... avant l'envoi des données au serveur. On ne peut bien entendu pas tout remplacer mais passer outre ses avantages indéniables, c'est se mettre un voile sur les yeux... Smiley cligne