2013-05-14 40 views
0

所以我无法从子窗体获取属性。这个情景是我做了一个选择'雇主'的工作表格。如果用户是应用程序管理员,他们可以选择所有雇主。如果用户是与多个雇主合作的工人,他们会在表单中选择雇主。否则(如果他们有一个单一的雇主),我想用雇主设置一个隐藏的领域。另外,雇主子表单应该自己处理这个问题。Symfony子窗体属性不包含在父项中

我的策略是在雇主子表单中设置一些属性,但是当我将这些属性添加到工作表单时,他们没有通过(具体来说就是'value')。

有谁知道我可以如何传播这些属性?

EmployerType(子窗体)

<?php 

namespace Agency\Work\WorkBundle\FormType; 

use Agency\Work\WorkBundle\Transformer\EmployerTransformer; 
use Agency\Work\WorkBundle\Transformer\SnowflakeTransformer; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class EmployerType extends AbstractType 
{ 

    private $options; 
    private $usor; 
    private $single; 
    private $biller; 

    // public function __construct($usor) { 
    //  $this->usor=$usor; 
    public function __construct(array $options=array()) { 
     $this->usor=$options['usor']; 
     $this->em=$options['em']; 
     $this->single= (1 == $this->usor->getEmployer()->count()); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->create('employer' 
      , 'entity' 
      , array(
       'class'  => 'Agency\Work\WorkBundle\Entity\Employer' 
       , 'query_builder' => 
       function ($repository) { 
        $qb = $repository->createQueryBuilder('b') 
        ->addOrderBy('b.name'); 
        if (! $this->usor->isAdmin()) { 
         $qb->join('b.usor', 'u')->andWhere("u=$this->usor"); 
        } 
        return $qb; 
       } 
      ) 
     ) 
     ; 

     if ($this->single) { 
      $builder->setOption('data' 
       , $this->single?($this->usor->getEmployer()->first()->getId()):'' 
       ); 
      $transformer=new EmployerTransformer($this->em); 
      $builder->addModelTransformer($transformer); 
     } 

     var_dump($builder->getOptions()); 
    } 

    /** 
    * 
    * 
    * @param object $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) { 
     $resolver->setDefaults(array(
       'class'  => 'Agency\Work\WorkBundle\Entity\Employer' 
       , 'label'  => 'Employer' 
       , 'label_attr' => array('class' => 'txtl') 
      )); 
    } 

    public function getParent() { 
     return $this->single ? 'hidden' : 'entity'; 
    } 

    /** 
    * 
    * 
    * @return unknown 
    */ 
    public function getName() { 

     return 'employer'; 
    } 

} 

WorkType(子窗体)

<?php 

namespace Agency\Work\WorkBundle\FormType; 

use Agency\Work\WorkBundle\Transformer\EmployerTransformer; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class WorkType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $securityContext = $options['attr']['securitycontext']; 
     if (isset($options['attr']['em'])) { $em = $options['attr']['em'];} else {$em=null;} 
     $usor = $securityContext->getToken()->getUser(); 

     $builder->add(
      $builder->create ('employer' 
       , new EmployerType(array('usor' => $usor, 'em'=>$em)) 
      ) 
      ) 
      ; 


     $builder 
     ->add('workDate' 
      , null 
      , array(
       'label'  => 'End' 
       , 'label_attr' => array('class' => 'txtl') 
       , 'attr'  => array('class' => 'dateEnd') 
      ) 
     ); 

    } 


    /** 
    * 
    * 
    * @param object $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) { 
     $resolver->setDefaults(array(
       'data_class' => 'Agency\Work\WorkBundle\Entity\Consent' 
      )); 
    } 


    /** 
    * 
    * 
    * @return unknown 
    */ 
    public function getName() { 
     return 'jobtype'; 
    } 


} 

回答

1

非常有趣的代码格式,但非常难以读取。乍看之下,似乎是错误这里

'query_builder' => 
       function ($repository) { 
        $qb = $repository->createQueryBuilder('b') 
        ->addOrderBy('b.name'); 
        if (! $this->usor->isAdmin()) { 
         $qb->join('b.usor', 'u')->andWhere("u=$this->usor"); 
        } 
        return $qb; 
       } 

您使用closure作为一个回调函数,因此需要使用use关键字提供上下文关闭。

'query_builder' => function ($repository) use ($usor) { 
    $qb = $repository 
     ->createQueryBuilder('b') 
     ->addOrderBy('b.name'); 
    if (! $usor->isAdmin()) { 
     $qb->andWhere('b.usor = :u')->setParameter('u', $usor); 
    } 
    return $qb; 
} 
+0

我确实同意你的封闭式样更好,那里有错误。但是,按照建议的方式修复后,问题仍然存在:子窗体的(EmployerType's)属性不会传播到父窗体(workType) – Lighthart 2013-05-14 19:30:31

+0

请提供您传递给您的数据。还有,调用'$ builder-> setOption('data')'的原因? – 2013-05-15 13:10:26

+0

设置数据集的数据。总之,我已经用完全不同的方法解决了这个问题。我会接受,所以没有人在这里旋转他们的轮子。 – Lighthart 2013-05-16 19:22:43

相关问题