【问题标题】:Symfony CollectionType field with one default fieldSymfony CollectionType 字段和一个默认字段
【发布时间】:2017-08-21 13:01:02
【问题描述】:

我需要您对 CollectionType 字段的建议。

我已经使用这个创建了我的收藏类型字段:Symfony CollectionType Field
一切正常。即使是使用 JQuery 的动态添加字段也可以正常工作。

但是有一个问题。

我不知道如何在每次呈现集合字段时添加一个字段。现在我的页面加载后,我的收藏字段是空的。但是,我想要在每次页面加载后集合中的第一个字段。

如何做到这一点?我应该使用 Javascript 还是某种形式的事件?任何在文档或代码 sn-ps 中找到正确章节的提示都将非常受欢迎。

【问题讨论】:

  • 你能详细说明一下吗?您是否尝试加载现有实体?还是您在首次加载时只需要一个空白字段?
  • 好的。我的 CollectionType 字段选项 'entry_type' => TextType::class。因此,在页面加载后,我希望看到一个准备好为用户填写的文本字段。我知道我正在传递字段数组,但不幸的是我不知道如何添加默认的第一个元素。
  • 我已经有一段时间没有这样做了 - 集合配置中的 'allow_add' => true, 没有帮助吗?
  • 根据文档:“如果 allow_add 设置为 true,那么如果提交了任何无法识别的项目,它们将被无缝添加到项目数组中。”因此它提供了在提交后动态添加字段的选项。但是我希望在页面加载后立即提交之前呈现的第一个项目。

标签: php forms symfony symfony-forms


【解决方案1】:

这种方法对我有用。

// 3 default values for empty form
$configArr = [[], [], []];

if ($builder->getData()) {
    $configArr = $builder->getData()->getColumns();
}

$builder->add('columns', CollectionType::class, [
    'entry_type' => ColumnType::class,
    'prototype' => true,
    'allow_add' => true,
    'allow_delete' => true,
    'data' => $configArr,
    'mapped' => false,
]);

【讨论】:

    【解决方案2】:

    我想我记得点击过这个,我最终在第一次加载时创建了一个空子的数据。

    我无法对此进行测试,但我认为以下内容应根据您的表单具体情况起作用。

    public function someAction()
    {
        $data = [];
        $data['collection_name'][] = ['text' => ''];
    
        $form = $this->createForm(SomeType::class, $data);
    
        return $this->templating->renderResponse('template.twig.html', [
            'form' => $form,
        ]);
    }
    

    将'required' => false, 添加到集合的表单配置应该可以防止空项目被持久化。

    您还可以研究表单 Type 类的 configureOptions 方法:

    public function configureOptions(OptionsResolver $resolver)
    {
        $data = [];
        $data['collection_name'][] = ['text' => ''];
        $resolver->setDefaults(array(
            'empty_data' => $data,
        ));
    }
    

    【讨论】:

    • 它不能解决我的问题。正如我之前所说,我在这里没有使用实体。只是简单的文本字段集合。
    • 啊,好吧 - 我在这里传入的 $entity 也可以是一个数组 - 如果您将一个空数组项为您的集合添加到 create 方法中,它可能会工作相同.
    • 不幸的是,我没有使用这种方法的实体。再一次:我的表单类有一个字段,例如:“$builder->add('texts', CollectionType::class, ['entry_type' => TextType::class])”。 TextType 是一个标准的 symfony 表单域——不是来自数据库的实体。当我的页面加载时,此文本字段的集合(数组)为空。我希望这个集合在每次用户加载表单时都有一个默认的文本字段。
    • 是的 - 我感谢您没有使用实体,但您可以将一个包含空项目的数组传递给表单创建,它将映射出空集合类型以进行匹配。我不知道您的结构是什么样的,以表明该数组是什么样的,但是如果您创建一个数据数组,其中包含一个集合名称的元素和一个空元素,它将被呈现到表单中。
    • Ok.So 在哪种方法或代码中我必须传递带有空项的数组?在控制器中,我使用 createForm() 方法,而您在上面的代码中使用 formFactory(),所以我有点困惑。
    【解决方案3】:

    这对我很有效。

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $data = $builder->getData(); // data passed to the form
        $builder->add('textFields', CollectionType::class, [
            'entry_type' => TextType::class,
            'data' => $data ? $data->getTextFields() : ['']
        ]);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2021-06-22
      相关资源
      最近更新 更多