2017-08-07 1 views
0

Ce dont j'ai besoin est simple, je peux le faire avec php, mais je veux utiliser FormBuilder. J'ai ceci:symfony3 comment définir les données d'entrée avec le résultat de la requête

$builder 
     ->add('number',NumberType::class, array(
      'label' => 'Number', 
      'attr' => array(
       'readonly' => "readonly" 
       ) 
      ) 
     ) 
     ->add('year',NumberType::class, array(
      'label' => 'Year', 
      'data' => date('Y'), 
      'attr' => array(
       'readonly' => "readonly" 
       ) 
      ) 
     ) 

Ce que je besoin est de rechercher la dernière number de ce year et d'ajouter la suivante. S'il n'y a pas de numéro pour cette année, cela montrera 1. Est-ce possible?

Merci à l'avance

+0

pensant que vous vouloir un [DataTransformer] (https://symfony.com/doc/current/form/data_transformers.html) Sinon, s'il vous plaît montrer la logique pour le résultat souhaité. Il est difficile de comprendre les termes «rechercher» et «ajouter le suivant». Je suppose que vous voulez dire "2017" le nombre recherché serait "7" et ajouter le prochain ("2018") serait "8" donc "8 + 7". – fyrye

+0

Bonjour, merci d'avoir pris le temps de commenter. Comme vous pouvez le voir «année» est toujours l'année réelle. donc si dans le tableau vous avez 2017-1,2017-2,2017-3 ({année} - {numéro}), je dois montrer 2017-4 à l'intérieur de ces entrées. Cela a du sens pour vous? –

Répondre

0

En supposant que vous avez déjà le résultat de votre requête, vous pouvez utiliser l'argument FormType::buildForm$options pour passer vos données personnalisées à la forme.

Vous devrez définir les options personnalisées dans la méthode configurOptions pour qu'elles soient acceptées. En utilisant setDefaults, les valeurs définies seront définies si l'option n'est pas fournie dans le tableau d'options.

class FormType extends \Symfony\Component\Form\AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      //... 
      ->add('number',NumberType::class, array(
       'label' => 'Number', 
       'data' => $options['number'], 
       'attr' => array(
        'readonly' => "readonly" 
        ) 
       ) 
      ) 
      ->add('year',NumberType::class, array(
       'label' => 'Year', 
       'data' => $options['year'], 
       'attr' => array(
        'readonly' => "readonly" 
        ) 
       ) 
      ); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'year' => date('Y'), 
      'number' => 1 
     ]); 
    } 

    //... 

} 

Ensuite, dans votre contrôleur d'exécuter votre requête et transmettre les données personnalisées aux options de générateur de formulaire.

public function formAction(Request $request) 
{ 
    $options = ['year' => date('Y')]; 
    /** 
    * query data 
    * @returns integer|null default: 1 
    */ 
    $options['number'] = $em->getRepository('app:Entity')->filterYearNumber($options['year']) ?: 1; 
    $form = $this->createForm(FormType::class, $data, $options); 
    $form->handleRequest($request); 
    if ($form->isSubmitted() && $form->isValid()) { 
     //... handle submission 
    } 

    return $this->render('form.html.twig', ['form' => $form->createView()]); 
} 
+0

c'est une bonne réponse, merci beaucoup. Mais est-ce possible d'ajouter la requête à l'intérieur de la classe FormType? Un autre problème que je vois est que je ne peux pas envoyer le numéro d'option ou l'année d'option. Je peux envoyer seulement les options sur cette liste: https://symfony.com/doc/current/reference/forms/types/form.html –

+0

Bien sûr, vous pouvez toujours créer votre formulaire en tant que service et injecter le gestionnaire d'entité ou l'entité référentiel dans votre classe et appelez-le directement. –

+0

Oui, vous pouvez, mais il n'est pas conseillé de maintenir la classe FormType pour toujours exiger l'EntityManager. Lorsque vous déclarez 'configureOptions' vous pouvez développer le formulaire pour accepter n'importe quelle valeur. Par exemple, en utilisant le même objet FormType pour gérer les formulaires de création, de modification et de suppression ou les cas spéciaux de cas d'utilisation pour le modèle souhaité. Vous n'avez donc pas besoin de classes séparées pour chaque opération. De cette façon, le formulaire n'a que ce dont il a besoin pour être une forme et est plus facile à développer ailleurs. – fyrye