稍后我们将向此配置中添加本地化标签、类、可选和必填字段等内容。
本地化标签是自动处理的,可以根据用户的语言环境进行翻译和转换。强制字段可以使用约束来解决。
这个配置应该直接放在实体和表单类型中:
您可以创建一个
LocaleAddressType
并根据当前“语言环境”值添加这些字段,但首先需要有一个包含所有与“地址”相关的可能字段的实体。
LocaleAddress
实体:
use Symfony\Component\Validator\Constraints as Assert;
class LocaleAddress
{
private $id;
private $firstName;
}
包括所有可能的区域设置和使用nullable=true
来设置所有唯一的字段。此外,使用NotBlank
约束和groups
选项来验证每个区域设置的必填字段。
配置文件
address_form:
nl-NL:
- [firstname, infix, lastname]
- [street1, number]
- [postcode, city]
en-US:
- [fullname]
- [street1]
- [street2]
- [city, state]
- [zip]
复合LocaleAddressType
根据locale
选项添加一些字段, 默认情况下为Locale::getDefault()
class LocaleAddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$config = $this->loadLocaleFormConfig($options['locale']);
foreach ($config as $fields) {
foreach (fields as $field) {
$builder->add($field);
}
}
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['config'] = $this->loadLocaleFormConfig($options['locale']);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\LocaleAddress',
'locale', \Locale::getDefault(),
]);
$resolver->setNormalizer('validation_groups', function (Options $options) {
return [$options['locale']];
});
$resolver->setAllowedTypes('locale', ['string']);
}
private function loadLocaleFormConfig($locale)
{
$config = Yaml::parse(file_get_contents('path/to/locale_address_form.yml'));
return $config['address_form'][$locale];
}
}
注意:在提交时,该字段将根据locale
值进行验证。
注册表单类型:
services:
app.form.locale_address:
class: AppBundle\Form\Type\LocaleAddressType
tags:
- { name: form.type }
使用表单
现在,您可以在其他表单中使用此表单类型,并与localeAddress
字段相关联。
$build->add('localeAddress', LocaleAddressType::class)
当您更改应用程序中的语言环境
\Locale::setDefault
,这会影响表单字段的显示。
为字段创建模板
我希望将表单布局和本地化(顺序、分组、标签、翻译、必填和可选字段)与表单处理(PHP/SF)和实际渲染(TWIG)分开。
{% block locale_address_widget %}
{% for fields in config %}
<div class="row">
{% set n = 12 // fields|length %}
{% for field in fields %}
<div class="col-md-{{ n }}">
{{ form_row(form[field]) }}
</div>
{% endfor %}
</div>
{% endfor %}
{% endblock %}
这段代码基于Symfony3。
.col-md-N
类来创建内联输入和.row
来创建新行。 - yceruto