0

我正在 Symfony 2 中构建一个表单,其字段将根据相应实体的配置方式而有所不同。

简而言之,每个实体都有一组“详细信息”字段,可以保存不同类型和配置的数据。

例如,一个Project实体可能具有以下配置:

  • url呈现为文本输入并验证为最大长度为 300 个字符的 URL。
  • description呈现为没有验证约束的文本区域。
  • logo呈现为文件输入并验证为最大尺寸为 500x500 的图像文件。

等等。有趣的是,所有这些都是通过数据库表配置的,因此管理员可以通过 UI 更改这些模型的配置。

(相关部分)数据库结构如下所示:

ERD 显示 4 个表 - project、project_detail、detail_type 和 detail_type_assignment

  • project存储项目记录。
  • project_detail存储每个项目的每个详细信息字段的值。
  • detail_type定义每个详细信息字段的类型和配置。
  • detail_type_assignment定义每个实体可用的详细信息类型以及字段在表单上显示的顺序。

到目前为止,除了在表单中呈现错误消息外,一切都运行良好。

当这些详细信息字段中的任何一个生成验证错误时,它会显示在表单的顶部:

顶部显示详细字段错误消息的项目编辑表单的屏幕截图。

注意在上图中,“EIN”是存在于Project实体中的字段(即,实现了 Symfony 表单的正常方式),而“URL”和“Logo Upload”则作为详细字段实现。

外观如下ProjectType

class ProjectType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('ein', 'ein')
        ;

        /* Add detail fields to the form builder. */
        foreach($this->getDetailTypes() as $detailType)
        {
            $slug       = $detailType->getSlug();
            $formatter  = $detailType->createFormatterInstance('');

            $builder->add(
                  $slug
                , $formatter->getFormFieldType()
                , $formatter->getFormFieldOptions()
            );

            /* E.g.,
             *
             * $builder->add(
             *     'url'
             *   , 'text'
             *   , array('label' => 'URL', ...)
             * )
             */
        }
    }

    ...
}

我很确定这里发生的事情是ViolationMapper无法property_path正确翻译。

例如,在运行时,property_path值为urlproject.details[url].value但字段位于project.url

我不希望构建复杂的表单层次结构,以便每个字段的位置与其property_path. 有没有办法可以更改添加违规的路径ExecutionContext

4

1 回答 1

0

在您看来,我觉得您不应该使用form(form)inside of form_start(form)and form_end(form)。我相信这会生成<form>两次标签

老答案:

Idk 你的树枝是什么样子的,但我假设表单行中的错误没有显示出来。http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template谈到了它。

从链接:

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{{ form_start(form) }}
{{ form_errors(form) }}

{{ form_row(form.task) }}
{{ form_row(form.dueDate) }}
{{ form_end(form) }}

Take a look at each part:
form_start(form) - Renders the start tag of the form.
form_errors(form) - Renders any errors global to the whole form (field-specific errors are displayed next to each field);
form_row(form.dueDate) - Renders the label, any errors, and the HTML form widget for the given field (e.g. dueDate) inside, by default, a div element;
form_end() - Renders the end tag of the form and any fields that have not yet been rendered. This is useful for rendering hidden fields and taking advantage of the automatic CSRF Protection.

form_row 可以拆分为每个部分:

<div>
    {{ form_label(form.task) }}
    {{ form_errors(form.task) }}
    {{ form_widget(form.task) }}
</div>

并且 form_errors() 函数应该显示你想要的。

于 2013-09-11T08:16:02.927 回答