【问题标题】:Symfony: Index in collection TypeSymfony:集合类型中的索引
【发布时间】:2019-07-22 12:02:14
【问题描述】:

我正在尝试设置嵌入表单类型(集合类型)的标签。 对于不同的集合,这些标签必须不同。

例如,我有两个集合和一个带有标签 ['label1','label2'] 形式类型的数组。

我想我需要集合迭代的索引来获得正确的标签。

如下所示,我需要 entry_options 标签的索引来获取 $labels 数组的正确值。

这就是我的 buildForm 方法

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $labels = ['label1', 'label2'];

        $builder
            ->add('otherForms', CollectionType::class, [
                'entry_type' => otherFormType::class,
                'entry_options' => ['label' => $labels[$index]],
            ])
            ...
        ;
    }

【问题讨论】:

  • 您说您有两个集合,但是您的代码表明,您有一个混合集合(可能 label1 一个条目,label2 一个条目?)为什么要使用 CollectionType 而不是只需添加两个表单?
  • 我为这个例子选择了两个集合。 Normaly 我有不同语言的灵活数量的集合。一般来说,我有 10 多个收藏。如果可以灵活地构建表单,那就太好了,这样我以后可以添加语言而不必更新表单类型。
  • 我有一个挥之不去的疑问,您实际上只有 一个 集合,其中每个子表单都应获得不同的标签。准确吗?
  • 例如,我有一个 ID 为“GB”且名称为“Great British”的实体。现在我将网站更新为多语言。现在我有一个 ID 为“GB”的实体,名称在另一个具有新 ID 的实体中,引用第一个实体,国家缩写“en”和翻译“Great British”。所以我对每种语言都有一个实体。你明白吗?
  • 我不想使用翻译包。

标签: symfony query-builder


【解决方案1】:

在阅读了你们的 cmets 之后,我必须同意翻译包有时很重而且很不方便。

但是,CollectionType 通常会忽略给它的集合项的索引/键。

现在我看到了两种情况:您想将标签作为选项提供给您的表单或the form shall be dependent on the data (using form events)。到目前为止,您的代码表明,语言是全局设置的,不会以其他方式即时添加。

在第一个场景中它非常简单(见下文),第二个场景需要您的表单中的一些事件监听器,但除此之外,它非常相似。

基本的想法是只创建您需要的表单(可选地在预提交处理程序中),因为您显然已经从标签数组中知道您需要哪些表单:

foreach($labels as $index => $label) { 
    $builder->add('otherForms'.$index, otherFormType::class, [
        'label' => $label, 
        'property_path' => 'otherForms['.$index.']',
    ]);
}

property_path 的使用将帮助您访问正确的元素(但是,更改翻译的语言(= 键)可能很困难,但通常不应该发生这种情况。即使发生这种情况,也只有一些副本-pasta 是必须的)。

您的otherForms 键可能会有所不同,但我想您会弄明白的。

【讨论】:

  • 是的,我认为这是一个选项。但我希望有一个解决方案,我不需要几个表格。
  • @broxyl 从技术上讲,“CollectionType”只是创建了几个表单......所以......除非你愿意编写自己的 FormType(这可能是一个替代方案),否则总会有一个几种形式
  • 是的,我知道,但它会多次创建同一个表单,我不必自己创建多个表单。
猜你喜欢
  • 2015-08-21
  • 2015-09-14
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2016-04-05
  • 2011-02-01
  • 1970-01-01
  • 2020-03-02
相关资源
最近更新 更多