制作一个处理空值的Symfony2 NullDateType表单类型

时间:2017-01-09 11:36:40

标签: symfony symfony-forms

我想知道如何设计一个可重复使用的自定义表单类型,它包含两个单选按钮,用于指示值是否为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 %}

我有很多问题:

  • 因为我有两个不同的变量(值是null还是 不是(即单选按钮),以及实际数据字段(即日期字段)),我该如何处理它以便它们可以对一个表单变量进行操作并将其作为一个值返回?
  • 我使用正确的合成来支持几种可以为空的数据类型吗?

0 个答案:

没有答案