2011-10-18 14 views
24

si muestro un campo de tipo "entidad" en mi formulario, y quiero filtrar este tipo de entidad en función de un argumento que paso desde el controlador, ¿cómo hago eso ...?pasando los datos del controlador a Tipo symfony2

//PlumeOptionsType.php 
public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('framePlume', 'entity', array(
     'class' => 'DessinPlumeBundle:PhysicalPlume', 
     'query_builder' => function(EntityRepository $er) { 
           return $er->createQueryBuilder('pp') 
            ->where("pp.profile = :profile") 
            ->orderBy('pp.index', 'ASC') 
            ->setParameter('profile', ????) 
           ; 
          }, 

    )); 
} 

public function getName() 
{ 
    return 'plumeOptions'; 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
      'data_class'  => 'Dessin\PlumeBundle\Entity\PlumeOptions', 
      'csrf_protection' => true, 
      'csrf_field_name' => '_token', 
      // a unique key to help generate the secret token 
      'intention'  => 'plumeOptions_item', 
    ); 
} 
} 

y dentro del controlador, creo el formulario:

i have that argument that i need to pass in my action code: 
$profile_id = $this->getRequest()->getSession()->get('profile_id'); 
... 
and then i create my form like this 
$form = $this->createForm(new PlumeOptionsType(), $plumeOptions); 

los $ plumeOptions es sólo una clase de persistir. Pero tiene una relación de uno a uno con otra clase llamada PhysicalPlume. Ahora, cuando quiero mostrar el 'framePlume' en mi código, quiero mostrar una entidad filtrada PhysicalPlume.

+0

respondió ya ... check http://stackoverflow.com/questions/6716776/symfony-2-how-to-pass-data-to-for mbuilder – xeon

Respuesta

38

Puede pasar parámetros a la clase de forma de la siguiente manera:

//PlumeOptionsType.php 
protected $profile; 

public function __construct (Profile $profile) 
{ 
    $this->profile = $profile; 
} 

A continuación, utilizarlo en el query_builder de su buildForm:

$profile = $this->profile; 

$builder->add('framePlume', 'entity', array(
    'class' => 'DessinPlumeBundle:PhysicalPlume', 
    'query_builder' => function(EntityRepository $er) use ($profile) { 
          return $er->createQueryBuilder('pp') 
           ->where("pp.profile = :profile") 
           ->orderBy('pp.index', 'ASC') 
           ->setParameter('profile', $profile) 
          ; 
         }, 

)); 

Y, finalmente, en su controlador:

// fetch $profile from DB 
$form = $this->createForm(new PlumeOptionsType($profile), $plumeOptions); 
+0

Gracias por responder, creo que tienes exactamente lo que quiero decir ... Aún así, recibí un error al hacer exactamente lo que sugeriste. El uso de este $ cuando no esté en contexto objeto en PlumeBundle \ Form \ Type \ PlumeOptionsType.php – xeon

+0

http://pastebin.com/RVLFCxL4 http://pastebin.com/778ygFgR – xeon

+0

http://pastebin.com/RVLFCxL4 http://pastebin.com/778ygFgR http://pastebin.com/q81k8w9A Creo que mi problema está relacionado con la función de devolución de llamada. Puedo leer el perfil desde PlumeOptionsType, pero no desde 'query_builder' => function (EntityRepository $ er) – xeon

4

Puede usar $plumeOptions para pasar todo su argumento, pero deberá agregar un getDefaultOptions() en PlumeOptionsType para especificar el valor predeterminado para su opción. Ver por ejemplo https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php para ver cómo debería ser este método.

+1

¿Puedes elaborar más ...? puede ser más específico? – xeon

+0

He editado mi mensaje para agregar más precisiones sobre el método 'getDefaultOptions()' – greg0ire

+0

Ok, digamos que agregué un perfil_id predeterminado en la matriz devuelta de getDefaultOptions() de PlumeOptionsType. y yo usé -> setParameter ('profile', $ options ['profile_id']) ... pero ¿cómo pasar profile_id a $ plumeOptions en primer lugar? ¡Gracias por tu ayuda! – xeon

Cuestiones relacionadas