根据上下文交换表单字段类型的更好方法

时间:2012-07-15 21:36:27

标签: php symfony

是否可以制作单一表单类型来处理以下两种情况?

我正在开发一个应用程序,其中“普通”用户(例如ROLE_USER)可以通过填写表单来执行任务。创建记录后,他将链接到事件表。此外,ROLE_ADMIN用户可以代表他们链接用户(使用相同的表单和其他“用户”字段),从用户列表中选择用户。

目前我有一个“eventType”和一个“eventAdminType”,代码重复率为98%。我已经阅读过有关变形金刚和形式事件的内容,但我并不完全确定如何根据我的需要调整它们。

“eventType”的表单代码:

$builder
    ->add(
        'reservedSlots', 'choice', array(
            'choices'   => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5'),
            'required'  => true,
        )
    )

“eventAdminType”的表单代码:

$builder
    ->add('user')
    ->add(
        'reservedSlots', 'choice', array(
            'choices'   => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5'),
            'required'  => true,
        )
    )

实体代码:

class EventUser
{
...
/**
 * @ORM\OneToOne(targetEntity="User")
 * @var type
 */
private $user;
...
// all the other fields
/**
 *
 * @ORM\Column(type="integer")
 */
private $reservedSlots

我如何创建上面的单一表单类型?

1 个答案:

答案 0 :(得分:1)

您可以为两种类型创建表单类型类,并将其扩展为另一种类型:

namespace Acme\Bundle\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class EventType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        // some code
    }
}

namespace Acme\Bundle\DemoBundle\Form;

use Symfony\Component\Form\FormBuilder;

class EventAdminType extends EventType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        parent::buildForm($builder, $options);

        // fields for the admin form
    }
}

以下是有关creating form classes的其他信息。