![](/img/trans.png)
[英]Symfony2, How to edit fields in a form and avoid empty password field
[英]Symfony2: How to disable form field on edit
如果對象的名稱例如是“默認”,如何禁用表單的名稱字段? 因此,用戶不能更改“默認”對象的名稱,但可以更改任何其他對象的名稱?
這就是我已經擁有的:
對象類型
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name','text', array('required' => true))
->add('description', 'textarea', array('required' => false))
->add('type', 'choice', array('choices' => array(
Object::TYPE_PUBLIC => 'Public',
Object::TYPE_PRIVATE => 'Private',
),
));
}
編輯動作
/**
* @Route("/edit/{id}", name="edit_object")
* @ParamConverter("object", class="ObjectBundle:Object")
* @Template()
*/
public function editAction(Object $object, Request $request)
{
$form = $this->createForm(new ObjectType(), $object, array(
'action' => $this->generateUrl('edit_object',['id' => $object->getId()]),
'method' => 'POST'));
$form->handleRequest($request);
if ($form->isValid() && $form->isSubmitted()) {
$em = $this->getDoctrine()->getManager();
$em->persist($object);
$em->flush();
return $this->render('@Object/Object/list.html.twig', array(
'object' => $object));
}
return array('collection'=>$collection, 'form' => $form->createView());
}
真正簡單的方法是在編輯時將值傳遞給帶有標志的窗體的構造函數。 因此,您的表單類型為:
class ObjectType extends AbstractType
{
private $isEdit;
public function __construct($isEdit = false)
{
$this->isEdit = $isEdit;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', 'textarea', array('required' => false))
->add('type', 'choice', array('choices' => array(
Object::TYPE_PUBLIC => 'Public',
Object::TYPE_PRIVATE => 'Private',
),
));
if (!$editMode) {
$builder->add('name','text', array('required' => true));
}
}
}
然后在您的控制器中:
public function editAction(Object $object, Request $request)
{
$form = $this->createForm(new ObjectType($isEdit = true), $object, array(
'action' => $this->generateUrl('edit_object',['id' => $object->getId()]),
'method' => 'POST'
));
//...
}
對於創建新createForm
時的createForm
,您可以只傳遞new ObjectType()
並保留該參數,因為在這種情況下默認將其設置為false
。
另一種方法是根據要傳遞給表單的實體FormEvents來構建表單。 如果它已經包含id的值,則無法將name字段添加到表單中:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', 'textarea', array('required' => false))
->add('type', 'choice', array('choices' => array(
Object::TYPE_PUBLIC => 'Public',
Object::TYPE_PRIVATE => 'Private',
),
));
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$object= $event->getData();
$form = $event->getForm();
if (!$object || null === $object->getId()) {
$form->add('name','text', array('required' => true));
}
});
我剛剛給出的確切用例在Symfony的書中有專門記錄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.