图片。 Symfony 4 中每种域语言的 buildForm 中的文本字段和文本区域

Image. textfield and textarea in buildForm for every domain language in Symfony 4

好的,另一个问题。有点难解释所以提前抱歉。

我有一个名为 SlideContent 的实体,它主要存储 idslide(与名为 SlideshowSlide 的实体的关系)、language (与名为 Language 的实体的关系)、titlecontent.

我还有一个名为 Domain 的实体。这也与 Language 有关(因为每个 Domain 都有一种语言)。

每个 User 都可以拥有一个或多个 Domain 他们拥有的权利。如果您拥有 Domain 的权利,您显然拥有 DomainLanguage 的自动权利。

现在,我需要做的是,为 User 拥有的每个 Languagetable 中添加一个 tr。在那个 tr 中,它需要将 Language 中的 base64img 显示为图像,标题的输入字段和内容的文本区域。我更喜欢以 class.

的形式使用它

我尝试了以下方法:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    foreach ($options['user']->getDomains() as $domain)
    {
        $builder->add('titles[' . $domain->getLanguage()->getId() . ']', TextType::class);
    }
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'user' => null
    ));
}

但我收到以下错误:

The name "titles[2]" contains illegal characters. Names should start with a letter, digit or underscore and only contain letters, digits, numbers, underscores ("_"), hyphens ("-") and colons (":").

是否可以如我所愿?我知道我可能必须在我的模板中为 base64img 再做一个 foreach 并在 tr 中添加所有内容,但是我怎样才能在索引数组输入字段方面实现我想要的?

原则上你的方法是可以的,但是字段名称只能包含提到的字符(见你的错误信息)。 (一个简单明显的原因是,这种方法可能避免了命名冲突)

为了避免这种情况,但要将其写入结果数据object/array,您可以这样做:

foreach ($options['user']->getDomains() as $domain)
{
    $builder->add('titles_' . $domain->getLanguage()->getId(), TextType::class, [
         'property_path' => 'titles['.$domain->getLanguage()->getId().']',
    ]);
}

有关详细信息,请参阅 property_path option

本质上如此:使表单字段名称有效,并且仍然获得与其他方式相同的 属性 路径。

如果需要在模板中访问:

form['titles_'~language.id]

(取决于您的表单命名方式和语言变量)