8791 sujets

Développement web côté serveur, CMS

Bonjour,

c'est ma première tentative de création de cookie.

J'ai deux documents php concernés et donc un peu plus de page code html (include conditionnelles)

J'ai fait ce script :

gestion_active_lightbox.php

<?php
        $choix = array(
		'oui'
        );
        
        if (isset($_GET["active_js"])) {
        $active_js=$_GET["active_js"];
        if($active_js=='oui')
        {
        setcookie('active_js', $_GET['active_js'], time() + (365 * 24 * 3600));
        $begin_stop_lightbox="";
        $end_stop_lightbox="";
        $link_js_active_lightbox='<script type="text/javascript" src="desactive_lightbox.js"></script>';
        }
        else {
        setcookie('active_js');
        $begin_stop_lightbox="<!--";
        $end_stop_lightbox="-->";
        $link_js_active_lightbox='<script type="text/javascript" src="active_lightbox.js"></script>';
        }
        }
        
        else if(in_array($_COOKIE['active_js'], $choix, true)) {
        $begin_stop_lightbox="";
        $end_stop_lightbox="";
        $link_js_active_lightbox='<script type="text/javascript" src="desactive_lightbox.js"></script>';
        }
        
        
        else {
        $begin_stop_lightbox="<!--";
        $end_stop_lightbox="-->";
        $link_js_active_lightbox='<script type="text/javascript" src="active_lightbox.js"></script>';
        }
?>


et j'ai placé l'insertion de ce code dans chacun des deux documents php concernés avec, avant <!DOCTYPE etc... comme il se doit, par :

<?php
        header('Content-type: text/html; charset=iso-8859-1');
        include '../include/gestion_active_lightbox.php';
?>


Tout cela fonctionne plutôt bien en fait, mais il se passe quelque chose que je ne comprend pas, si je créé le cookie à partir du premier document php, ou de toute page générée par include, et bien le cookie n'est pas pris en compte dans le document 2 et je suis obligé d'en créer un autre.

Du coup je me retrouve avec deux cookies qui ont le même nom, le même contenu mais deux chemins différents.

Je me dit bien qu'il y a une lamentable erreur de ma part là dedans mais je n'y arrive pas.

Donc à votre bon coeur...

Merci

PS :
Ouè, ouè, je sais, j'ai juste un peu piqué sur le dernier tutos de styleswitcher php pour le code Smiley cligne
Modifié par Christian Le Bouler (28 Jun 2007 - 05:57)
Salut Smiley cligne ,
Christian Le Bouler a écrit :
c'est ma première tentative de création de cookie.
Ben alors faut fêter ça Smiley biere


En testant ton code j'ai juste dû rajouter un test sur l'existence du cookie avant de faire le in_array($_COOKIE... (chez moi j'ai un warning à cause du register_global à off) mais ça marchait Smiley lol

Alors si ça ne fonctionne pas chez toi je ne vois que 2 raisons possibles : soit tes pages ne sont pas dans le même répertoire (ce que je suppose d'après ce que tu as dit), soit il y a un problème avec la variable GET active_js dans un de tes forms (ce qui serait étonnant).

Donc je mets le code qui devrait fonctionner en rendant le cookie disponible sur tout le site :
<?php
$choix = array(
'oui'
);

if (isset($_GET["active_js"])) {
	$active_js=$_GET["active_js"];
	if($active_js=='oui') {
		setcookie('active_js', $_GET['active_js'], time() + (365 * 24 * 3600), '/');
		$begin_stop_lightbox="";
		$end_stop_lightbox="";
		$link_js_active_lightbox='<script type="text/javascript" src="desactive_lightbox.js"></script>';
		}
		else {
		setcookie('active_js', '', 0, '/');
		$begin_stop_lightbox="<!--";
		$end_stop_lightbox="-->";
		$link_js_active_lightbox='<script type="text/javascript" src="active_lightbox.js"></script>';
	}
}
else if(isset($_COOKIE['active_js']) && (in_array($_COOKIE['active_js'], $choix, true))) {
	$begin_stop_lightbox="";
	$end_stop_lightbox="";
	$link_js_active_lightbox='<script type="text/javascript" src="desactive_lightbox.js"></script>';
}
else {
$begin_stop_lightbox="<!--";
$end_stop_lightbox="-->";
$link_js_active_lightbox='<script type="text/javascript" src="active_lightbox.js"></script>';
}
?>


Pour plus d'infos voir le paramètre path sur cette page.

A+ Smiley smile
Modifié par Heyoan (28 Jun 2007 - 03:15)
Salut

Merci beaucoup Heyoan, effectivement le fait de mettre le path '/' en paramètre a résolu le problème comme il est bien décrit dans le lien que tu as donné.

J'ai aussi tenu compte de ta remarque sur le test de l'existence du cookie.

Merci encore Smiley smile
Pourquoi gérer le cookie en PHP alors qu'il sert à gérer le comportement du javascript ?
Modifié par PeterPetrelli (28 Jun 2007 - 07:39)
PeterPetrelli a écrit :
Pourquoi gérer le cookie en PHP alors qu'il sert à gérer le comportement du javascript ?


Salut PeterPetrelli,

en fait le cookie ne sert pas à gérer le comportement javascript mais bien l'effectivité même du javascript lightbox par la présence ou non dans le head du document des linkages vers les fichiers externes concernés.

Comme j'ai un peu fait évolué le script ça devrait être plus clair, ça donne ceci en fait :

gestion_active_lightbox.php

<?php
        $choix = array(
		'oui'
        );
        
        if (isset($_GET["active_lightbox"])) {
        $active_lightbox=$_GET["active_lightbox"];
        if($active_lightbox=='oui')
        {
        setcookie('active_lightbox', $_GET['active_lightbox'], time() + (365 * 24 * 3600), '/');
        $include_link_lightbox='oui';
        $link_js_active_lightbox='<script type="text/javascript" src="desactive_lightbox.js"></script>';
        }
        else {
        setcookie('active_lightbox', '', 1, '/');
        $include_link_lightbox='non';
        $link_js_active_lightbox='<script type="text/javascript" src="active_lightbox.js"></script>';
        }
        }
        
        
        else if(isset($_COOKIE['active_lightbox']) && (in_array($_COOKIE['active_lightbox'], $choix, true)))
        {
        $include_link_lightbox='oui';
        $link_js_active_lightbox='<script type="text/javascript" src="desactive_lightbox.js"></script>';
        }
        
        
        else {
        $include_link_lightbox='non';
        $link_js_active_lightbox='<script type="text/javascript" src="active_lightbox.js"></script>';
        }
?>




Avec dans le head des documents concernés

<?php
        if ($include_link_lightbox=='oui') {include '../include/link_lightbox.php';}
?>




Le fichier à inclure link_lightbox.php étant :


<script type="text/javascript" src="../javascript/lightbox/prototype.js"></script>
<script type="text/javascript" src="../javascript/lightbox/scriptaculous.js?load=effects"></script>
        
<?php
if (isset($_GET["nom_galerie"])) {
$nom_galerie=$_GET["nom_galerie"];
$nom_galerie_for_js=str_replace(".inc","",$nom_galerie);
?>
<script type="text/javascript" src="../javascript/commentaires_thema/commentaires_<?php echo $nom_galerie_for_js; ?>.js"></script>
<?php
}
?>
<?php
if (isset($_GET["galerie"])) {
$galerie=$_GET["galerie"];
$repere_for_js=str_replace("galerie","",$galerie);   
?>
<script type="text/javascript" src="../javascript/commentaires_full_gal/commentaires_serie_<?php echo $repere_for_js; ?>.js"></script>
<?php
}
?>
        
<script type="text/javascript" src="../javascript/lightbox/temp_lightbox.js"></script>
        
<link rel="stylesheet" href="../javascript/lightbox/lightbox.css" type="text/css" media="screen, projection" />

Oui je vois bien mais, là ton ton cookie ne sert qu'a determiné quel fichier doit etre inclus, car dans tous les cas tu inclus un fichier javascript.

Donc plutot que d'avoir plusieurs fichier js, un script php qui gère les cookies pour savoir lequel inclure etc .. il serait plus performant de passer la gestion du cookie directement au javascript .

Mais ca reste mon avis.
Oui mais ce que je ne comprend pas bien dans ce que tu indiques c'est que, au plus, javascript permettrait de gérer la création et la suppression du cookie. Car c'est bien à php que reviendrait la question de lire ce cookie puisque ce qui est en jeu c'est la production (ou non) de code source dans le document envoyé par le serveur.

Evidemment ce code source est bien un appel à des fichiers .js, mais ça ne change rien au fond, du code source c'est du code source, et si j'ai bien tout compris c'est bien l'affaire des langages coté serveur que de le générer.

Il y a quelque chose qui cloche dans mon raisonnement ?
Modifié par Christian Le Bouler (28 Jun 2007 - 13:59)
Prenons ton cas :

- quoi qu'il arrive tu inclus un fichier javascript dans ta page
- un cookie determine quel fichier doit etre inclus
- en fonction du fichier inclus le javascript n'est pas le meme et donc le comportement de la page non plus ( a priori )

je ne vois là rien qui nécessite un traitement coté serveur . Autant passer le relais au clients

donc : tu inclus un seul et unique fichier javascript ,c'est lui qui s'occupe de poser et de lire le cookie , en fonction de celui ci il determine quelles fonction doit etre éxécuté .


c'est plus logique à mon sens tu sépare la logique de la présentation . si demain tu n'utilise plus le javascript tu n'as pas à toucher a ton script PHP.
Bonsoir,

Si j'ai bien compris ton raisonnement PeterPetrelli, c'est comme pour le css ou tout effet javascript.

Si on as un lien qui permet d'activer une fonction JS, alors ce lien devrais être créer en JS et non pas dans le dur. Comme le cookie permet d'inclure une fichier JS, ça serais plus logique de créer et lire le cookie en JS.

Après, est ce que ça vaut vraiment le coup pour un cookie ? (Sachant que seul 6 % des internautes n'ont pas le javascript d'activer)
a écrit :

Si j'ai bien compris ton raisonnement PeterPetrelli, c'est comme pour le css ou tout effet javascript.

Si on as un lien qui permet d'activer une fonction JS, alors ce lien devrais être créer en JS et non pas dans le dur. Comme le cookie permet d'inclure une fichier JS, ça serais plus logique de créer et lire le cookie en JS.

Après, est ce que ça vaut vraiment le coup pour un cookie ? (Sachant que seul 6 % des internautes n'ont pas le javascript d'activer)


tu résume parfaitement la situation .

un bon script sépare la logique de la présentation .
Ici le javascript ne sert ( a priori ) que pour la présentation pourquoi laisser la partie logique ( ici le controleur ) gérer ca ?

si le javascript du client est désactivé ton script php aura travaillé pour rien .
si demain tu decide de changer ton code ou les noms de tes fichiers javascript il faudra également changer ton code php si tu n'a pas fait "cette erreur" tu n'aura que le JS à modifier.

bref ca fait partie des "bonnes pratiques" de conceptions
Salut,

Super_baloo8 a écrit :

Comme le cookie permet d'inclure une fichier JS, ça serais plus logique de créer et lire le cookie en JS.


Et pour aller au bout du raisonnement de faire l'include en JS.

Or très précisemment on ne peut pas faire d'include en JS.

a écrit :

Si on as un lien qui permet d'activer une fonction JS, alors ce lien devrais être créer en JS et non pas dans le dur.


Cela tu imagines bien que je le sais et le promeus, donc c'est exactement ce que je fais.

La construction que j'ai faite est la suivante :

Le but est de rendre actif ou non le javascript de présentation de photo "lightbox".
Au départ ce script n'est pas actif, et aucun des liens vers les fichiers.js et autres (<script src=""></script> etc...) concernant "lightbox" n'est présent dans le <head>.

. Un lien est généré en javascript dans le document, ce lien permet de transmettre une instruction php :

<a href="?active_lightbox=oui">


. En réponse à cette instruction un script php d'include conditionnelle inclut dans le code source l'ensemble des liens <script src=""> ...
Et créé en même temps un cookie rendant cette inclusion permanente sauf nouvelle instruction.

La réversibilité est obtenue par le fait que le javascript créant le lien :

<a href="?active_lightbox=oui">

est remplacé par le javascript créant :

<a href="?active_lightbox=non">


Remplacement lui aussi permanent puisque géré par le cookie. Evidemment pour la gestion de ce lien j'aurais pu créé un cookie en javascript mais ce n'est plus utile puisque un cookie existe déjà pour la gestion de l'include conditionnelle.
Et, encore une fois je ne vois pas comment on peut gérer une include conditionnelle en javascript ni quelle fonction équivalente existerait sauf à y aller carrément du document.write()

Evidemment la question pourrait être "peut on rendre le script lightbox inactif via javascript ?", sauf que ça justement je ne voyais pas du tout comment faire.
J'ai donc élaboré ma propre solution.

Et en plus dans la logique de mise en place de javascript discret j'ai trouvé mon petit essai très amusant. Car enfin quelle est la situation pour un visiteur avec javascript inactif ?

. Pas de lightbox
. Pas de lien pour activer lightbox dans la page
. Pas de code de ce lien dans le code source
. Et en plus un <head> pas trop encombré avec ça.

C'est complètement anecdotique bien sur, mais plus discret que ça tu meurs Smiley langue


Donc tout ça pour dire que je ne vois toujours pas comment j'aurais pu procéder autrement pour ce que je souhaitais faire.
Modifié par Christian Le Bouler (29 Jun 2007 - 23:12)