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 :

Comment transmettre une instance de DoctrineRecord à un simple sfForm [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut Comment transmettre une instance de DoctrineRecord à un simple sfForm
    Bonjour,

    Voici un nouveau problème. Dans ma petite application, lorsqu'on visualise une fiche d'un formateur (qui est un DoctrineRecord) on a la possibilité de lui envoyer un email.

    Pour ce faire je crée un simple formulaire sfForm (je ne crois pas qu'un sfFormDoctrine soit nécessaire ici, puisque l'email n'est pas un DoctrineRecord), auquel j'essaie de transmettre l'instance du formateur, pour disposer de son adresse email et la configurer pour le champ caché 'to'.

    Le problème, c'est que j'ai direct une erreur 500 qui m'indique que "_csrf_token" n'est pas une propriété de "Formateur". Or je ne vois pas ce que cela vient faire ici...

    Voici les codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // actions.class.php
    public function executeSendEmail(sfWebRequest $request) {
          $formateur = $this->getRoute()->getObject();
          $this->form = new EmailForm($formateur);
      }
    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
     // emailForm.class.php
    class EmailForm extends sfForm {
     
        public function configure()
        {
            $this->setWidgets(array(
                'body'    => new sfWidgetFormTextarea(array('label'=>'Message')),
                'subject' => new sfWidgetFormInput(array('label'=>'Objet')),
                'to'      => new sfWidgetFormInputHidden(),
                'from'    => new sfWidgetFormInputHidden()
            ));
     
            $this->setValidators(array(
                'body'    => new sfValidatorString( array('required' => true)),
                'subject' => new sfValidatorString( array('required' => true))
            ));
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     // sendEmailSuccess.php
    <form id="email-form">
        <?php echo $form->renderHiddenFields() ?>
        <p><?php echo $form['subject']->renderLabel() ?></p>
        <p><?php echo $form['subject']->render() ?></p>
        <p><?php echo $form['body']->renderLabel() ?></p>
        <p><?php echo $form['body']->render() ?></p>
    </form>
    500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
    Unknown record property / related component "_csrf_token" on "Formateur"
    stack trace

    * at ()
    in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Filter/Standard.php line 44 ...
    41. */
    42. public function filterSet(Doctrine_Record $record, $name, $value)
    43. {
    44. throw new Doctrine_Record_UnknownPropertyException(sprintf('Unknown record property / related component "%s" on "%s"', $name, get_class($record)));
    45. }
    46.
    47. /**
    * at Doctrine_Record_Filter_Standard->filterSet(object('Formateur'), '_csrf_token', '7547a2440a359370d7a3e2bbcb36a1a6')
    in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1504 ...
    1501. $success = false;
    1502. foreach ($this->_table->getFilters() as $filter) {
    1503. try {
    1504. $value = $filter->filterSet($this, $fieldName, $value);
    1505. $success = true;
    1506. } catch (Doctrine_Exception $e) {}
    1507. }
    * at Doctrine_Record->_set('_csrf_token', '7547a2440a359370d7a3e2bbcb36a1a6', 1)
    in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1456 ...
    1453. return $this->$mutator($value, $load, $fieldName);
    1454. }
    1455. }
    1456. return $this->_set($fieldName, $value, $load);
    1457. }
    1458.
    1459. protected function _set($fieldName, $value, $load = true)
    * at Doctrine_Record->set('_csrf_token', '7547a2440a359370d7a3e2bbcb36a1a6')
    in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Access.php line 133 ...
    130. if ( ! isset($offset)) {
    131. $this->add($value);
    132. } else {
    133. $this->set($offset, $value);
    134. }
    135. }
    136.
    * at Doctrine_Access->offsetSet('_csrf_token', '7547a2440a359370d7a3e2bbcb36a1a6')
    in SF_ROOT_DIR/lib/vendor/symfony/lib/form/sfForm.class.php line 784 ...
    781. */
    782. public function setDefault($name, $default)
    783. {
    784. $this->defaults[$name] = $default;
    785.
    786. $this->resetFormFields();
    787.
    * at sfForm->setDefault('_csrf_token', '7547a2440a359370d7a3e2bbcb36a1a6')
    in SF_ROOT_DIR/lib/vendor/symfony/lib/form/sfForm.class.php line 881 ...
    878.
    879. $this->validatorSchema[self::$CSRFFieldName] = new sfValidatorCSRFToken(array('token' => $token));
    880. $this->widgetSchema[self::$CSRFFieldName] = new sfWidgetFormInputHidden();
    881. $this->setDefault(self::$CSRFFieldName, $token);
    882.
    883. return $this;
    884. }
    * at sfForm->addCSRFProtection(null)
    in SF_ROOT_DIR/lib/vendor/symfony/lib/form/sfForm.class.php line 72 ...
    69. $this->setup();
    70. $this->configure();
    71.
    72. $this->addCSRFProtection($this->localCSRFSecret);
    73. $this->resetFormFields();
    74. }
    75.
    * at sfForm->__construct(object('Formateur'))
    in SF_ROOT_DIR/apps/frontend/modules/formateur/actions/actions.class.php line 85 ...
    82.
    83. public function executeSendEmail(sfWebRequest $request) {
    84. $formateur = $this->getRoute()->getObject();
    85. $this->form = new EmailForm($formateur);
    86. $this->form->addCSRFProtection('7547a2440a359370d7a3e2bbcb36a1a6');
    87. }
    88.
    * at formateurActions->executeSendEmail(object('sfWebRequest'))
    in SF_ROOT_DIR/lib/vendor/symfony/lib/action/sfActions.class.php line 60 ...
    Encore une fois merci d'avance pour votre aide !

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    J'ai contourné le problème en faisant ceci dans l'action:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function executeSendEmail(sfWebRequest $request) {
          $formateur = $this->getRoute()->getObject();
          $this->form = new EmailForm();
          $this->form->getWidget('to')->setDefault($formateur->getEmail());
      }
    Ça fonctionne, mais est-ce une bonne pratique ? Et l'idée de passer un paramètre au sfForm est-elle vraiment impossible ?

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le csrf token est une sécurité qui est automatiquement implémenté dans les form.

    Il génère un token dans le form en champ caché qui est vérifié au retour.

    Le plus courant pour ton erreur est que tu n'as pas généré les champs caché dans ton template.

    Il arrive aussi, mais plus rarement, que le validateur ait été supprimé et donc ne puisse pas vérifier un token qui revient.

    Vérifie dans le code html généré si le champ hiden du token csrf s'y trouve.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Non le token n'était pas généré, pour j'ai bien utilisé la méthode renderHiddenFields()...

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    En fait, je dis peut-être n'importe quoi parce que je n'ai jamais vu le formulaire s'afficher à ce moment. Je tombais sur l'erreur 500 décrite plus haut.

    Ceci dit, je vais plutôt passer par des variables de session pour retrouver mon info. Parce que là, si l'internaute visualise le code source html, il pourra voir les adresses email, ce que je ne veux pas.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Oui, il pourra. Ce qui n'est peut-être pas l'idéal !

    Reste le token...

    Par contre, si tu as une erreur 500 avant comment as-tu pu avoir le message après ???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment rendre une instance Excel unique
    Par sony351 dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/10/2006, 13h27
  2. Réponses: 5
    Dernier message: 17/07/2006, 18h34
  3. Réponses: 4
    Dernier message: 06/06/2006, 11h07
  4. comment demarrer une instance
    Par smarteam dans le forum Oracle
    Réponses: 3
    Dernier message: 22/03/2006, 17h03

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