2 回答
TA贡献1795条经验 获得超7个赞
以下内容适用于 Symfony 5.0.x(尽管 3.4 不需要进行重大更改,可能只需要一些额外的配置):
要抽象主题处理,请定义您自己的复选框类型,如下(例如):
<?php
declare(strict_types=1);
namespace App\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ThemedCheckboxType extends AbstractType
{
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver
->setDefaults([
'theme' => 'default',
'block_prefix' => static function (Options $options): ?string {
return [
'default' => null,
'theme-a' => 'theme_a_checkbox',
'theme-b' => 'theme_b_checkbox',
][$options['theme']];
},
])
->setAllowedValues('theme', ['default', 'theme-a', 'theme-b']);
}
/**
* @inheritDoc
*/
public function getParent(): string
{
return CheckboxType::class;
}
}
然后在需要的地方简单地使用它,例如:
$builder->add('test_a1', ThemedCheckboxType::class, [
'theme' => 'theme-a', // or others
]);
这样,您可以注入自己的表单主题,在需要时直接操作复选框,例如
{% block theme_a_checkbox_widget %}
<em>Theme-A</em>
{{ block('checkbox_widget') }}
{% endblock %}
{% block theme_b_checkbox_widget %}
<em>Theme-B</em>
{{ block('checkbox_widget') }}
{% endblock %}
如果您不想使用额外的表单类型,可以使用自定义表单扩展来为默认复选框类型添加选项来实现同样的效果。请参阅: https: //symfony.com/doc/current/form/create_form_type_extension.html
例如:
<?php
declare(strict_types=1);
namespace App\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CheckboxTypeExtension extends AbstractTypeExtension
{
/**
* @inheritDoc
*/
public static function getExtendedTypes(): iterable
{
return [CheckboxType::class];
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver
->setDefaults([
'theme' => 'default',
'block_prefix' => static function (Options $options): ?string {
return [
'default' => null,
'theme-a' => 'theme_a_checkbox',
'theme-b' => 'theme_b_checkbox',
][$options['theme']];
},
])
->setAllowedValues('theme', ['default', 'theme-a', 'theme-b']);
}
}
这允许:
$builder->add('test_a1', CheckboxType::class, [
'theme' => 'theme-a',
]);
TA贡献1853条经验 获得超9个赞
您可以将主题应用于单个复选框:
{% form_theme form.my_special_checkbox 'Form/Theme/special_checkbox.html.twig' %}
或者,如果您不需要单独的主题(单个用例),您可以在当前 Twig 文件中编写块:
{% block _my_checkbox_widget_block %} {# the theme #} {% endblock %} {% form_theme form.my_special_checkbox _self %}
我会使用自定义块名称创建自定义复选框组件并将其放入全局表单主题中,以便我可以在整个应用程序中重用它。
- 2 回答
- 0 关注
- 127 浏览
添加回答
举报