Symfony 2:首次保存后将字段设置为只读

Symfony 2:首次保存后将字段设置为只读,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个Symfony 2实体。当我创建一个新记录时,我必须使用一个表单填充所有的值,但是在保存它之后,当我更新其他成员时,$amount其中一个值不应该是可更新的 我怎样才能做到这一点?可以在运行时将表单成员标记为只读?通过在创建表单时使用验证组和名称选项,您可以更改表单。 name属性设置表单创建,而validation\u组负责验证。 例如,在控制器的“创建/新建”方法中 public function createAction(Request $request) { // Ins

我有一个Symfony 2实体。当我创建一个新记录时,我必须使用一个表单填充所有的值,但是在保存它之后,当我更新其他成员时,$amount其中一个值不应该是可更新的


我怎样才能做到这一点?可以在运行时将表单成员标记为只读?

通过在创建表单时使用
验证组
名称
选项,您可以更改表单。
name
属性设置表单创建,而
validation\u组负责验证。
例如,在控制器的“创建/新建”方法中

public function createAction(Request $request)
{
    // Instantiate new Foo object
    $client = new Foo();

    // create the form (setting validation group)
    $form = $this->formFactory->create('foo', $foo, array(
        'name' => 'create',
        'validation_groups' => array('create')
            )
    );

    // form has been submitted...
    if ('POST' === $request->getMethod()) {
        // submits the form
        $form->handleRequest($request);

        // do validation
        if ($form->isValid()) {
            // do whatever
        }
    }

    // either GET or validation failed, so show the form
    return $this->template->renderResponse('FooBundle:foo:add.html.twig', array(
                'form' => $form->createView(),
                'foo' => $foo
    ));
}
在控制器的编辑/更新功能中

public function updateAction($id, Request $request)
{
    // Instantiate Client object
    $client = new Foo($id);

    // create the form (setting validation group)
    $form = $this->formFactory->create('foo', $foo, array(
        'name' => 'update',
        'validation_groups' => array('update')
    ));

    // form has been submitted...
    if ('POST' === $request->getMethod()) {
        // submits the form
        $form->handleRequest($request);

        // do validation
        if ($form->isValid()) {
            // do whatever
        }
    }

    // either GET or validation failed, so show the form
    return $this->template->renderResponse('FooBundle:foo/edit:index.html.twig', array(
                'form' => $form->createView(),
                'foo' => $foo
    ));
}
您的表单类型将类似于:

class FooType extends BaseAbstractType
{
    protected $options = array(
        'data_class' => 'FooBundle\Model\Foo',
        'name'       => 'foo',
    );

    private $roleManager;

    public function __construct($mergeOptions = null)
    {
        parent::__construct($mergeOptions);
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->$options['name']($builder, $options);
    }

    private function create(FormBuilderInterface $builder, array $options)
    {
        // ID
        $builder->add('Id', 'text', array(
            'required' => true,
            'label' => 'ID',
            'attr' => array(
                'placeholder' => 'Format: 2 alphanumeric (e.g. A1)'
            )
        ));

        // Name - only show on create
        $builder->add('Name', 'text', array(
            'required' => true,
            'label' => 'Name',
            'attr' => array(
                'placeholder' => 'Your name'
            )
        ));

        // add the submit form button
        $builder->add('save', 'submit', array(
            'label' => 'Save'
        ));
    }

    private function update(FormBuilderInterface $builder, array $options)
    {
        // ID
        $builder->add('Id', 'text', array(
            'required' => true,
            'label' => 'ID',
            'attr' => array(
                'placeholder' => 'Format: 2 alphanumeric (e.g. A1)',
            )
        ));

        // Name - just for show
        $builder->add('Name', 'text', array(
            'required' => true,
            'label' => 'Name',
            'attr' => array(
                'readonly' => 'true' // stops it being editable
            )
        ));

        // add the submit form button
        $builder->add('save', 'submit', array(
            'label' => 'Save'
        ));
    }
}

另外,我的所有类都声明为服务,因此您对创建表单/视图/etc的调用方式可能有所不同。

在编辑路径上,您可以创建第二个
EntityType
,该属性不会添加
amount
属性。要处理验证,您可以使用抱歉,但这对我不起作用。我已将表单类声明为服务,但无法从控制器调用$this->formFactory->create(formFactory不存在)。如果我调用$this->createForm,它将不起作用,因为我在数组中传递了'name'值,它会抛出一个异常,指出这是数组的一个不正确的值。。。我做错了什么?这个问题可能是因为我安装了SonatAdminBundle吗?@mhouse您是否声明使用Symfony\Component\Form\FormFactoryInterface;在您的控制器(对我来说也是一个服务)中,将其DI到formFactory属性?