Bonjour,

Dans mon include j'ai dans l'ordre :

routeur.php
conf.php
request.php
controller.php

Actuellement les routes sont dans le fichier conf.php mais je voudrais les sortir pour créer plusieurs fichiers routes selon la langue sélectionnée et en fonction de cette dernière inclure le bon fichier.

Auriez-vous une idée ?

12 réponses


Vallyan
Réponse acceptée

Ta session va commencer lorsque tu <u>instancies</u> ta classe contenue dans Controller.php (j'imagine que c'est la classe Controller). Je ne sais pas ou tu fais cette instanciation (peut-être en instanciant un autre controller qui herite de ce controller-la), mais je dirais que c'est plus loin dans le code, après la var_dump();

Ce que tu peux essayer de faire, c'est:

  • Instancie un objet Session (que tu appelleras $session, pour faire original) plus tôt dans le code (directement dans ton fichier Session.php, par exemple)

    // Session.php
    Class Session{ / ta classe / }
    $session = new Session();

  • Ensuite modifie ton Controller pour qu'il prenne $session en argument, et s'en serve pour hydrater son attribut Session:

    // Controller.php
    Class Controller{
    __construct( $session ){
    $this->Session = $session;
    }
    }

Par contre fait attention de bien modifier dans ton code tes instanciation de controller, pour lui filer $session en paramètre.

A tester, bien entendu ...

comment récupères-tu la locale?
Parce que une fois que tu connais la langue il s'agit juste de faire un switch pour inclure le bon fichier (avec un default en anglais).

Msappdem
Auteur

pour changer la langue je fais un lien de type : http://www.site.fr/language/en\_US
je stock la valeur en session.

donc je suis déjà au niveau du controller quand je récupère la locale.

Tu ne comptes pas passer la locale dans chaque url, mais plutôt cliquer sur un lien qui la défini une fois pour toute ? Donc tu veux la stocker en session ?

Dans ce cas fait un controller qui correspond a ta route http://www.site.fr/language/{lang} et qui change la valeur de $_SESSION'lang'] en fonction de ta variable {lang}.
Ensuite comme je suppose que ton session_start() est avant l'include de ton fichier de config, tu n'as qu'a vérifier $_SESSION'lang'] pour faire le bon include (oublie de d'avoir un truc par défaut)

Msappdem
Auteur

C'est bien cela, par défaut la langue 'fr_FR' est défini si elle n'existe pas en session ou si elle vaut 'fr_FR' et le visiteur à la possibilité de changer la langue de tous le site via ce lien.

Pour le changement et le stockage de la locale en session c'est bon et ça fonctionne bien avec mes tests.

Le session_start() est effectivement au dessus et c'est même le premier.

J'ai essayé de faire un var_dump de $_SESSION dans le fichier include pour vérifier mais j'ai une erreur comme si elle n'existait pas. Je dois pas m'y prendre correctement.

Tu peux nous donner l'erreur générée par le var_dump() ? la variabe $_SESSION existe forcément après que tu ais fait le session_start(), normalement ...

Msappdem
Auteur

je suis d'accord avec toi :

l'erreur : Notice: Undefined variable: _SESSION
c'est mince.

{main}( ) ..index.php:0
require( 'D:sitecoreincludes.php' ) ..index.php:36

Bon ... je suis navré d'insister, mais je pense vraiment que ton session_start() est placé après ton appel a $_SESSION ^^. Vérifie ton controller fontal, l'ordre des include, et a quel moment du mets ton var_dump() ...
En plus de ca vu que ton changement de variable dans le controller qui gère le changement de la langue ne retourne pas d'erreur, c'est bien que plus loin dans le script tu peux accéder a $_SESSION ...

Au pire si le code n'est pas trop long, copie-le ici si tu as un doute ...

Msappdem
Auteur

J'initialise la session dans le __construct de controller.php ($this->Session = new Session();)

la ou je place le dump je devrais voir quelque chose non ?

ma page includes.php :

require 'Session.php';
    require 'Form.php';
    require ROOT.DS.'config'.DS.'conf.php';
    require 'functions.php';
    require 'Router.php';

    /// ?????
    require ROOT.DS.'config'.DS.'routes_fr.php';

    require 'Request.php';
    require 'Controller.php';
    var_dump($_SESSION);
    require 'Model.php';
    require 'Dispatcher.php';
Msappdem
Auteur

J'ai fais quelques test, cela semble être une solution. Je n'aurais pas trouvé seul.

J'ai du modifier pas mal de choses du coup parce que je me suis rendu compte de beaucoup d'erreurs.

Un grand merci pour ton aide.

OK, tant mieux si ca marche.
Du coup je viens de voir que j'avais ajouté une ligne par erreur dans le code que je t'indiquais (il y avait un $session = new Session(); apres la déclaration de la classe Controller ... ca n'a rien a faire ici puisque tu instancies un objet Session précédemment, juste après la classe Session). Je ne sais pas si tu avait fais la modif toi-meme ... En tout cas j'ai édité mon poste pour le virer.

Bonne continuation !

Msappdem
Auteur

Oui je l'ai bêtement recopier au début mais en le tapant je m'en suis rendu compte.

Merci.