Symfony子窗体属性不包含在父项中
问题描述:
所以我无法从子窗体获取属性。这个情景是我做了一个选择'雇主'的工作表格。如果用户是应用程序管理员,他们可以选择所有雇主。如果用户是与多个雇主合作的工人,他们会在表单中选择雇主。否则(如果他们有一个单一的雇主),我想用雇主设置一个隐藏的领域。另外,雇主子表单应该自己处理这个问题。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';
}
}
答
非常有趣的代码格式,但非常难以读取。乍看之下,似乎是错误这里
'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;
}
我确实同意你的封闭式样更好,那里有错误。但是,按照建议的方式修复后,问题仍然存在:子窗体的(EmployerType's)属性不会传播到父窗体(workType) – Lighthart 2013-05-14 19:30:31
请提供您传递给您的数据。还有,调用'$ builder-> setOption('data')'的原因? – 2013-05-15 13:10:26
设置数据集的数据。总之,我已经用完全不同的方法解决了这个问题。我会接受,所以没有人在这里旋转他们的轮子。 – Lighthart 2013-05-16 19:22:43