簡體   English   中英

表單構建器中的關聯數組字段 - Symfony3

[英]Associative array fields in form builder - Symfony3

讓我們從背景開始。

我需要具有基本信息的用戶個人資料,如姓名,電子郵件,電話等。為此,我有一個實體用戶。

我還需要存儲調查問卷的答案。 我想將它們作為文本字段中的json存儲在數據庫中。 這些問題將來可能會發生變化,目前有大約30個問題,所以我不想將其存儲為實體。 所以目前在我的用戶實體中我有這個:

/**
 * @var array
 *
 * @ORM\Column(name="questionnaire", type="json_array", nullable=true)
 */
private $questionnaire;

我知道Symfony會處理json_encode / json_decode的事情。 所以這很棒。

但是現在,我在使用symfony構建器創建表單時遇到了一些問題。

首先,我想我可以嘗試這樣的事情:

$builder->add('questionnaire[source]');

哪個不起作用。 對於symfony大師來說,我知道這很明顯; o)

所以我目前的選擇是:CollectionType或Data Transformers。

從我看到,CollectionType將無法工作,因為它只適用於數字數組,其中我們有一些JS“添加另一行”或其他東西。 http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items但如果我對此錯了,我應該選擇CollectionType並且有一些神奇的方法請告訴我。 我找不到這個。

所以我在考慮使用Data Transformers或者只是在沒有這個Transformer的情況下在提交時創建一個數組。 使用“mapped => false”創建問卷調查中的所有字段,然后將這些提交的值設置為$ questionnaire的關聯數組。 這種“感覺”還可以,但我不知道如何在“編輯”表單中處理這個問題(從我想到的文檔http://symfony.com/doc/current/reference/forms/types/form.html #data )。

問卷調查本身將有許多ChoiceType字段,一個CollectionType與“添加更多行”等等,它將有很多問題。 所以它會有點復雜。 我想避免為每個問題作為一個屬性創建實體(不確定它是否是一個正確的選擇,但考慮到我認為它是最好的一切)。

這是我與symfony的第一次約會,所以任何幫助/小貼士都會欣賞。

幾天后,我找到了自己問題的答案。 Bounty沒有幫助它更快,但嘿,有一個解決方案! ; O)

事實證明它非常簡單。 我實際上並沒有在這個特定的問題上找到很多東西,所以如果你需要類似的東西,這里就是。

在具有此json_array的實體類中,定義所有需要的鍵,如下所示:

/**
 * @var array
 *
 * @ORM\Column(name="questionnaire", type="json_array", nullable=true)
 */
private $questionnaire = [
    'favPet'=>'',
    'favFood'=>'',
    'favColor'=>''
];

接下來,在表單構建器中使用“property_path”! 就這么簡單...... https://symfony.com/doc/current/reference/forms/types/form.html#property-path如下:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('email', EmailType::class)
        ->add('phone')
        ->add('address')
         ->add('favPet',TextType::class,[
            'label'=>'Fav pet',
            'property_path'=>'questionnaire[favPet]'
        ])
        ->add('favFood',TextType::class,[
            'label'=>'Fav food',
            'property_path'=>'questionnaire[favFood]'
        ])
        ->add('favColor',TextType::class,[
            'label'=>'Fav color',
            'property_path'=>'questionnaire[favColor]'
        ])
    ;
}

而symfony將處理剩下的事情。 因為我們使用json_array作為類型,symfony將處理json_encode / json_decode的事情。 為了使symfony在編輯模式下映射/填充值,屬性必須定義它的鍵。 否則你會收到錯誤:

PropertyAccessor需要對象或數組的圖形進行操作,但在嘗試遍歷路徑時發現類型為“NULL”

然后在twig模板中你可以這樣做:

{{ user.questionnaire.favPet }}

就是這樣! :O))

至於JSON或實體。 我知道我沒有寫任何實體,但我沒有下定決心。 經過一些IRC對話,閱讀和https://stackoverflow.com/a/4013207/531099我可能會選擇EAV。 因此,如果您在JSON與實體之間做出決定,請將EAV添加到比賽中。

我和Sylius有類似的問題:該實體有一個名為“configuration”的數組字段,該應用程序可能希望該字段的格式如下:

['configuration' =>   
        ['filters' =>   
            ['taxons' =>   
                ['frg', 'books']   
            ]   
        ]   
     ];

我設法保持一個關聯數組的格式,就像使用嵌套表單請求一樣:

表單類層次結構如下:

  • PercentageDiscountConfigurationType - 用於配置
  • ActionFiltersType - 用於過濾器
  • TaxonFilterType - 用於分類

您可以在這里看到具有類似功能的PR: https//github.com/Sylius/Sylius/pull/6054/files

暫無
暫無

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

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