gpt4 book ai didi

forms - 如何本地化 Symfony2 表单?

转载 作者:行者123 更新时间:2023-12-04 13:11:35 26 4
gpt4 key购买 nike

我有一个 Symfony2 表单,用户可以在其中输入一个现在采用固定格式的地址,并且由于我们希望在国际上提供我们的软件,我正在寻找在 SF 中实现这一点的最佳方法。

而不是制作一个通用的 address type我们希望使用一种通用格式本地化表单作为不受支持的语言环境的后备。

我想将布局和本地化(顺序、分组、标签、翻译、必填和可选字段)与表单的处理 (PHP/SF) 和实际呈现 (TWIG) 分开。

我想到的是:创建一个 address来自包含所有可能字段的数据库模型的表单类型。通过调用 form_widget(form) 在 Twig 中自动呈现此表单类型或者在需要时渲染单个字段。最后;以某种配置格式(YML、数组等)定义表单的“布局”,并扩展默认的 TWIG 表单渲染以遍历所述配置中定义的表单元素。

例如,荷兰和美国的地址配置为:

- NL-nl
- [firstname, infix, lastname]
- [street1, number]
- [postcode, city]
- EN-us
- [fullname]
- [street1]
- [street2]
- [city, state]
- [zip]

稍后我们将向此配置添加本地化标签、类、可选和必填字段等。

现在我们最大的问题是:把这个配置放在哪里?在 finishView 中使用一个简单的数组类(class)?将配置放在由需要本地化表单布局的表单类型解析的 YML 文件中?

遇到此问题的人提供的任何信息将不胜感激。

最佳答案

Later we'll add localized labels, classes, optional and mandatory fields, etc to this configuration.



The localized labels is automatic process可以根据用户的语言环境对它们进行翻译和转换。可以使用约束解决必填字段。

where to put this config?



在我看来,这应该直接进入实体和表单类型:

您可以创建一个 LocaleAddressType并根据当前的“区域设置”值添加这些字段,但首先,您需要有一个包含与“地址”方法相关的所有可能字段的实体。
LocaleAddress实体:
// src/AppBundle/Entity/LocaleAddress.php

use Symfony\Component\Validator\Constraints as Assert;

/**
* @ORM\Table()
* @ORM\Entity()
*/
class LocaleAddress
{
/**
* @var string
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string
*
* @Assert\NotBlank(groups={"nl-NL", ...})
* @ORM\Column(type="string", nullable=true)
*/
private $firstName;

// ...
}

包括所有可能的语言环境的所有不同字段,并使用 nullable=true 设置这些字段.另外,使用 NotBlank约束和 groups选项来验证每个区域设置的必填字段。

配置文件
# AppBundle/Resources/config/locale_address_form.yml
address_form:
nl-NL:
- [firstname, infix, lastname]
- [street1, number]
- [postcode, city]
en-US:
- [fullname]
- [street1]
- [street2]
- [city, state]
- [zip]

大院 LocaleAddressType根据 locale 添加一些字段选项,默认为 Locale::getDefault()
// src/AppBundle/Form/Type/LocaleAddressType.php

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(),
]);

// force that validation groups will equal to configured locale.
$resolver->setNormalizer('validation_groups', function (Options $options) {
return [$options['locale']];
});

$resolver->setAllowedTypes('locale', ['string']);

// pending validate the custom locale value.
}

private function loadLocaleFormConfig($locale)
{
$config = Yaml::parse(file_get_contents('path/to/locale_address_form.yml'));

return $config['address_form'][$locale];
}
}

注:提交时,验证字段对应于 locale值(value)。

注册表单类型:
# app/config/services.yml
services:
app.form.locale_address:
class: AppBundle\Form\Type\LocaleAddressType
tags:
- { name: form.type }

使用表格

现在,您可以使用 localeAddress 在其他表单中使用此表单类型。领域协会。
$build->add('localeAddress', LocaleAddressType::class);

当您的应用程序中的语言环境更改时 \Locale::setDefault这将影响要显示的表单字段。

为字段创建模板

I want to separate layout and localization (order, grouping, labels, translations, mandatory and optional fields) from the processing (PHP/SF) of the forms and the actual rendering (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。

关于forms - 如何本地化 Symfony2 表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com