Les sessions pour plusieurs utilisations
Salut à tous !
i'm back :D
bon voila mon petit souci !
les sessions ! en temps normale je sais m'en servir !
mais la je me suis fais une petite structure MVC simple et basic avec comme controlleur la page index qui redirige !
la ou je me pose des questions c'est que par exemple j'ai un fichier de constante pour faire
le site en multilangue que je gère avec les sessions, je me suis fais un panier d'achat qui utilise les sessions !
ma class panier créer une session si il en existe pas !
mais j'ouvre aussi une session à la base pour le multilingue et je veux géré une session utilisateur !
bref je penses que pour le tout il ne faut faire qu'une session !
j'en appelle à vos conseilles ? faut il créer un fichier qui à lui tous seul gère la session
et l'inclure dans le mainlayout de mon site !
désolé si je suis pas très claire ! si vous avez des questions je suis la !
Merci d'avance pour votre aide !
Réponses apportées à cette discussion
Hum effectivement ce n'est pas super clair ^^ Mais bien sûr une seule session suffit. Tu devrait refactorer ton code en utilisant une classe User qui va gérer toutes les sessions. En gros tu peux avoir quelque chose comme ça :
<?php class SessionStorage { // Classe de gestion de la session} class ShoppingCart { // Classe pour le panier d'achat} class User { private $sessionStorage = null; private $shoppingCart = null; public function setCulture($culture = 'en') { // Ici tu contrôle la culture et tu charges ton fichier de traduction // par exemple }} $user = new User(new SessionStorage());$user->setCulture('fr');$user->setShoppingCart(new ShoppingCart());$user->addItemToShoppingCart($monItem); ?>
Bref la je te donne une idée pour procéder que tu peux creuser. Grâce à cela tu peux vraiment découpler ton user, de la manière dont est gérée sa session et de son panier d'achat.
++
Merci Emacs en effet c'etait pas très claire mdrr mais malgré ça tu m'as donné une bonne piste !
je vais développer ça et je te reviens si j'ai rencontré des problèmes lol!
(^_^) ++
Hello ! re moi !
je re car je voulais savoir si je suis bien parti !
j'ai fais ma classe sessionStorage comme tu me l'as conseiller !
Emacs je trouve ton idée pas mal du tout ! j'ai encore un peu de mal avec la POO surtout niveau relation) mais je persevers !
pour etre plus claire je te montre mon architecture(ca aussi c'est pas toujours evident) !
j'ai donc fais en MVC mais pas objet d'ailleurs si tu as des conseils à m'apporté la dessus je suis prenneur !
<?php
DEFINE('MODEL', 'models/');
DEFINE('VIEW', 'views/');
if(isset($_GET['action'])) {
switch($_GET['action']) {
case 'contact':
$contentlayout = MODEL.'contact.php';
$layout = VIEW.'mainlayout.php';
break;
default:
$contentlayout = MODEL.'home.php';
$layout = VIEW.'mainlayout.php';
exit;
}
} else {
$contentlayout = MODEL.'home.php';
$layout = VIEW.'mainlayout.php';
}
require_once($layout);
?>
ensuite mon mainlayout qui m'évite de dupliquer le code pour chaque page c'est pratique (j'adore lol)
j'ai juste instancié l'objet SessionStorage pour voir si ca fonctionnais
<?php
require_once('classes/SessionStorage.php');
$session = new SessionStorage();
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>mon site</title>
<meta http-equiv="content-type"
content="text/html;charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" type="text/css" href="css/default.css" />
</head>
<body>
<div id="container">
<br /><br />
<a href="index.php?action=contact">Contact</a>
<?php require_once($contentlayout); ?>
</div>
</body>
</html>
ensuite ma classe de session ! peut etre devrais rajouter ou plutôt devrais je faire une meilleurs verifcation de ma session pour savoir si elle existe déjà ou rajouter une exception ?
DEFINE('TMP', '../tmp');
DEFINE('USER', 'User');
class SessionStorage {
/**
* Constructor
*
* @access public
*/
public function __construct()
{
if(session_id() == "") {
@session_name(USER);
@session_save_path(TMP);
@session_start();
}
}
/**
* Return the session_id
*
* @access public
* @return <string>
*/
public function getSessionID() {
return session_id();
}
/**
* Return name session
*
* @access public
* @return <string>
*/
public function getSessionName() {
return session_name();
}
/**
* Destroy the session
* @access public
*/
public function sessionDestroy() {
session_unset();
session_destroy();
}
}
la ou j'ai du mal c'est avec ma classe User !
peux tu m'aider stp ? j'ai fais un constructeur mais dans ton petit exemple t'en a pas mis ! peut etre y'en a t'il pas besoin !
je ne rajoute pas mon panier tout de suite je veux d'abord gérer le multilangue c'est ma priorité pour le moment mais comme ta solution est flexible ca ne devrais pas poser de problème pour la suite !
voici mon début de classe User
class User {
private $sessionStorage = null;
public function __construct($session) {
if($this->sessionStorage != null) {
$this->sessionStorage;
}
$this->sessionStorage = $session;
}
public function setCountry($country = 'FR') {
include('model');
}
}
?>
voila j'espère que c pas trop le bazard pour toi lol
avec php quand on utilise des choses un peu séparément c'est pas trop dur mais dés qu'on dois allié plusieurs chose en meme temps comme le MVC avec les session, BDD, voir ajax c'est pas évident quand on est débutant ! aussi j'ouvrirais un post peut etre pour tranformé ma structure MVC ci-dessus en POO peut etre que ca serais interessant ?
merci pour ton aid Emacs ! je sais que tu es pas mal occupé ! :)
Voilà ce que je t'entendais comme relation entre le User et le SessionStorage :
<?php
class SessionStorage
{
/**
* Constructor
*
* @param string $sessionName Name of the session
*/
public function __construct($sessionName = PHPSESSID)
{
session_name($sessionName);
session_start();
}
/**
* Destructor : clears the session
*/
public function __destruct()
{
$this->clearSession();
}
/**
* Clears the session
*/
public function clearSession()
{
session_destroy();
$_SESSION = array();
unset($_SESSION);
}
/**
* Set an attribute in session
*
* @param string $name Name of the attribute
* @param mixed $value The value to store in session (integer, array, object...)
*/
public function setAttribute($name, $value)
{
$_SESSION[$name] = $value;
}
/**
* Returns a stored attribute if exists
*
* @param string $name The attribute stored in session
* @return mixed|null $value
*/
public function getAttribute($name)
{
return isset($_SESSION[$name]) ? $_SESSION[$name] : null;
}
}
class User
{
protected $sessionStorage = null;
public function __construct(SessionStorage $sessionStorage)
{
$this->sessionStorage = $sessionStorage;
}
public function setAttribute($name, $value)
{
$this->sessionStorage->setAttribute($name, $value);
}
public function getAttribute($name)
{
return $this->sessionStorage->getAttribute($name);
}
}
Tu as l'air de te monter petit à petit les prémices d'un framework. Je t'invite à jeter un oeil au framework symfony pour voir comment il fonctionne ainsi qu'aux présentations Powpoint de Fabien Potencier présentes sur son site perso : http://www.aide-de-camp.org/
++
Merci Emacs je vais tester tous ça !
En effet tu as raison je souhaite créer mon propre Frameworks !
Bien que les autres soit très performant et avancer l'architecture d'un site bien structuré m'interesse beaucoup et je trouve qu'on en parle pas assé !
la plupart du temps on me dirige vers des frameworks pour les déchiffrer mais quand on est débutant et même si on a les codes source, c'est pas facile car beaucoup de fichiers et ligne parfois complexe !
j'aime bien l'esprit framewoks et même si je galère, que l'on trouve pas beaucoups de tutos dessus, je vais pas laché l'affaire ^^ je vais être capable le faire tous seul pour le plaisirs ! et l'air de rien on vois beaucoup plus de chose en php à force de manger du code et des algos plus complexe !
Voilà pourquoi je fais tout ça ! tu as visé juste :D
Salut !
Voila toutes ces astuce m'on aider à avancer mais la j'ai un problème !
le but c'est que quand l'utilisateur click sur un drapeau ca change de langue le temps de ça navigation
mais la je bloque car quand je click ca change mais quand je change de page ca reviens par defaut !
bref un peu de code pour mieux comprendre !
/**
* Set Country language
* @param <string> $country
*/
public function setCountry($country = 'FR')
{
DEFINE("PATH_COMMON", "common/");
switch($country)
{
case 'EN':
$file = 'EN';
break;
case 'FR':
$file = 'FR';
break;
default:
$file = 'FR';
exit;
}
$this->sessionStorage->setAttribute("country", $file);
}
<?php
require_once('classes/SessionStorage.php');
require_once('classes/User.php');
$session = new User(new SessionStorage);
if(isset($_GET['translate']))
{
$session->setCountry($_GET['translate']);
}
else
{
$session->setCountry();
}
require_once("common/".$session->getAttribute("country").".php");
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
mes lien je les fais comme suit :
<?php
$action = str_replace('.php', '', $contentlayout);
echo "<a href=\"index.php?action=".$action."&translate=EN\">English</a> | ";
echo "<a href=\"index.php?action=".$action."&translate=BRA\">Brasil</a> | ";
echo "<a href=\"index.php?action=".$action."&translate=FR\">French</a>";
?>
voila je sais que mon problème vien du $_GET['translate'] mais je vois pas trop comment parer ça !
car à chaque fois que je change de page il ne garde pas en session mon fichier ! je me doute que ce doit etre tout bête pourtant !
Vincent :)
Salut,
Ton code a quelques problème. Tout d'abord, le define() dans le corps de la méthode c'est très très moche ^^
En PHP OO, tu peux créer des constantes internes à ta classes grâce au mot-clé "const". Sers toi en.
Ensuite, je ferais quelque chose comme ça pour la langue :
<?php
class User {
protected static $availableCultures = array();
protected $sessionStorage = null;
public function setCulture($culture) {
if (!$this->isValidCulture($culture)) {
throw new CultureException(sprintf('The given culture %s is not valid', $culture));
}
$this->getSessionStorage()->setAttribute('user_culture', $culture);
}
public function getCulture() {
return $this->getSessionStorage()->getAttribute('user_culture');
}
public function setAvailableCultures(Array $cultures) {
self::$availableCultures = $cultures;
}
protected function isValidCulture($culture) {
return in_array($culture, self::$availableCultures);
}
}
Dans ton contrôleur :
<?php
// Initialisation
define('USER_DEFAULT_CULTURE', 'en');
User::setAvailableCultures(array('en','fr'));
$user = new User();
// Doit-on charger la culture par défaut ?
if (is_null($user->getCulture()) {
$user->setCulture(USER_DEFAULT_CULTURE);
}
// Changement de culture
if (!empty($_REQUEST['lang'])) {
try {
$user->setCulture($_REQUEST['lang']);
} catch(CultureException $e) {
// Tu gères l'erreur comme tu veux
}
}
// Chargement du nouveau contexte de langue
require(dirname(__FILE__).'/translates/'. $user->getCulture() .'.php');
Voilà :)
++
Hugo.
laisse tomber je suis fatiguer mdrr je me suis tromper de sujet !
excuse moi Emac si tu peux effacer le message que j'ai l'aisser sur l'autre post au lieu de celui la!
je boss trop je sais même plus ce que je fais ! bref je le refais içi
ton code marche niquel et j'avais un problème quand je changait la langue ok ça marche mais quand je changais de page ca revenais par default !
et ça viens de ce bout de code la regarde :
classe SessionStorage:
<?php
/**
* Clear the Session
*/
public function clearSession()
{
session_destroy();
$_SESSION = array();
unset($_SESSION);
}
/**
* Destructor: Clears the session
*/
public function __destruct()
{
$this->clearSession();
}
?>
je te rassure ça nettoie niquel même trop lol car à chaque fois on detruit la session !
donc je penses que je devrais garder seulement la méthode clear session et ne pas détruire l'objet ?
ton avis sur la question?
encore désolé pour mon erreur de post ! je suis fatigué !
Effectivement j'ai fait l'erreur de mettre la méthode __destruct() qui vide toute la session à la fin donc impossible de la retrouver sur la page suivante. Tu peux supprimer ta méthode __destruct() de ton objet sans problème et ça devrait aller mieux.
salut Emacs !
encore merci pour ton aide sur ce coup la !
on ai toujours bien accueilli ici ca fais plaisirs !
ça marche clean :D
en tout cas pour moi c'est opérationnel si tu souhaites fermer ce post !
(^_^)
++ Vini
Pas de quoi !
Je prends également beaucoup de plaisir à répondre à des sujets intéressants et à des développeurs à l'écoute des conseils ;)
A bientôt.
Hugo.