0

そのため、サブフォームから属性を取得するのに問題があります。シナリオは、「雇用主」が選択されるワークフォームを作成しました。ユーザーがアプリケーション管理者である場合、すべての雇用主を選択できます。ユーザーが複数の雇用主と一緒に働く労働者である場合、ユーザーはフォームで雇用主を選択します。それ以外の場合 (単一の雇用主がいる場合)、雇用主セットで非表示フィールドをレンダリングしたいと考えています。さらに、Employer サブフォームはこれを単独で処理する必要があります。

私の戦略は、雇用者サブフォームにいくつかの属性を設定することでしたが、これらをワークフォームに追加すると、それらは通り抜けません(具体的には「値」)。

これらの属性を伝播する方法を知っている人はいますか?

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';
    }


}
4

1 に答える 1

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

クロージャーをコールバック関数として使用するため、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;
}
于 2013-05-14T17:08:24.523 に答える