簡體   English   中英

Symfony2:如何在編輯時禁用表單字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM