父窗体中没有包含Symfony子窗体属性



所以我有麻烦从子表单获取属性。这个场景是我制作了一个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;
}

最新更新