我想知道如何设计一个可重复使用的自定义表单类型,它包含两个单选按钮,用于指示值是否为NULL
,以及一个包含非数据的实际字段选中NULL单选按钮。例如,该字段可以是<input type="date">
。
因此,如果数据值为NULL,则应选择第一个单选按钮,并禁用实际字段。如果值为非NULL,则应选择第二个单选按钮,非NULL值可以表示日期(给定UNIX时间戳)。
在HTML中,它看起来像这样:
<div class="input-group">
<span class="input-group-addon">
<input type="radio" name="expiration_nullnonnull" value="_null" checked="checked" />
</span>
<span class="form-control">never</span>
</div>
<div class="input-group">
<span class="input-group-addon">
<input type="radio" name="expiration_nullnonnull" value="_nonnull" />
</span>
<input type="date" name="expiration" disabled="disabled">
</div>
现在我创建了NullType
,看起来像这样:
<?php
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
class NullType extends AbstractType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'null_value' => '_null',
'null_label' => 'unknown',
'nonnull_value' => '_nonnull',
'nonnull_widget' => 'nonnull_widget',
]);
}
public function buildView(FormView $view, FormInterface $form, array $options) {
$view->vars['null_value'] = $options['null_value'];
$view->vars['null_label'] = $options['null_label'];
$view->vars['null_checked'] = null === $form->getViewData();
$view->vars['nonnull_value'] = $options['nonnull_value'];
$view->vars['nonnull_widget'] = $options['nonnull_widget'];
}
public function getParent() {
return FormType::class;
}
}
现在,对于我想要一个可以为空的变体的每种数据类型,我创建了一个这样的特定类型,NullDateType
例如:
<?php
namespace AppBundle\Form\Type;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class NullDateType extends NullType {
public function configureOptions(OptionsResolver $resolver) {
parent::configureOptions($resolver);
$resolver->setDefaults([
'nonnull_widget' => 'nonnull_date_widget',
]);
}
public function getParent() {
return NullType::class;
}
}
我的自定义fields.html.twig
如下所示:
{% block null_widget %}
{% spaceless %}
<div class="input-group m-b-xs">
<span class="input-group-addon">
<input type="radio" {{ block('widget_attributes') }} value="{{ null_value }}"{% if null_checked %} checked="checked"{% endif %} />
</span>
<label class="form-control" for="{{ id }}">{{ null_label }}</label>
</div>
<div class="input-group">
<span class="input-group-addon">
<input type="radio" {{ block('widget_attributes') }} value="{{ nonnull_value }}"{% if not null_checked %} checked="checked"{% endif %} />
</span>
{{ block(nonnull_widget) }}
</div>
{% endspaceless %}
{% endblock %}
{% block nonnull_widget %}
{{ block('form_widget_simple') }}
{% endblock %}
{% block nonnull_date_widget %}
{% set widget = 'single_text' %}
{% set type = 'date' %}
{{ block('date_widget') }}
{% endblock %}
我有很多问题: