Pages :
Bonjour,

Suite à l'installation du Style switcher en php d'alsacreations mon problème est le suivant :
Mon cookie style est bien présent dans la liste des cookies de Firefox 2 mais le style sélectionné en quittant mon site n'est pas gardé ni d'une page à l'autre ni à la réouverture du navigateur.

Pour info: Il n'y a, pour l'instant, que le choix :
-> style par défaut
-> sans feuille de style.

Le code php (en tout début de page) :

<?php
if(isset($_POST['change_style']))
// On vérifie que le formulaire a été soumis
{
	if(file_exists("./".$_POST['style']."/style.css"))
	{
		// On fait un cookie d'une année de durée pour garder en mémoire le style choisi et le récupérer à la prochaine visite

		setcookie('style', $_POST['style'], time()+(365*24*3600)) ;
		// Si le fichier *.css existe on définit une variable $css correspondant au style choisi
		$css = $_POST['style'] ;
	}
}
elseif(isset($_COOKIE['style']))
// Si le formulaire n'a pas été soumis, on vérifie si le cookie style existe et si tel est le cas on définit une variable $css correspondant à ce style
{
	$css = $_COOKIE['style'] ;
}	
else
// Si le cookie n'existe pas et que le formulaire n'a pas été soumis, on définit une variable $css correspondant au style par défaut, ici "style.css" du dossier "styles" par exemple
{
	$css = "styles" ;
}
?>


Le code xhtml de l'importation du style dans head :

<?php
// Style de la page
echo "<style type=\"text/css\" media=\"screen\">\n" ;
echo "@import url(".$css."/style.css) ;\n" ;
echo "</style>\n" ;
?>


Et le code du formulaire :

<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
	<div id="style_switcher">
		<label for="style">Choisir le design :</label>
			<select id="style" class="champ" name="style">
				<option value="styles" selected="selected">Par défaut</option>
				<option value="brut">Brut</option>
			</select>
			<input class="bouton_switch" type="submit" name="change_style" value="ok" />
	</div>
</form>


Merci d'avance pour vos explications. Smiley help
Modifié par ideas generator (24 Nov 2006 - 15:21)
Bonjour.
Tel que rédigé, le contenu de la variable $_POST contien "OK", ce qui n'est pas un style valide.
Dans un premier temps, en modifiant le code comme suit, cela devrait donner un résultat. (sous réserve d'autres problèmes...)


	<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
		<div id="style_switcher">
			<label for=[b]"style"[/b]>Choisir le design :</label>
				<select id=[b]"style"[/b] name=[b]"style"[/b] class="champ" >
					<option value="styles" selected="selected">Par défaut</option>
					<option value="brut">Brut</option>
				</select>
				<input class="bouton_switch" type="submit" /*name="change_style"*/  [crash]  value="ok" />
		</div>
	</form>


<?php
// if(isset($_POST['change_style']))[crash] 
if(isset($_POST['style']))
...
?>

C'est à dire que du fait de l'attribut name du bouton, submit, c'est la valeur de ce dernier qui est renvoyé en POST. Donc, cet attribut doit être suprimé.
D'autre part, il y avait un mic-mac avec le nom "style" et le nom "change_style".
Dans ma version, j'utilise "style".
Ainsi, la variable $_POST["style"] peut contenir la valeur "styles" ou "brut".

Si ça peux vous aider...

Smiley smile
Je viens d'essayer cette solution, ça roule.

J'ai aussi essayé (pour voir Smiley cligne ) de changer la valeur de style par défaut si le cookie n'existe pas et que le formulaire n'a pas été soumis :

else
// Si le cookie n'existe pas et que le formulaire n'a pas été soumis,
on définit une variable $css correspondant au style par défaut,
ici "style.css" du dossier "styles" par exemple
{
	$css = "[#red]brut[/#]" ;
}
?>

Et là, le cookie se crée.

J'ai donc de nouveau remplacé la valeur
$css = "[#red]brut[/#]" ;
par
$css = "[#green]style[/#]" ;

Le cookie est envoyé et sa valeur est changée.

Par contre, malgré le cookie, le style n'est pas gardé de page en page ni à la réouverture du navigateur.

Ca me contrarie de ne pas comprendre pourquoi ça ne marche pas...

Pour info : j'ai laissé le code tel que conseillé par GeorgesM.
Modifié par ideas generator (24 Nov 2006 - 11:45)
Bon. J'ai écrit pas mal d'algo dans ma jeunesse, et j'en retire une sainte horreur des structures conditionnelles, Smiley mur (à part switch, peut-être).

Donc, quand je vois des if, des else, et des elseif, je me dis qu'il faut avoir un QI de martien Smiley nut pour envisager quel résultat donne (et donnera) la fonction...

Je vous propose d'utiliser l'opérateur ternaire " ? : " pour gérer tout ça...


<?php
$css = (isset($_COOKIE['style'])) ? $_COOKIE['style'] : "styles"; // par défaut
// Surcharge éventuelle par $_POST si le fichier existe
$css = ((isset($_POST["style"])) && (file_exists("./".$_POST['style']."/style.css"))) ? $_POST["style"] : $css; 
setcookie('style', $css, time()+(365*24*3600)) ; // C'est reparti pour un an [winner] 
?>


C'est j'en conviens, bourrin et rentre dedans, mais d'une efficacité redoutable, beaucoup plus facile à lire que les conditions imbriquées, plus facile à relire dans trois semaines... etc, etc...

A part ces avantages, il y en a deux autres : on est sur que $css est renseigné dans tous les cas, et le cookie est rafraichi à chaque visite...

A partir de là, il n'y a pas de raison que le reste des pages n'en bénéficie pas... sous réserve de relire le cookie, ou d'utiliser une variable de session.
Modifié par GeorgesM (24 Nov 2006 - 12:36)
Merci !

[Entre nous : peut on se "tutoyer" (En cette année 2006, je n'ai que 26 ans) ?]

j'essaie ça tout de suite...
Modifié par ideas generator (24 Nov 2006 - 12:43)
Après essai :

Le point positif, c'est que le cookie est bien envoyé ;
Le point négatif, c'est que le style ne se change plus du tout.
Peut être parce que le dossier "brut" n'existe pas ? Smiley cry

(à première vue)

Après essai, ça fonctionne, sous réserve de disposer d'une feuille brut/styles.css... vide. Smiley ola
Modifié par GeorgesM (24 Nov 2006 - 13:23)
Apparament, ça marche aussi chez v... chez toi.


Petite suggestion, en passant : le code suivant positionne l'attribut "selected" en fonction du $css courant.
De plus, l'extension à d'autres styles se fait en rajoutant son nom au tableau..

	<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
		<div id="style_switcher">
			<label for="style">Choisir le design :</label>
				<select id="style" name="style" class="champ" >
				<?php
					// Il suffit de rajouter les styles dans le tableau $tab
					$tab = array("brut","styles");
					foreach ($tab as $item)
					{
						$selected = ($item == $css) ? "selected=\"selected\"" : "";
						$lib = ($item == "styles") ? "Par défaut" : $item;
						echo "<option value=\"$item\" $selected >$lib</option>";
					}
				?>
				</select>
				<input class="bouton_switch" type="submit" value="ok" />
		</div>
	</form>

Modifié par GeorgesM (24 Nov 2006 - 13:44)
GeorgesM a écrit :
Il faudrait regarder le code généré (code source de la page)


Oupss ! J'avais créer un dossier "brut" et une page "brut.css". Ceci est arrangé.
Ca fonctionne maintenant, sauf pour les pages "accessibilité.php" et "confidentialite.php" qui ne sont pas à la racine du site comme les autres.

J'ai donc ajouté un point dans le code php de ces deux pages :

<?php
$css = (isset($_COOKIE['style'])) ? $_COOKIE['style'] : "styles"; // par défaut

// Surcharge éventuelle par $_POST si le fichier existe
$css = ((isset($_POST["style"])) && (file_exists("[#red].[/#]./".$_POST['style']."/style.css"))) ? $_POST["style"] : $css; 

setcookie('style', $css, time()+(365*24*3600)) ; // C'est reparti pour un an winner  
?>


C'est impeccable.
Merci pour tout !
Modifié par ideas generator (24 Nov 2006 - 13:45)
GeorgesM a écrit :

De plus, l'extension à d'autres styles se fait en rajoutant son nom au tableau..

	<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
		<div id="style_switcher">
			<label for="style">Choisir le design :</label>
				<select id="style" name="style" class="champ" >
				<?php
					// Il suffit de rajouter les styles dans le tableau $tab
					$tab = array("brut","styles");
					foreach ($tab as $item)
					{
						$selected = ($item == $css) ? "selected=\"selected\"" : "";
						$lib = ($item == "styles") ? "Par défaut" : $item;
						echo "<option value=\"$item\" $selected >$lib</option>";
					}
				?>
				</select>
				<input class="bouton_switch" type="submit" value="ok" />
		</div>
	</form>


Je ne comprend pas bien l'histoire du "tableau"...
Modifié par ideas generator (24 Nov 2006 - 13:48)
Il est judicieux d'utiliser la variable $_SERVER["DOCUMENT_ROOT"] comme suit:


$css = ((isset($_POST["style"])) && (file_exists($_SERVER["DOCUMENT_ROOT"] ."/".$_POST['style']."/style.css"))) ? $_POST["style"] : $css; 


De cette manière, le code fonctionne à partir de n'importe quelle page...

Pour le tableau, fais un essai avec un troisieme style, (une feuille toute simple dans un nouveau répertoire, exemple "bleu/style.css"), en rajoutant le nom de ce répertoire (bleu) au tableau $tab, il y aurait trois choix au lieu de deux.


$tab = array("brut","styles","bleu");

Modifié par GeorgesM (24 Nov 2006 - 13:54)
a écrit :
Il est judicieux d'utiliser la variable $_SERVER["DOCUMENT_ROOT"] comme suit:


ça fonctionne sauf dans le cas où on choisit le style par défaut sur la page accessibilité ou confidentialité (Je le rappel, pas au même niveau, pour les gens qui prennent le sujet en cours) et que l'on retourne sur une autre page, par exemple, index.php.
Modifié par ideas generator (24 Nov 2006 - 14:02)
ça viens peut-être de ça :


echo "@import url(".$css."/style.css) ;\n" ;


Il faudrait remplacer l'adresse relative par l'adresse absolue (du site), en rajoutant un slash :


echo "@import url(         /      ".$css."/style.css) ;\n" ;


De toute façon, il faut de nouveau regarder le code source des pages en question...

... La variable $url est vide ?

@import url(..//style.css) ;

Modifié par GeorgesM (24 Nov 2006 - 14:14)
GeorgesM a écrit :
ça viens peut-être de ça :


echo "@import url(".$css."/style.css) ;\n" ;


Il faudrait remplacer l'adresse relative par l'adresse absolue (du site), en rajoutant un slash :


echo "@import url(         /      ".$css."/style.css) ;\n" ;


De toute façon, il faut de nouveau regarder le code source des pages en question...


Comme ça par exemple dans mon cas :

echo "@import url(http://www.id-generator.com/".$css."/style.css) ;\n" ;

Modifié par ideas generator (24 Nov 2006 - 14:12)
Non, plus simplement avec le slash :


@import(/rep/style.css)


... Apparament, ça fonctionne... Smiley lol
Modifié par GeorgesM (24 Nov 2006 - 14:16)
Reprenons ensemble où j'en suis à 14h20, si tu le veux bien :

Le php du head (De toutes les pages, peu importe la profondeur) :
<?php
$css = ((isset($_POST["style"])) && (file_exists($_SERVER["DOCUMENT_ROOT"] ."/".$_POST['style']."/style.css"))) ? $_POST["style"] : $css;  // par défaut

// Surcharge éventuelle par $_POST si le fichier existe
$css = ((isset($_POST["style"])) && (file_exists("./".$_POST['style']."/style.css"))) ? $_POST["style"] : $css; 

setcookie('style', $css, time()+(365*24*3600)) ; // C'est reparti pour un an winner  
?>


L'appel de la CSS (De toutes les pages, peu importe la profondeur) :
<?php
// Style de la page
echo "<style type=\"text/css\" media=\"screen\">\n" ;
echo "@import url(/".$css."/style.css) ;\n" ;
echo "</style>\n" ;
?>


Le formulaire (De toutes les pages, peu importe la profondeur) :

<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
	<div id="style_switcher">
		<label for="style">Choisir le design :</label>
			<select id="style" name="style" class="champ" >
				<?php
			// Il suffit de rajouter les styles dans le tableau $tab
				$tab = array("brut","styles");
				foreach ($tab as $item)
						{
						$selected = ($item == $css) ? "selected=\"selected\"" : "";
						$lib = ($item == "styles") ? "Par défaut" : $item;
						echo "<option value=\"$item\" $selected >$lib</option>";
					}
				?>
			</select>
			<input class="bouton_switch" type="submit" value="ok" />
		</div>
</form>

Smiley sweatdrop Confirmes tu ?
Modifié par ideas generator (24 Nov 2006 - 14:34)
Pages :