簡體   English   中英

Symfony2-FormType中的條件

[英]Symfony2 - Condition in FormType

我的表單有一個RegisterType類:

<?php
class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('price');        
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Register'
        ));
    }

    public function getName()
    {
        return 'register';
    }
}
?>

注冊實體與稱為產品的實體有關系

我想將此條件添加到buildForm函數:

<?php
if ($product->getTitle() == 'SuperProduct') {
    $builder->add('amount', 'money', [
        'required' => FALSE,
    ]);
}
?>

如果產品標題的值為“ SuperProduct”,則在表單中添加一個字段。

但是我不知道必須使用哪種語法在FormType中調用另一個Entity值。

在此先感謝您的幫助。

好的,您已經將FormType實現為獨立類而不是在控制器中實現的,所以我要做的就是將您的產品實體作為選項傳遞給FormType類中的私有變量。 我不確定您的產品屬於哪個類或產品所在的名稱空間,因此您必須填寫。

我也已經寫過這篇文章,期望將來您可以有多個選項可以通過,因此它對您編寫的其他FormType類很有用。 創建FormType類的實例時,可以設置在類范圍內定義的每個變量。 確保將這些變量初始化為false而不是null,否則構造函數中的代碼將看不到它們。

<?php
    class RegisterType extends AbstractType
    {
        private $product = false;

        public function __construct(array $options = [])
        {
            foreach ($options as $name => $value) {
                if (isset($this->$name)) {
                    $this->$name => $value;
                }
            }
        }

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name')
                ->add('price')
            ;

            if ($this->product && is_a("\Namespace\To\Your\Entity\Called\Product", $this->product)) {
                if ($this->product->getTitle() == 'SuperProduct') {
                    $builder
                        ->add('amount', 'money', [
                            'required' => FALSE,
                        ])
                    ;
                }
            }
        }

        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AppBundle\Entity\Register'
            ));
        }

        public function getName()
        {
            return 'register';
        }
    }
?>

該“ is_a()”函數檢查通過表單類型類構造函數傳入的產品變量是否確實是您的產品實體的實例,因此您可以確定存在getTitle()函數。

現在,當您創建RegisterType類的新實例時,您需要通過一個包含產品的options數組。 您可以在此處重命名兩個概念變量名稱。

<?php
    $form = $this->createForm(new RegisterType([
        "product" => $instanceOfProductEntityOrNull,
    ]), $theEntityTheFormWillBeHandling);
?>

嘗試這樣的事情:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $product = $event->getData();
    $form = $event->getForm();

    if ($product->getTitle() == 'SuperProduct') {
        $form->add('name', 'text');
    }
});

並且不要忘記具體用途

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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