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/04/2011, 11h52   #1
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
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 :
1
2
3
4
5
 // actions.class.php
public function executeSendEmail(sfWebRequest $request) {
      $formateur = $this->getRoute()->getObject();
      $this->form = new EmailForm($formateur);
  }
Code :
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 :
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>
Citation:
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 !
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h46   #2
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
J'ai contourné le problème en faisant ceci dans l'action:

Code :
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 ?
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 18h43   #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
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.
__________________
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 07/04/2011, 13h09   #4
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Non le token n'était pas généré, pour j'ai bien utilisé la méthode renderHiddenFields()...
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 13h30   #5
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
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.
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h21   #6
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
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 ???
__________________
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 07/04/2011, 15h01   #7
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Quel message ? Le seul message que j'ai eu, c'est l'erreur 500 et la description de la pile...

Ceci dit, je suis quasiment parvenu à faire ce que je voulais en utilisant le user et les attributs. Ca fonctionne bien.

Le seul hic qui me reste, c'est que en cas de non remplissage des champs obligatoires, je n'ai pas comme d'habitude l'affichage des messages d'erreurs. Mon formulaire disparait mais n'est évidemment pas validé (la barre de debogage de symfony m'indique bien que ces champs sont requis). Je m'attendais à ce que le formulaire reste affiché en l'état avec les messages d'erreurs adéquats. Aurais-je manqué quelque chose ?

Je remets les sources pour y voir plus clair :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class EmailForm extends sfForm {
 
    public function configure()
    {
        $this->setWidgets(array(
            'body'    => new sfWidgetFormTextarea(array('label'=>'Message')),
            'subject' => new sfWidgetFormInput(array('label'=>'Objet'))
        ));
 
        $this->widgetSchema->setNameFormat('email[%s]');
 
        $this->setValidators(array(
            'body'    => new sfValidatorString( array('required' => true)),
            'subject' => new sfValidatorString( array('required' => true))
        ));
    }
 
}
Code :
1
2
3
4
5
6
7
8
<form id="email-form" action="<?php echo url_for('emailCreate') ?>" method="post" >
    <?php echo $form->renderHiddenFields() ?>
    <p><?php echo $form['subject']->renderLabel() ?><?php echo $form['subject']->renderError() ?></p>
    <p><?php echo $form['subject']->render() ?></p>
    <p><?php echo $form['body']->renderLabel() ?><?php echo $form['body']->renderError() ?></p>
    <p><?php echo $form['body']->render() ?></p>
    <p><a href="#" id="submit"><img src="/images/mail-forward.png" alt="Envoyer" title="Envoyer" /></a>
</form>
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
27
28
29
public function executeEmailCreate(sfWebRequest $request)
  {
      if ($request->isMethod('post'))
      {
          $this->form = new EmailForm();
          $this->form->bind( $request->getParameter('email'));
          if ( $this->form->isValid() )
          {
              $dest = $this->getUser()->getAttribute('to')->getEmail();
              $from = $this->getUser()->getGuardUser()->getEmailAddress();
              $subject = $this->form->getValue('subject');
              $body = $this->form->getValue('body');
              $message = $this->getMailer()->compose(
                      $from,
                      $dest,
                      $subject,
                      $body
                      );
 
              if ( $this->getMailer()->send($message) )
                   $this->getUser()->setFlash('info','Le message a été correctement envoyé.');
              else
                   $this->getUser()->setFlash('erreur','Le message n\'a pas pu être envoyé.');
 
              $this->redirect($this->generateUrl('formateur_show_route',$this->getUser()->getAttribute('to')));
          }
 
      }
  }
Autre problème également :
- la barre de débogage de symfony m'indique que l'email a bien été envoyé (transport php mail() )
- mais la méthode send retourne 0
- et je n'ai jamais reçu l'email....
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 16h32   #8
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
Désolé, je traites trop de messages et fait parfois de la salade de réponses

Il y a un plugin qui pourrait t'aider pour ton cas et pour toute ton application par la même occasion : sfJqueryFormValidationPlugin. A défaut de ré afficher ton form, il va déporter la vérification en local.

Vérifie ta configuration. Par défaut, en mode dev tu es en
Code :
1
2
3
4
5
# factories.yml
dev:
  mailer:
    param:
      delivery_strategy: none
ce qui permet de tester mais pas d'avoir d'email.
__________________
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 07/04/2011, 16h39   #9
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Pour les factories, j'avais changé comme ça :

Code :
1
2
3
4
5
6
dev:
  mailer:
    param:
      delivery_strategy: realtime
      transport:
        class:        Swift_MailTransport
Je jette un oeil au plugin en question...
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 19h40   #10
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
Tu dois avoir un problème de configuration du serveur SMTP.

Vérifie les paramètres adresse nom et passe et teste les éventuellement dans un autre outil (de messagerie).
__________________
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 08/04/2011, 10h58   #11
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Oui c'était bien ça, j'ai mis un hôte smtp en paramètre et ça tourne bien.

Par contre, je n'ai toujours pas résolu mon problème d'affichage des erreurs en cas de formulaire incomplet. Même avec le plugin indiqué, installé correctement après plusieurs vérifications (en fait comme je ne vois pas de différence, je ne sais même pas s'il fonctionne).
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 11h42   #12
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
Il utilise la méthode validator de jquery, en fonction des validateurs définis dans le form, pour afficher les messages d'erreur directement à la saisie.

La différence est très visible, dés que tu sors d'un champs faux, tu dois voir apparaître le message d'erreur.

Vérifie avec firebug si tu as des messages d'erreur en javascript.
Vérifie avec firebug que tes javascript soient bien chargés.
__________________
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 08/04/2011, 13h49   #13
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Non, je n'ai aucun souci apparent :
- pas d'erreur javascript
- js bien chargés

Dans le log, je vois quand même cette ligne là :

30 Info sfFilterChain Executing filter "sfJqueryFormValidationFilter"
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 14h48   #14
Membre du Club
 
Homme
Inscription : novembre 2006
Messages : 146
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34

Informations forums :
Inscription : novembre 2006
Messages : 146
Points : 41
Points : 41
Bon ça y est mon problème est résolu. J'ai dû revoir un peu la façon de faire. Je redonne ici le code complet des parties concernées. Je n'utilise pas le plugin sfJqueryFormValidationPlugin.

En gros, le problème du non-affichage des erreurs de saisies venait du fait que je ne redirigeais pas vers le bon template ( la ligne du setTemplate dans l'action a été rajoutée ).
Mais lors du réaffichage de ce template, je perdais la référence à mon formateur. J'ai donc laissé tomber l'idée de l'id dans un hidden, et j'ai modifié la route emailCreate en sfDoctrineRoute pour pouvoir balader le formateur directement dans l'action du form.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# routing.yml
send_email:
  url:            /formateur/:id/email
  class:          sfDoctrineRoute
  options:        { model: Formateur, type: object }
  param:          { module: formateur, action: sendEmail }
  requirements:
    id:           \d+
    sf_method:    [get]
 
emailCreate:
  url:            /formateur/:id/sendmail
  class:          sfDoctrineRoute
  options:        { model: Formateur, type: object }
  param:
    module:       formateur
    action:       emailCreate
  requirements:
    id:                 \d+
    sf_method:    [POST]
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// actions.class.php
public function executeSendEmail(sfWebRequest $request)
  {
      $this->formateur = $this->getRoute()->getObject();
      $this->form = new EmailForm();
  }
 
  public function executeEmailCreate(sfWebRequest $request)
  {
      $this->formateur = $this->getRoute()->getObject();
 
      if ($request->isMethod('post'))
      {
          $this->form = new EmailForm();
          $this->form->bind( $request->getParameter('email'));
          if ( $this->form->isValid() )
          {
              $mailTo = $this->formateur->getEmail();
              $from = $this->getUser()->getGuardUser()->getEmailAddress();
              $subject = $this->form->getValue('subject');
              $body = $this->form->getValue('body');
              $message = $this->getMailer()->compose(
                      $from,
                      $mailTo,
                      $subject,
                      $body
                      );
 
              if ( $this->getMailer()->send($message) )
                   $this->getUser()->setFlash('info','Le message a été correctement envoyé.');
              else
                   $this->getUser()->setFlash('erreur','Le message n\'a pas pu être envoyé.');
 
              $this->redirect($this->generateUrl('formateur_show_route',$this->formateur));
          }
 
          $this->setTemplate('sendEmail');
 
      }
  }
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// sendEmailSuccess.php
<?php
    use_javascript('submitButton');
?>
 
<?php slot( 'page-title',  'Envoyer un message à '.$formateur->getPrenom()." ".$formateur->getNom()); ?>
 
<form id="email-form" action="<?php echo url_for('emailCreate',$formateur) ?>" method="post" >
    <?php echo $form->renderHiddenFields() ?>
    <p class="label"><?php echo $form['subject']->renderLabel() ?><?php echo $form['subject']->renderError() ?></p>
    <p><?php echo $form['subject']->render() ?></p>
    <p class="label"><?php echo $form['body']->renderLabel() ?><?php echo $form['body']->renderError() ?></p>
    <p><?php echo $form['body']->render() ?></p>
    <p><a href="#" id="submit"><img src="/images/mail-forward.png" alt="Envoyer" title="Envoyer" /></a>
</form>
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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'),array('size'=>'50'))
        ));
 
        $this->widgetSchema->setNameFormat('email[%s]');
 
        $this->setValidators(array(
            'body'    => new sfValidatorString( array('required' => true),
                                                array('required' => 'Veuillez écrire un message')),
            'subject' => new sfValidatorString( array('required' => true),
                                                array('required' => 'Veuillez indiquer l\'objet de votre message'))
        ));
    }
 
}
jekif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 15h36   #15
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
__________________
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é Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h08.


 
 
 
 
Partenaires

Hébergement Web