php createform - Symfony 2-comment transmettre des données à formBuilder?




options get (6)

J'utilise la liste de choix d'entité dans mon formulaire. Je veux utiliser seulement des entités spécifiques (dans l'exemple: seulement les groupes auxquels appartient l'utilisateur) Donc, dans le contrôleur, je reçois ces groupes, et essaye de les passer dans formBuider .

Manette:

/.../
$groups = $em->getRepository('VendorMyBundle:Group')->getUserGroups($user);
$form = $this->createForm(new Message($groups), $message);
/.../

alors, et maintenant? comment l'utiliser dans formBuilder? comment changer cette ligne pour utiliser le tableau passé de groupes?

->add('group','entity',array('class' => 'Vendor\MyBundle\Entity\Group', 'label'=>'Group:'))

ou de l'autre:

class MessageType
{
/.../
  public function buildForm(FormBuilder $builder, array $options)
  {
    $builder
      ->add('group','entity',
        array(
          'class' => 'Vendor\MyBundle\Entity\Group',
          'property' => 'name',
          'query_builder' => function ($repository) {
            $qb = $repository->createQueryBuilder('group');
            $qb->add('where', 'group.administrator = :user');
            $qb->setParameter('user', $user->getId());
            return $qb;
          },
          'label' => 'Group'
        )
      )
      // Continue adding fields
    ;
  }
/.../
}

alors comment puis-je obtenir l'objet $ user à utiliser dans le constructeur de formulaire? ($ utilisateur représente l'utilisateur actuellement connecté)


Answers

La solution des bactéries est vraiment bonne. Juste une note pour sauver la tête à un autre gars comme moi :)

Dans cette partie, puis-je souligner la partie use ($company) . Il était caché par le cadre et bien sûr rien ne fonctionne correctement sans elle.

$builder->add('ad', 'entity', array(
   'class' => 
      '\Your\Bundle\Entity\Ad',
   'query_builder' => 
      function(\Your\Bundle\Repository\AdRepository $er) use ($company) {
            return $er->getActiveAdsQueryBuilder($company);
      },
    )
);

Si vous souhaitez utiliser une requête personnalisée, vous devez définir l'option query_builder comme suit:

use Doctrine\ORM\EntityRepository;

...

$message = new Message();

$form = $this->createFormBuilder($message)
             ->add('group', 'entity', array(
                   'class' => 'Vendor\MyBundle\Entity\Group',
                   'label'=>'Group:',
                   'query_builder' => function(EntityRepository $er) {
                       return $er->createQueryBuilder('g')
                                 ->... // whatever you want to do
                       }
                    ))
             ->getForm();

Vous pouvez trouver plus d'informations sur le générateur de requêtes dans le manuel de Doctrine et sur les options pour l' entity dans le manuel de Symfony2 .


Le meilleur moyen (mon opinion) est de donner à votre entité entityManager et de sélectionner tout ce dont vous avez besoin. Mais n'oubliez pas de déclarer la clé vide dans setDefaults () sinon les données ne seront pas transmises à votre constructeur.

Quelque chose comme celui-ci

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $options['em']->getRepository(''); // select all you need
    $builder->add('title', 'text')
            ->add('content', 'textarea');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Main\BlogBundle\Entity\Post',
        'validation_groups' => array('post'),
        'required' => false,
        'em' => null // this var is for your entityManager
        ));
}

Appliquez EM comme option simple ...


La solution des bactéries N'EST PAS une bonne solution. Par exemple, si vous déclarez votre type en tant que service, il est impossible de passer un objet au constructeur.

Une solution parfaite est les options - il suffit de transmettre les données en tant qu'option au constructeur de formulaire.


Vous pouvez donner l'objet que vous voulez utiliser dans la méthode __construct ().

Par exemple :

$form = $this
    ->get('form.factory')
    ->create(new ApplyStepOneFormType($this->company, $this->ad), $applicant);

Dans votre type de formulaire:

function __construct(\Your\Bundle\Entity\Company $company, \DYB\ConnectBundle\Entity\Ad $ad) {
    $this->company = $company;
    $this->ad = $ad;
}

Et puis dans votre type de formulaire dans la méthode buildForm:

$company = $this->company;    
$builder->add('ad', 'entity', array(
    'class' => '\Your\Bundle\Entity\Ad',
    'query_builder' => function(\Your\Bundle\Repository\AdRepository $er) use ($company) {
        return $er->getActiveAdsQueryBuilder($company);
    },
));

Généralement, Zend_Mail lancera une exception si quelque chose ne va pas dans le processus d'envoi - mais cela dépend fortement du Zend_Mail_Transport_* utilisé.

Vous avez deux options ici:

  • Zend_Mail_Transport_Sendmail (le transport par défaut) s'appuie sur mail() . Si mail() renvoie false , Zend_Mail_Transport_Sendmail lève une Zend_Mail_Transport_Exception ( impossible d'envoyer du courrier ). La valeur de retour elle-même n'est pas très fiable. Voici ce que le manuel dit à propos de la valeur de retour:

    Retourne TRUE si le courrier a été accepté avec succès, FALSE sinon.

    Il est important de noter que le fait que le courrier a été accepté pour la livraison NE signifie PAS que le courrier atteindra effectivement la destination prévue.

  • Zend_Mail_Transport_Smtp envoie le courrier électronique en utilisant le protocole SMTP encapsulé dans Zend_Mail_Protocol_Smtp . Dans ce cas, vous obtiendrez une Zend_Mail_Protocol_Exception chaque fois que quelque chose viole le protocole SMTP (envoi de courrier sans donner l'adresse d'un expéditeur, par exemple) ou que le serveur STMP signale une erreur ou le délai de connexion.

    Donc, si aucune exception n'est émise lors d'une conversation avec le serveur STMP, vous pouvez être sûr que le serveur distant a au moins accepté votre courrier électronique.





php symfony formbuilder