symfony2表单日期小部件年份验证

时间:2016-06-23 09:32:30

标签: php forms validation symfony date

我将此配置用于表单日期窗口小部件:

$builder->add('birthdate', DateType::class, array(
    'widget' => 'single_text',
    'html5' => false,
    'format' => $dateFormat,
    'attr' => array(
        'data-mask' => $this->i18n->getDataMaskFromDateFormat($dateFormat)
    ),
    'label' => $dateFormat
));

但是,1234-05-06之类的日期是有效的。有没有办法指定年份范围的验证,以便只有特定范围之间的日期才有效?

最佳基督徒

更新

验证文件

路径FooBundle \ Resources \ config \ validation \ Foo \ Bar.yml

FooBundle\Model\Foo\Bar\Bar:
    constraints:
        - Propel\PropelBundle\Validator\Constraints\UniqueObject:
            fields:  email
            message: messages.email_exists
    properties:
        name:
            - NotNull:
                message : messages.null
        email:
            - NotNull:
                message : messages.null
            - Email:
                message : messages.invalid_email
        plainPassword:
            - NotBlank:
                message : messages.null
        birthdate:
            - NotBlank:
                message : messages.null
            - Date:
                message: messages.invalid_date
            - GreaterThan: -100 years

正确加载文件,因为其他约束正在成功验证模型。唯一的问题是,GreaterThan不起作用。

我认为,它不起作用,因为symfony正在检查值是\ DateTime的一个实例,这对于#34; 1987这样的字符串是错误的(但我不太确定) -09-01&#34 ;.但也许我错了。

2 个答案:

答案 0 :(得分:0)

所以你可以使用Validator Constraint(http://symfony.com/blog/new-in-symfony-2-6-date-support-for-validator-constraints):

<!-- src/AppBundle/Resources/config/validation.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="AppBundle\Entity\YourEntity">
        <property name="date">
            <constraint name="GreaterThanOrEqual">-100 years</constraint>
        </property>
    </class>
</constraint-mapping>

XML:

# src/AppBundle/Resources/config/validation.yml
AppBundle\Entity\YourEntity:
    properties:
        date:
            - GreaterThanOrEqual: -100 years

YML:

$select = db_select('{emp}', 'e');
$select -> addField('e', 'name', 'name');
$select -> addField('e', 'date', 'date');
$select -> condition('e.name', $name);
$select->where('date >= DATE_SUB(NOW(), INTERVAL 1 HOUR)');
$select -> orderBy('e.date', 'DESC')->range(0,1);
$subresult = $select -> execute()-> fetchObject();

答案 1 :(得分:0)

我最终建立了自己的验证器:

public function validate($value, Constraint $constraint)
{
    $date = new \DateTime($value);
    $today = new \DateTime('today');
    $past = new \DateTime('-100 years');

    if ($date < $past || $date > $today) {
        $this->context->buildViolation($constraint->message)->addViolation();
    }
}