我的问题非常简单,但我真的不知道如何解决它。
情况如下:
在symfony2(2.3。*)中,我创建了一个表单(DocumentType.php + twig渲染模板)。包含文件表格。有一些经典字段(文本,选项)加上一个文件输入。这个文件输入非常特别,我使用一点hack来自定义元素的渲染属性。
这里是 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"> </span>
<input id="fileFormCancelButton" type="button" value="Annuler" class="btn span3"/>
{#</div>#}
</div>
我对此文件输入的小修改是隐藏标准输入,并使用javascript将事件(单击,焦点)从样式元素重定向到隐藏的元素(#subfile =&gt; form_widget(form.file))。
一切正常,但唯一的问题是关于文件输入。提交表单时,正确显示所需标准输入的验证消息,但对于此文件输入(也是必需的),消息显示在浏览器的左下角(查看«的唯一方法symfony popup tooltip»是保持浏览器(在我的情况下是firefox)不是全屏模式。
我的问题:有没有办法在symfony FormType或其他任何地方指定错误消息“附加”到特定组件?
谢谢
答案 0 :(得分:2)
可以使用自定义约束。在验证器类中,我们使用
$this->context
->addViolationAt('lastname', $constraint->message, array('%string%' => $value));
但老实说,如果你能正确输入文件,你就不会有这个错误。将输入类型文件与表单类一起使用,或者不使用它,但不能使用一半。