复杂的表单集合类型和事件在Symfony2中预先设置数据

时间:2014-03-07 04:09:59

标签: php symfony symfony-2.3 formcollection

控制器中的

$form = $this->createForm(new ArticleType($this->getUser()), $article);

中的

class ArticleType extends AbstractType
{
    private $appUser;

    public function __construct($appUser)
    {
        $this->appUser = $appUser;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $data = $builder->getData();
        $builder->add('name', 'text');
        $builder->add('examples', 'collection', array(
            'type'    => new ExampleType($this->appUser),
            'options' => array(
                'required' => true,
            ),
            'allow_add'    => true,
            'by_reference' => false,
            'allow_delete' => true,
            'prototype'    => true
        ));

        if (NULL == $data->getOwner() || $data->getOwner() == $this->appUser) {
            $builder->add('status', 'choice', array(
                'choices' => array(
                    'A' => 'A',
                    'B' => 'B',
                    'C' => 'C',
                ),
                'required' => true
            ));
        }
    }

    // ...
}
ExampleType中的

// ...
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class ExampleType extends AbstractType
{
    private $appUser;

    public function __construct($appUser)
    {
        $this->appUser = $appUser;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function(FormEvent $event) {
                $example = $event->getData();
                $form    = $event->getForm();

                // Problem 1 : This $example is null if data already registered example.
                // problem 2 : Using $this when not in object context
                if (!$example || (null == $example->getOwner() || $example->getOwner() == $this->appUser)) {
                    $form->add('status', 'choice', array(
                        'choices' => array(
                            'A' => 'A',
                            'B' => 'B',
                            'C' => 'C',
                        ),
                        'required' => true
                    ));
                }
            });
    }

    // ...
}

收集表格中的数据确认过程不起作用 在此之后,ArticleType必须从另一个收集 现在,我想清除这个阶段的错误。 (在PHP 5.3中)

1 个答案:

答案 0 :(得分:1)

您必须将ExampleType.php中的buildform更改为:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', 'text');
    $appUser = $this->appUser;
    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use ($appUser) {
            $example = $event->getData();
            $form    = $event->getForm();

            // This $example is null if data already registered example.
            // Error: Using $this when not in object context
            if (!$example || (null == $example->getOwner() || $example->getOwner() == $appUser)) {
                $form->add('status', 'choice', array(
                    'choices' => array(
                        'A' => 'A',
                        'B' => 'B',
                        'C' => 'C',
                    ),
                    'required' => true
                ));
            }
        });
}