IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Utilisation de "component" et "slot" [1.x]


Sujet :

Symfony PHP

  1. #21
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Si tu veux une solution avec les widgets (Symfony 1.2), tu dois créer ton formulaire dans le dossier lib/form:
    LoginForm.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class LoginForm extends sfForm
    {
      public function configure()
      {
        $this->setWidgets(array(
          'email'    => new sfWidgetFormInput(),
          'password'   => new sfWidgetFormInput(),
        ));
      }
    }
    ?>
    plutot qu'un partial utilise un component dans ton layout, ca te permettra d'instancier ton formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php include_component('login','auth') ?>
    tu dois créer un fichier components.class.php dans ton module login.
    Tu vas y créer une instance de ton formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     
    class loginComponents extends sfComponents
    {
      public function executeAuth()
      {
    	$this->login_form = new LoginForm();
      }
    }
    ?>
    puis il ne reste plus qu'a modifier ton template _auth.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <table cellspacing="0" border="0">
    	<tr>
    		<td>
    		<div id="login" class="login" align="left">
    		<form method="POST" action="<?php echo url_for('login/index'); ?>">
    		  <table>
    		    <?php echo $login_form; ?>
    		    <tr>
    		      <td colspan="2">
    		        <input type="submit" value="ok"/>
    		      </td>
    		    </tr>
    		  </table>
    		</form>
    		</div>
    		</td>
    	</tr>
    </table>
    le tour est joué, c'est pas trés compliqué mais ca demande une gymnastique.

  2. #22
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    Merci à vous deux pour les solutions.

    J'ai essayé celle de bricecol mais je ne maitrise pas assez symfony pour pouvoir bien faire fonctionner ta solution.

    Du coup j'ai pris celle de batataw, plus simple et plus cohérente avec l'application développée.

    J'ai repris ton code, par contre il me manque un élément. Comment je traite le retour du submit de mon formulaire dans ton exemple le form est submité dans login index.

    Mais pour le traitement j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $this->form->bind($request->getParameter('login'))
     
    if ($this->form->isValid())
    {
    .....
    }
    l'inconvénient tu le vois de suite le $this->form n'a pas de valeur puisque le formulaire est crée dans le component!!

    Il me manque un élément c'est comment traiter les valeurs retournées par le form pour tester leur validité??

    Merci encore pour votre aide.

  3. #23
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    pour utiliser le code ci-dessous, il faut instancier ton formulaire Login puis le lier aux valeurs postés comme tu l'as fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $this->form = new LoginForm();
     
    $this->form->bind($request->getParameter('login'))
     
    if ($this->form->isValid())
    {
    .....
    }
    Tu dois aussi demander a Symfony de prefixer toutes les variables de ton formulaire avec la valeur login. Pour cela il faut modifier légerement la déclaration de ton formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class LoginForm extends sfForm
    {
      public function configure()
      {
        $this->setWidgets(array(
          'email'    => new sfWidgetFormInput(),
          'password'   => new sfWidgetFormInput(),
        ));
     
       $this->widgetSchema->setNameFormat('login[%s]');
     
      }
    }
    ?>
    $this->widgetSchema->setNameFormat('login[%s]'); préfixe toutes les variables.

  4. #24
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    Tu dois aussi demander a Symfony de prefixer toutes les variables de ton formulaire avec la valeur login. Pour cela il faut modifier légerement la déclaration de ton formulaire:
    Yep ça je l'ai fait!!!

    j'avais oublié de l'instancier mais je pensais que le fait de l'instancier dans le component, ça allait pas fonctionner... bref maintenant ca passe mieux.

    Je passe bien par mon action mais ca bloque au niveau du submit.

    Dans auth pour mon form le submit se fait dans login/index mais si la personne se trompe dans son login et mot de passe j'arrive à revenir sur mon formulaire et signaler les erreurs!!

  5. #25
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Je ne suis pas sur de bien saisir ta question, il faut que tu mettes en place le message d'erreur et la redirection. Tu peux utiliser les flashs.


    Dans ton action tu ajoutes le message flash, tu peux rediriger l'utilisateur sur n'importe quelle page.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
      	$this->form = new LoginForm();
     
      	$this->form->bind($request->getParameter('login'));
        if($this->form->isValid()){
        	if(User::checkUser(...)){
        		...
                    $this->forward('login','index');
        	}
        	else{
        		$this->getUser()->setFlash('login_alert', "Login incorrect");
                    $this->forward('login','index');
     
        	}
        }
     
         $this->forward('login','index');
    Dans ton _auth.php tu ajoutes ton message flash.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <?php if ($sf_user->hasFlash('login_alert')): ?>
      <?php echo $sf_user->getFlash('login_alert') ?>
    <?php endif; ?>
     
    <table cellspacing="0" border="0">
    	<tr>
    		<td>
    		<div id="login" class="login" align="left">
    		<form method="POST" action="<?php echo url_for('login/index'); ?>">
    		  <table>
    		    <?php echo $login_form; ?>
    		    <tr>
    		      <td colspan="2">
    		        <input type="submit" value="ok"/>
    		      </td>
    		    </tr>
    		  </table>
    		</form>
    		</div>
    		</td>
    	</tr>
    </table>

    Attention le mot de passe ne doit pas etre en claire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
    class LoginForm extends sfForm
    {
      public function configure()
      {
        $this->setWidgets(array(
          'email'    => new sfWidgetFormInput(),
          'password'   => new sfWidgetFormInputPassword(),
        ));
     
    	$this->widgetSchema->setNameFormat('login[%s]');
     
      }
    }
    ?>

  6. #26
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    pas mieux!!!

    En faite si je submit je vais sur la page action de mon module login mais je ne passe pas le isValid comme si mon formulaire n'était jamais valide. Que je renseigne ou pas les champs j'ai le même comportement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
        public function executeIndex(sfWebRequest $request)
        {
            $this->form = new LoginForm();
     
            if ($request->isMethod('post'))
            {
                $this->form->bind($request->getParameter('login'));
     
                if ($this->form->isValid())
                {
     
    echo "Je n'arrive pas jusqu'a ici ";
     
                    $login = $this->form->getValues();
                    if (User::checkUser($login))
                    {
                        //enregistrement du User dans la session
     
                    }
                    else
                    {
                        $this->getUser()->setFlash('login_alert',"Login incorrect");                    
                    }
                    $this->forward('news','index');
                }
            }
        }
    }
    La c'est mon login form avec le validator.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
     
    class LoginForm extends BaseLoginForm
    {
      public function configure()
      {
          $this->setWidgets(array(
            	'email'      => new sfWidgetFormInput(array(),array('class'=>'login')),
            	'motdepasse' => new sfWidgetFormInputPassword(array(),array('class'=>'login')),
     
            ));
     
            $this->widgetSchema->setNameFormat('login[%s]');
     
            $this->setValidators(array(
            		'email'    => new sfValidatorEmail(array(), array(
            		'required' => 'Veuillez entrer une adresse de courriel',
                    )),
            		'motdepasse'   => new sfValidatorString(array(),array(
                    'required'=> 'Veuillez saisir votre mot de passe'
                    )),
            ));
     
            //redéfinition des labels 
            $this->widgetSchema->setLabels(array(
            	'email'      => 'Courriel',
            	'motdepasse' => 'Mot de passe',
            ));
     
      }
    }
    Par contre j'ai pas de messages d'erreur sur mon formulaire suite à une mauvaise validation.
    Mon auth avec les messages flash que je ne vois pas non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    <?php if ($sf_user->hasFlash('login_alert')): ?>
      <?php echo $sf_user->getFlash('login_alert') ?>
    <?php endif; ?>
     
    	<form method="POST" action="<?php echo url_for('login/index'); ?>">
     
    <?php		    
    			echo '<table style="text-align:left;">';
     
    if ($form->hasGlobalErrors()):
    echo '  <tr>
        <td colspan="2">
          <ul class="error_list">';
    foreach ($form->getGlobalErrors() as $name => $error):
    echo '<li>'. $name.': '.$error.' </li>';
    endforeach;
    echo '</ul>
        </td>
      </tr>';
    endif;
     
    echo '<tr>
    		<td style="text-align:left;" colspan="2">
    		aa
            	'.$form['email']->renderError().'
            	'.$form['motdepasse']->renderError().'
            </td>
    </tr>
    <tr>
            <td>
            	'.$form['email']->renderLabel().'
            </td>
    </tr><tr>
            <td>
            	'.$form['email'].'
            </td>        
        </tr>
        <tr>
            <td>
            	'.$form['motdepasse']->renderLabel().'
            </td>
    </tr><tr>
            <td>
            	'.$form['motdepasse'].'
            	<input type="submit" value="OK" />
          </td>
        </tr>
      </table>';
     
    echo $form->renderHiddenFields();
     
    echo '</form>';
     
    ?>

    Merci pour le temps que tu passes à m'aider!!

  7. #27
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Tout ca m'a l'air correct. Si isvalid() est toujours faux c'est que les données que tu rentres dans ton formulaires ne sont pas valides. Tu as ajouté des regles de validation a ton formulaire login. Il faut que tu "bind" tes données postés dans ton component.

    components.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
     
    class loginComponents extends sfComponents
    {
      public function executeAuth(sfWebRequest $request)
      {
    	$this->form = new LoginForm();
    	$this->form->bind($request->getParameter('login'));
      }
    }
    ?>

  8. #28
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    ouhhh!!!

    Oui grave oubli de ma part le bind que je faisais était sur le form instancié dans action!!!!

    Par contre pour récupérer les valeurs je peux pas faire de $this->form->getValues dans mon action???!!!! Donc j'aurai jamais isValid de bon!

    Pour récupérer mes paramètres j'utilise $request->getPostParameters().

    Un autre petit truc gênant c'est que dès que j'accède au site j'ai les messages d'erreur comme quoi le login et le mot de passe ne sont pas valide alors que je n'ai pas cliquer sur submit et que j'ai rien saisie :-(

  9. #29
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Oui grave oubli de ma part le bind que je faisais était sur le form instancié dans action!!!!
    Tu peux l'utiliser ou tu veux, des que tu as besoin des infos postées.

    Par contre pour récupérer les valeurs je peux pas faire de $this->form->getValues dans mon action???!!!! Donc j'aurai jamais isValid de bon!
    la methode $this->form->getValues s'utilise apres isValid pas avant, donc tu peux l'utiliser a condition que les données soient valident.

    Un autre petit truc gênant c'est que dès que j'accède au site j'ai les messages d'erreur comme quoi le login et le mot de passe ne sont pas valide alors que je n'ai pas cliquer sur submit et que j'ai rien saisie :-(
    C'est normal tu as mis dans ton validator que ces champs étaient obligatoires et tu fais un bind dans ton component. Tu pourrais par example faire un bind que sur un post.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
     
    class loginComponents extends sfComponents
    {
      public function executeAuth(sfWebRequest $request)
      {
    	$this->form = new LoginForm();
    	if ($request->isMethod('post')){
    		$this->form->bind($request->getParameter('login'));
    	}
      }
    }
    ?>

  10. #30
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    ok ca fonctionne nickel!!!

    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Shell][sed]utilisation d'un sed pour gérer des doubles quotes
    Par bstevy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 06/03/2015, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo