2011-10-18 17 views
24

Formumda "varlık" türünde bir alan gösterirsem ve bu varlık türünü denetleyiciden aktardığım bir bağımsız değişkene göre filtrelemek istiyorsam, bunu nasıl yaparım? denetleyiciden veri symfony2'ye geçirme2

//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', 
    ); 
} 
} 

ve denetleyici içindeki

i formu oluşturmak:

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); 

$ plumeOptions sadece inat bir sınıftır. Ancak, PhysicalPlume adlı başka bir sınıfla bire bir ilişkisi var. Şimdi, 'framePlume' kodunu kodumda görüntülemek istediğimde, filtrelenmiş bir PhysicalPlume öğesi göstermek istiyorum.

+0

zaten yanıtladı ... http://stackoverflow.com/questions/6716776/symfony-2-how-to-pass-data-to-for adresini ziyaret edin mbuilder – xeon

cevap

38

şöyle Form sınıfına parametreleri geçirebilirsiniz: Sonra

//PlumeOptionsType.php 
protected $profile; 

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

senin buildForm ait query_builder kullanmak:

$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) 
          ; 
         }, 

)); 

Ve nihayet denetleyicisi:

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

thx, Ben tam olarak ne demek istediğimi düşünüyorum ... Yine de, tam olarak ne önerdiğini bir hata var. $ Kullanma bu değilken PlumeBundle \ Form \ Tipi nesne bağlamı yılında \ 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 Sorunumun geri arama işleviyle ilişkili olduğunu düşünüyorum. Ben profil içinden PlumeOptionsType okuyabilir, ama içeriden değil 'query_builder' => işlev (EntityRepository $ er) – xeon

4

Tüm değişkeninizi iletmek için $plumeOptions'u kullanabilirsiniz, ancak seçeneğinizin varsayılan değerini belirtmek için PlumeOptionsType'a getDefaultOptions() eklemeniz gerekir. Bu yöntemin nasıl görüneceğini görmek için örneğin https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php örneğine bakın.

+1

Daha fazla detay verebilir misiniz ..? daha spesifik olabilir misiniz? – xeon

+0

İletiimi "getDefaultOptions()" yöntemi – greg0ire

+0

üzerinde daha fazla kesinlik eklemek üzere düzenledim Tamam, PlumeOptionsType öğesinin getDefaultOptions() öğesinin döndürülen dizisine varsayılan bir profile_id eklediğimi varsayalım. ve -> setParameter ('profile', $ options ['profile_id']) ... kullandım ama profil_id'i $ plumeOptions'a ilk etapta nasıl geçireceğim? Yardımlarınız için teşekkür ederiz! – xeon

İlgili konular