所以我有麻烦从子表单获取属性。这个场景是我制作了一个Work表单,其中选择了"雇主"。如果用户是应用程序管理员,他们可以选择所有雇主。如果用户是为多个雇主工作的员工,他们将在表单中选择雇主。否则(如果它们只有一个雇主),我想用雇主集呈现一个隐藏字段。此外,Employer子表单应该自己处理这个问题。
我的策略是在雇主子表单中设置一些属性,但是当我将这些属性添加到工作表单时,它们没有通过(特别是'value')。
有人知道我如何传播这些属性吗?
EmployerType(子表单)
<?php
namespace AgencyWorkWorkBundleFormType;
use AgencyWorkWorkBundleTransformerEmployerTransformer;
use AgencyWorkWorkBundleTransformerSnowflakeTransformer;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
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' => 'AgencyWorkWorkBundleEntityEmployer'
, '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' => 'AgencyWorkWorkBundleEntityEmployer'
, 'label' => 'Employer'
, 'label_attr' => array( 'class' => 'txtl' )
) );
}
public function getParent() {
return $this->single ? 'hidden' : 'entity';
}
/**
*
*
* @return unknown
*/
public function getName() {
return 'employer';
}
}
工作类型(子表单)
<?php
namespace AgencyWorkWorkBundleFormType;
use AgencyWorkWorkBundleTransformerEmployerTransformer;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
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' => 'AgencyWorkWorkBundleEntityConsent'
) );
}
/**
*
*
* @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;
}
您使用闭包作为回调函数,因此需要使用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;
}