我有一些*Type
表单类和一个forms.html.twig
来自定义表单外观。默认情况下,在此文件中使用此块呈现标签:
<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{{ label|trans }}</label>
我想在标签上添加一个前缀,以便组织我的翻译。例如,假设我有CustomerType
,那么我希望我的标签像:
<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
{{ 'Customer.' ~ label|trans }}
</label>
我希望能够将'Customer'
字符串传递给FormBuilder,以便我可以像以下一样使用它:
<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
{{ prefix ~ '.' ~ label|trans }}
</label>
或者也许:
<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
{{ form.prefix ~ '.' ~ label|trans }
}</label>
有人知道如何实现这个目标吗?
答案 0 :(得分:2)
为此,只需明确设置标签:
$builder->add('firstName', 'text', array(
'label' => 'customer.first_name'
));
答案 1 :(得分:2)
有一个简单的解决方案:“类型扩展”
创建一个这样的类:
<?php
namespace MyProject\MyBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
class FieldTypeExtendedExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->setAttribute('label_prefix', $options['label_prefix']);
}
public function buildView(FormView $view, FormInterface $form)
{
$labelPrefix = $form->getRoot()->hasAttribute('label_prefix') ? $form->getRoot()->getAttribute('label_prefix') : '';
$view->set('label', $labelPrefix.$form->getAttribute('label'));
}
public function getDefaultOptions(array $options)
{
return array(
'label_prefix' => '',
);
}
public function getExtendedType()
{
return 'field';
}
}
将此扩展声明为服务
<service id="form.type_extension.fieldextended" class="MyProject\MyBundle\Form\Extension\FieldTypeExtendedExtension">
<tag name="form.type_extension" alias="field" />
</service>
并在表单中使用此选项:
$form = $this->createFormBuilder($entity, array('label_prefix' => 'mylabelprefix.'))
->add('link', 'url')
->getForm();
你将有一个标签“mylabelprefix.link”。
享受!
答案 2 :(得分:2)
使用Symfony 2.1
<?php
namespace MyProject\MyBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
class FieldTypeExtendedExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->setAttribute('label_prefix', $options['label_prefix']);
}
public function buildView(FormViewInterface $view, FormInterface $form, array $options)
{
$labelPrefix = $form->getRoot()->hasAttribute('label_prefix') ? $form->getRoot()->getAttribute('label_prefix') : '';
$view->setVar('label', $labelPrefix.$view->getVar('label'));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'label_prefix' => ''
));
}
public function getExtendedType()
{
return 'form';
}
}
将此扩展声明为服务
<service id="form.type_extension.fieldextended" class="MyProject\MyBundle\Form\Extension\FieldTypeExtendedExtension">
<tag name="form.type_extension" alias="form" />
</service>
有关更多信息,see the documentation。
答案 3 :(得分:0)
我发现给定的答案没有用,但我不允许发表评论。它不起作用的原因是$view->getVar()
和$view->setVar()
方法实际上并不存在。为了完成这项工作,我必须使我的buildView()
方法看起来像这样:
public function buildView(Form\FormView $view, Form\FormInterface $form, array $options)
{
if ($options['label_prefix']) {
$view->vars['label'] = $options['label_prefix'] . ': ' . $view->vars['label'];
}
}
然后将其设置为默认为null,如下所示:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults([
'label_prefix' => null,
]);
}
希望这有帮助!