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