forms - 未显示隐藏字段的 symfony 表单验证消息

标签 forms validation symfony twig hidden-field

我的问题很简单,但我真的不知道该怎么解决。

情况如下:

在 symfony2 (2.3.*) 中,我创建了一个表单(DocumentType.php + twig 渲染模板)。包括一个文件表格。有一些经典字段(文本、选择)以及一个文件输入。这个文件输入非常特殊,我使用了一些技巧来自定义元素的渲染属性。

这里是EntityType类:

class DocumentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'documentName',
                'text',
                array(
                    'label' => 'Nom du document'
                )
            )
            ->add(
                'documentVersionCustom',
                'text',
                array(
                    'required' => false,
                    'label' => 'Version personnalisée'
                )
            )
            ->add(
                'documentStatus',
                'choice',
                array(
                    'choices' => Document::getStatusChoices(),
                    'attr' => array(
                        'class' => 'select2',
                    ),
                    'label' => 'Etat'
                )
            )
            ->add(
                'file',
                'file',
                array(
                    'mapped' => false,
                    'attr' => array(
                        'class' => 'hidden'
                    ),
                    'label' => 'Fichier',
                    'required' => true
                )
            );
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        [...]
    }

    public function getName()
    {
        [...]
    }
}

这里是Twig 模板(部分):

             <div class="row">
                {{ form_errors(form) }}
                <legend class="span12">Informations du fichier</legend>

                {{ form_label(form.documentName,'Nom du fichier',{'label_attr':{'class':'span4' }}) }}
                {{ form_errors(form.documentName) }}
                {{ form_widget(form.documentName,{'attr':{'class':'span8' }}) }}

                {{ form_label(form.documentVersionCustom,'Version personnalisée',{'label_attr':{'class':'span4' }}) }}
                {{ form_errors(form.documentVersionCustom) }}
                {{ form_widget(form.documentVersionCustom,{'attr':{'class':'span8' }}) }}

                {{ form_label(form.documentStatus,'État',{'label_attr':{'class':'span4' }}) }}
                {{ form_errors(form.documentStatus) }}
                <div class="row">
                    {{ form_widget(form.documentStatus,{'attr':{'class':'span8 select2' }}) }}
                </div>

                <div class="row">
                    {#{{ form_label(form.file,'Fichier',{'label_attr':{'class':'span4' }}) }}#}
                    {{ form_errors(form.file) }}
                    {{ form_widget(form.file,{'attr': {'style': 'display:none;' },'id' : 'browseFile' }) }}
                    <label for="browseFile" class="span4">Fichier</label>

                    <div class="row">
                        <div class="input-append span8">
                            <input type="text" name="subfile" id="subfile" onclick="$('#browseFile').click();">
                            <a class="btn btn-success" onclick="$('#browseFile').click();">Parcourir</a>
                        </div>
                    </div>
                </div>
                <div class="row">
                </div>
                {#<div class="row">#}
                    <input id="fileFormSubmitButton" type="submit" value="Ajouter" class="btn btn-primary span3"/>
                    <span class="span6">&nbsp;</span>
                    <input id="fileFormCancelButton" type="button" value="Annuler" class="btn span3"/>
                {#</div>#}
            </div>

我对此文件输入的小技巧是隐藏标准输入,并使用 javascript 将事件(单击、焦点)从样式元素重定向到隐藏元素( #subfile => form_widget(form.file) )。

一切正常,但唯一的问题是文件输入。提交表单时,验证消息会正确显示所需的标准输入,但对于此文件输入(这也是必需的),该消息将显示在浏览器的左下角(这是查看 « symfony 弹出工具提示 » 是让浏览器(在我的例子中是 Firefox)不处于全屏模式。

我的问题:有没有办法在 symfony FormType 或其他任何地方指定“附加”错误消息到特定组件?

谢谢

最佳答案

可以通过自定义约束来实现。在验证器类中,我们使用

$this->context
    ->addViolationAt('lastname', $constraint->message, array('%string%' => $value));

但老实说,如果您正确输入文件,就不会出现此错误。使用带有表单类的输入类型文件,或者不使用它,但不是一半。

关于forms - 未显示隐藏字段的 symfony 表单验证消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18269387/

相关文章:

php - Symfony2 从 api 数据填充选择列表

asp.net-mvc - 服务层验证

Symfony 2 - 基于 'separate' 角色的 ACL 检查权限

forms - 将 MS Access 表单中的文本框设置为数组?

html - 表单在规模上变得无响应

jquery - 控制 HTML5 验证气球滚动?

Java 16位CRC数据包验证

r - 我怎么知道哪些 NA 是通过强制引入的?

forms - 如何访问 Twig 模板中的 Symfony 2 formview.valid 变量

php - 选择为空时显示所有条目的 Symfony2 实体字段