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 06/07/2011, 16h37   #1
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Par défaut The component does not exist: "sfGuardAuth", "signin".

Bonjour à tous,
Je suis en train d'installer sfDoctrineGuardPlugin. Tout se passe bien jusqu'à ce que j'essaye d'appeler mon formulaire de login dans un composant.

J'obtiens cette erreur:
Code :
The component does not exist: "sfGuardAuth", "signin".
setting.yml
Code :
1
2
3
4
5
6
 
all:
  .settings:
    # Enable the database manager
    use_database:           true
    enabled_modules:        [default,sfGuardAuth]
template.php
Code :
1
2
3
4
5
 
<!-- LOGIN DEUX -->
<div id="login" class="bloc">
  <?php include_component('sfGuardAuth', 'signin') ?>
</div>
Dois-je déclarer moi même le composant ? Si oui, à partir de codes qui se trouvent dans le répertoire du plugin ?


Merci de votre aide


ps: les "symfony cc" n'ont rien changé à la situation...
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 17h00   #2
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Il n'y a en effet aucun composant dans sfGuardAuth. Si tu veux afficher le formulaire, il faut inclure le partial _signin_form.php. Voir le code de signinSuccess.php pour référence. Si tu veux invoquer un composant que tu as écrit, il faut ajouter la méthode et les templates requis dans actions/components.class.php.
Herode est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/07/2011, 17h26   #3
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
/fonce vérifier dans un plugin
... ... ... Ding !

Code :
<?php include_component('sfGuardAuth', 'signin_form') ?>
Si il était dans un partial il faudrait, au minimum, ré-instancier le formulaire dans chaque action appelant le partial !
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/07/2011, 17h42   #4
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Hello,

Parfait ca fonctionne bien Juste encore un détail...


Dans mon template j'ai un endroit où j'ai :

Code :
1
2
 
<?php include_component('sfGuardAuth', 'signin_form') ?>
et un peu plus loin :

Code :
1
2
 
<?php echo $sf_content ?>

Maintenant mon formulaire de login s'affiche à ces deux endroit ! De plus, les erreurs (bad login, et cie) s'affiche au niveau du "$sf_content" et non à l'endroit de mon composant !

Des idées ?


D'avance merci !

Et bonne soirée
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 17h56   #5
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Tu peux faire quelque chose comme
Code :
1
2
3
4
<?php if($sf_user->isAuthenticated()){
    include_component('sfGuardAuth', 'signin_form');
}
?>
Pour n'afficher le formulaire que si ton visiteur est déconnecté.

Par contre pour aller plus loin, à mon avis c'est la manière dont sont organisées tes pages (circuit de navigation), ainsi que la sécurité associée, qui doivent être réfléchis plus en avant.
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/07/2011, 21h18   #6
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Citation:
Envoyé par Maerlyn31 Voir le message
/fonce vérifier dans un plugin
... ... ... Ding !

Code :
<?php include_component('sfGuardAuth', 'signin_form') ?>
Si il était dans un partial il faudrait, au minimum, ré-instancier le formulaire dans chaque action appelant le partial !
Ha umpf... il y a un détail symfonique qui m'a échappé alors. Je ne vois rien de déclaré dans sfGuardAuth/actions/components.class.php. Comment se fait-il que l'appel à un composant fonctionne quand-même ?
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 07h18   #7
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Merci pour vos réponses.

@Maerlyn31 : ce n'est pas tout à fait ca, je me suis mal exprimé je pense. En fait, au même moment, il m'affiche le formulaire de login dans mon composant ET dans mon contenu. Y a t'il un moyen de lui dire que si il affiche le formulaire à l'aide du composant, il ne doit pas l'afficher dans le contenu (sf_content).

D'avance merci !

Bonne journée à tous.
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 09h09   #8
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
@Herode : sfGuardAuthComponents hérite de BasesfGuardAuthComponents, qui se trouve dans le répertoire lib juste a côté, et qui contient une méthode "executeSignin_form()"

@Khand : Je n'ai jamais testé d'implémentation de ce genre, donc un peu au pif ^^
Il doit y avoir, dans ton fichier settings.yml, deux paramètres que tu as défini lors de l'installation de DoctrineGuarduser :

Code :
1
2
        login_module:           sfGuardAuth
        login_action:           signin
A mon avis ces valeurs doivent être celles à modifier dans ton cas : tu peux tester de faire pointer vers tonModule/tonAction, avec par exemple une action qui ne fais qu'afficher un message "Attention, connectez vous en haut de page".

J'ai jamais testé ce genre de surcharge avec DoctrineGuard par contre, tiens moi au courant
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 07/07/2011, 09h37   #9
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Citation:
Envoyé par Maerlyn31 Voir le message
@Herode : sfGuardAuthComponents hérite de BasesfGuardAuthComponents, qui se trouve dans le répertoire lib juste a côté, et qui contient une méthode "executeSignin_form()"
+1. Ca m'apprendra à ne pas regarder le code en détail
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 11h15   #10
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Bonjour,

Alors, ca marche bien ! J'ai donc redirigé vers une page du genre "authentification requise".

Maintenant un nouveau problème apparait à l'horizon. Lorsque volontairement je rentre des mauvaises valeurs de login, le message d'erreur ("The username and/or password is invalid.") apparait dans mon contenu, et fait donc apparaitre avec lui le formulaire de login précédemment caché.

Il faut donc que mes messages d'erreur apparaissent dans mon "composant" et non dans le formulaire qui se trouve dans mon contenu.

Mhhh mais comment ? Dans mon setting.yml, je ne peux tout de même pas écrire quelque chose du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
...
  .actions:       
    login_COMPOSANT:           sfGuardAuth
    login_action:           signin

    secure_COMPOSANT:          sfGuardAuth
    secure_action:          secure
    
    error_404_module:       party
    error_404_action:       error404

Merci pour votre aide !

Khand
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h22   #11
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Bon on aura appris un truc au moins : utiliser le component de sfGuardAuth, c'est un coup à faire péter le WTFmeter dans le rouge

Je viens de regarder le plugin plus en détail, ce comportement est "normal" :
qu'il soit appelé par l'action ou par le component, dans tous les cas le formulaire est rendu par _signin_form.php. Or, l'action du formulaire est écrite comme suit :

Code :
url_for('@sf_guard_signin')
Ce qui fait que lorsqu'on envoie le formulaire, on est automatiquement envoyé vers l'action executeSignin, dans BasesfGuardAuthActions.


Dans tous les cas, je vois deux choses à faire pour avancer :

1°) Modifier le formulaire pour qu'il pointe vers la page courante plutôt que vers l'action "signin". Pour faire ça il te faut créer dans ton application un module sfGuardAuth, contenant un fichier templates/_signin_form.php qui viendra surcharger celui par défaut.

2°) Surcharger aussi l'action du component (de la même manière que pour le template, en créant dans ton module sfGuardAuth de ton appli le fichier actions/components.class.php) pour la rendre plus intelligente : à mon avis, le plus simple est de t'inspirer du code du fichier plugins/sfDoctrineGuard/modules/sfGuardAuth/lib/BasesfGuardAuthActions
qui contient l'action par défaut : il te faut dans ton component personalisé créer une méthode executeSignin qui contient ce code, avec des redirections adaptées à ton circuit utilisateur.

Bon courage en tout cas ^^
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/07/2011, 13h32   #12
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Salut,

Je n'ose même pas t'avouer que j'aimerais par la suite faire fonctionner ca sous AJAX JOIE !

Bon je vais un peu tester ca, mais bon ... j'avoue avoir un peu de mal à trouver une bonne documentation pour ce plugin ! (Mise à part le readme).

Question de débutant : quelle est la meilleure pratique pour la surcharge d'un plugin ? A l'intérieur ou a l'extérieur de ce dernier ? (Si à l'extérieur, quel dossier ? )

Encore merci pour l'aide !

Khand !
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h18   #13
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Normal

Pour l'Ajax ce n'est pas le plus dur, deux ou trois ligne de code dans ton action pour corriger ce que tu renvoie suffiront, le reste c'est du javascript. Pour ma part j'utilise depuis peu jQuery Form Plugin il tourne super bien (associe un formulaire à un comportement AJAX).

Pourla surcharge, facile aussi il n'y a qu'une seule bonne manière de faire avec Symfony, c'est de surcharger à l'extérieur du plugin. On ne dois jamais toucher au code d'un plugin ou au conde dans lib/vendor. C'est à dire que tu dois avoir l'archi suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
- plugins /
            - modules /
                          - sfGuardAuth /
                                              - actions /
                                              - templates /
- ...
- ...
- apps /
          - tonAppli /
                        - modules /
                                       - sfGuardAuth /
                                                          - actions /
                                                          - templates /
Tu crées dans ton appli un module de même nom que celui du plugin, et Symfony y cherchera automatiquement les fichiers requis avant de les chercher dans plugins/.
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/07/2011, 15h04   #14
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Salut,

Pour la surcharge : C'est bien ce qu'il me semblait Je vais donc tester de cette manière.

Pour l'ajax : tu utilises ton formulaire de login dans un composant aussi alors ? De quelle manière et où l'intègre-tu ? Dans un module/action dédié


Toute bonne journée et merci.
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h51   #15
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Je n'ai jamais fait ce genre de manip, par contre ça m'interessait pour un autre projet avec un slider jQuery, en fait le component est pas si dur à écrire :p

Dans apps/tonAppli/modules/sfGuardAuth/actions/components.class.php

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  public function executeSignin($request)
  {
    // Le début pas besoin de toucher
    $user = $this->getUser();
    // Ici une modif : tu vire la redirection, et tu n'exécute les traitements que si l'utilisateur n'est PAS enregistré
    if (!$user->isAuthenticated())
    {
      // Instanciation du formulaire, jusque là c'est toujours le même code que dans le component de base
      $class = sfConfig::get('app_sf_guard_plugin_signin_form', 'sfGuardFormSignin'); 
      $this->form = new $class();
 
      // Ici il faut modifier la condition : tu ne veux pas effectuer le traitement à chaque fois qu'une requête post est envoyée vers ton site !
      if ($request->isMethod('post') && $request->hasParameter('signin'))
      {
        $this->form->bind($request->getParameter('signin'));
        if ($this->form->isValid())
        {
          $values = $this->form->getValues(); 
          $this->getUser()->signin($values['user'], array_key_exists('remember', $values) ? $values['remember'] : false);
 
          // Ici on vire tout simplement la redirection
        }
      }
      // Ici pareil, pas besoin de ces traitements de redirection, on va gérer la vue dans le template
    }
  }
et dans apps/tonAppli/modules/sfGuardAuth/templates/_signin_form.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php use_helper('I18N') ?>
<div id="signin_block">
<?php  
// On n'affiche le formulaire que si la personne n'est PAS connectée
// De plus, le traitement est dans un component, donc utilisé sur toutes les pages, donc même pas besoin d'attribut "action" sur le formulaire !
if(!$sf_user->isAuthenticated) { ?>
  <form action="" method="post" id="ajaxSigninForm">
    <table>
   ... Même chose que dans le partial d'origine ...
    </table>
  </form>
<?php
}
else
{
  echo 'Connecté en tant que '.$sf_user;
}
?>
</div>
Pour l'AJAX, en utilisant le plugin jQuery que je t'ai montré tout à l'heure, il suffit d'inclure un petit script du genre :

Code :
1
2
3
$('#popup-form').ajaxForm({
                 target: '#signin_block'
});
Bon c'est vraiment pas terrible : toute la page est recalculée lors d'un appel AJAX au lieu de n'effectuer que la connexion et de ne recharger que le bloc de login. Mais par contre tu as la dégradation lorsque le javascript est désactivé ...
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/07/2011, 16h10   #16
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Salut,

Impeccable, je vais tester tout ça en rentrant ce soir !

Merci merci, je te tiens au courant lors que j'ai réussi à intégrer cette solution

Bonne fin d'après midi/soirée.

khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 10h50   #17
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Salut !

Grrr je bloque sur une erreur (encore) :

Code :
1
2
 
The component does not exist: "sfGuardAuth", "signin_form".
La classe que je redéfinis (/appli/module/sfGuardAuth/action/components.class.php), elle doit hériter de BasesfGuardAuthComponents ou de sfComponents ? Ensuite je dois bien avoir la méthode : "executeSignin_form()" à l'intérieur !!?

Ceci donc :

Code :
1
2
3
4
5
6
7
8
 
class components extends BasesfGuardAuthComponents{
 
   public function executeSignin_form() {
        ...
    }
 
}
note : (app/fontend/module/sfGuardAuth/templates/_signin_form.php a bien été créé)

On est définitivement pas ami avec sfGuard en ce moment

Merci d'avance
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 14h36   #18
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Partial et nom de méthode sont OK, par contre je pense que ce doit être

Code :
class sfGuardAuthComponents extends BasesfGuardAuthComponents
Courage, on touche au but c'est pas le moment de flancher !
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/07/2011, 15h50   #19
Membre régulier
 
Avatar de khand
 
Homme Jody Lognoul
Développeur Web
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Jody Lognoul
Âge : 27
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 90
Points : 90
Envoyer un message via Skype™ à khand
Salut,

Alors on avance bien ! Ca fonctionne lorsque le couple login/password est valide. Mais par contre, quand le couple n'est pas juste, l'erreur "bad login..." s'affiche non pas au niveau du composant, mais au niveau du $sf_content (dans template)


Mhhhh ... des idées ?


Merchi !
khand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 16h41   #20
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Humm ...

Avec Firebug ou autre, peux-tu avoir la requête qui est exécutée lors d'une soumission du formulaire (page demandée + paramètres) ?
Puis avec la debug toolbar, quelques détails sur le retour (surtout "config/reponse" et "view") ?

On s'égare un peu là j'ai l'impression, tout ça pour en revenir au comportement de hier matin c'est blasant
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h33.


 
 
 
 
Partenaires

Hébergement Web