Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/01/2011, 21h47   #1
Membre habitué
 
Inscription : juillet 2006
Messages : 664
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 664
Points : 132
Points : 132
Par défaut Undefined variable: sf_user

Bonjour a tous,

Je m'essaie au tutoriel de la ferme du web concernant Symfony. Concernant l'usage des sessions, je m'y prends de la façon suivante :

Je crée un module quizz via symfony.

Code :
symfony generate:module frontend quizz
J'ai donc une action Index et un template indexSuccess.php.

Dans mon action executeIndex, je fais :

Code :
$this->getUser()->setAttribute("email", "toto@exemple.com");
et lorsque dans mon template indexSuccess.php, je fais

Code :
echo $sf_user->getAttribute('email') ;
J'ai constamment ce message d'erreur :

Code :
Undefined variable: sf_user
Quelqu'un peut-il m'expliquer ce que je fais mal !?!?

Merci
__________________
Le seul, le vrai Facebook killer
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 00h02   #2
Invité régulier
 
Alexis
Inscription : septembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Alexis
Âge : 22
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : septembre 2010
Messages : 5
Points : 6
Points : 6
Tu as dans ton frontend dans le dossier lib le fichier "myUser.class.php" qui étend "sfBasicSecurityUser" ?
Alexoos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 10h51   #3
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
La variable $sf_user n'existe plus dans le template. Elle a été supprimé lors du passage de la 1.0 à la 1.1 dans mes souvenir.

Le message est donc correcte.

L'idéal est de transmettre directement ta donnée à ton template, le stockage dans l'objet user n'a pas d'intérêt pour cette action.

Dans executeIndex
Code :
$this->email = 'toto@exemple.com'
Et tu la récupère dans le template parCe qui n’empêche pas d'utiliser l'objet user pour un stockage entre les lancements de l'application.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 11h33   #4
Membre habitué
 
Inscription : juillet 2006
Messages : 664
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 664
Points : 132
Points : 132
Ok, merci bien pour vos réponses.

Alexoos : Oui, j'ai bien "myUser.class.php" qui étend "sfBasicSecurityUser" dans lib.

Michel : J'aimerai bien transmettre une donnée en session en fait. Du coup, comment dois-je m'y prendre ?

J'imagine que je dois utiliser l'objet myUser (car il faut bien que la donnée puisse transiter entre les modules).
Dans le site que je développe, j'ai développé un mécanisme d'authentification et je dois garder le login en session et le détruire à la déconnexion.

Comment donc créer la variable de session à la connexion (dans mon action et le récupérer dans mon template j'imagine) et également comment le détruire ??
__________________
Le seul, le vrai Facebook killer
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 11h52   #5
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
A noter que ton objet myUser peut étendre d'autres objet, notamment si tu utilises sfGuard, il faut que le parent soit sfUser et idéalement, sfBasicSecurityUser si tu veux gérer de l’authentification et de la sécurité.

Pour récupérer les données dans ton template, l'idéal est de les préparer dans le comtrôleur si tu veux garder une indépendance des couches conforme au MVC. En effet, il est possible que dans une évolution future de ton application ces données ne proviennent plus ou plus uniquement de ton objet sfUser.

L'idée serait donc de créer un tableau en charge des données a transmettre au template, donnée qui seront chargées dans le contrôleur et lue dans le template.

Dans ton contrôleur (executeIndex)
Code :
1
2
3
4
5
 
$user = $this->getUser();
$this->parametres['email'] = $user->getEmail();
$this->parameters['name'] = $user->getName();
...
Et dans ton template
Code :
1
2
3
 
<?php echo $parameters['email'] ?>
<?php echo $parameters['name'] ?>
Si tu veux réellement avoir un accès à l'objet myUser depuis le template tu peux, dans ton contrôleur
Code :
$this->user = $this->getUser();
et dans ton template
Code :
<?php echo $user->getName() ?>
Et si tu veux tous faire dans le template (ce que je ne saurais recommander)
Code :
1
2
3
 
<?php $user = sfContext::getInstence->getUser() ?>
<?php $user->getName() ?>
devrait marcher.

Je pense que la première solution est la meilleur au niveau de l'indépendance des couches et garanti qu'il ne faudra pas modifier le template si les données changent d'origine dans le développement.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 12h13   #6
Membre habitué
 
Inscription : juillet 2006
Messages : 664
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 664
Points : 132
Points : 132
Bon, j'ai probablement du rater une étape.
Voici le message que j'ai, avec la première des méthodes données :

Code :
Notice: Undefined variable: parameters
La 2ème méthode me donne ceci::

Code :
1
2
3
Notice: Undefined variable: user in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php  on line 1
 
Fatal error: Call to a member function getName() on a non-object in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php on line 1
Dois-je faire qq chose avec mon objet myUser ? Il me semble qu'il me manque quelque chose
__________________
Le seul, le vrai Facebook killer
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 12h43   #7
Invité régulier
 
Alexis
Inscription : septembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Alexis
Âge : 22
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : septembre 2010
Messages : 5
Points : 6
Points : 6
Citation:
Envoyé par Michel Rotta Voir le message
La variable $sf_user n'existe plus dans le template. Elle a été supprimé lors du passage de la 1.0 à la 1.1 dans mes souvenir.
Ah ? :/
Pourtant, j'utilise la version 1.4, et je peux utiliser la variable sf_user.
Donc je ne comprends pas pourquoi, il instancie toujours ma variable.

Sinon identifiant_bidon, moi j'allais te conseiller, de faire une méthode login dans myUser :
Code :
1
2
3
4
5
6
7
 
// Déclarer la session de l'utilisateur
$this->setAuthenticated(true);
 
// On stocke maintenant les informations de l'utilisateur connecté
// dans une session
$this->setAttribute('login', $personne->getLogin());
Pour ma part, dans mes applications de connexion j'appelle la méthode login une fois que le formulaire est validé dans le processForm.
Je peux ainsi savoir si l'utilisateur est connecté grâce à :
Code :
1
2
3
4
 
<?php if ($sf_user->isAuthenticated()): ?>
// récupérer un attribut de session 
<?php echo $sf_user->getAttribute('login') ?>
Etant débutant en développant sur symfony je me trompe peut-être.
Alexoos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 12h50   #8
Membre habitué
 
Inscription : juillet 2006
Messages : 664
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 664
Points : 132
Points : 132
Merci Alexoos

Je crois avoir cerné mon problème. En fait, le hic est pour faire transiter ma variable de session entre les modules.

Dans l'action de mon module de login, j'appelle une méthode dans laquelle j'ai cette ligne :

Code :
$this->getUser()->setName();
Dans la classe MyUSer, j'ai ceci :
Code :
1
2
3
4
 
	public function setName() {
		$this->setAttribute('name', "test");		
	}
Dans un fichier template d'un autre module, je fais ceci :

Code :
<?php echo $sf_user->getAttribute('name') ?>
et j'ai bien ma valeur. Cependant, ce n'est pas le cas dans tous les modules :

dans un autre module, j'ai ceci :

Code :
1
2
3
Notice: Undefined variable: sf_user in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php  on line 1
 
Fatal error: Call to a member function getAttribute() on a non-object in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php on line 1
encore et toujours ...
__________________
Le seul, le vrai Facebook killer
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 22h44   #9
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Effectivement les variables sf_context, sf_request, sf_params, request, sf_response, sf_user sont toujours instanciées. Simplement elle ne sont plus documentée.

Par contre, je maintiens que récupérer ces informations dans le template est une mauvaise idée.

Désolé pour le parameters, il faut initialiser le tableau avant, je le pensais évident. Donc, avant le code de la première solution, il faut rajouter
Code :
$this->parameters = array();
La méthode getName() de l'objet user n'existe pas, de base, c'est juste un exemple de nom.

Si tu mets en place une méthode setName sur ton objet user (elle est bonne ta méthode). Mets aussi une méthode
Code :
1
2
3
4
5
 
public function getName()
{
    return $this->getAttribute('Name', "N'a pas de nom");
}
Ceci n'est qu'un exemple.


Dans le cas de disparition mystérieuse de valeur sur l'objet user, utilise la barre de débug de symfony, tu peux y consulter l'ensemble des données stockée dans le container de l'objet user.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h42.


 
 
 
 
Partenaires

Hébergement Web