CakePHP - проверка может быть пустой, но если не пустой, должно быть не менее 4 символов и числовых

Как создать правило проверки, которое позволяет пустому поле, но если это не так, оно должно быть числовым и длиной 4 символа?

Это то, что у меня есть сейчас

'year' => array(
        'numeric' => array(
            'rule' => 'numeric',
            'message' => 'Numbers only'
        ),
        'maxLength' => array(
            'rule' => array('maxLength', 4),
            'message' => 'Year in YYYY format'
        ),
        'minLength' => array(
            'rule' => array('minLength', 4),
            'message' => 'Year in YYYY format'
        )
    )

Это отлично работает, но когда поле пусто, оно все равно выполняет проверку.

Спасибо,
Тройник

Ответ 1

Следующий фрагмент должен сделать трюк:

'numeric' => array(
    'rule' => 'numeric',
    'allowEmpty' => true,
    'message' => 'Numbers only'
),

См. также главу проверка данных в кулинарной книге.

Ответ 3

Атрибут 'last' должен идти = > в false. Поэтому окончательное решение должно выглядеть так:

'year' => array(  
    'numeric' => array(  
    'rule' => 'numeric',  
    'allowEmpty' => true,  
    'message' => 'Numbers only'  
    'last' => false   ), ...

Мне лично нравится отделять вещи (более читабельность и проще в отладке):

'year' => array(  
    'allowEmpty' => array(  
    'allowEmpty'=>true,  
    'last'=>false   ),   'numeric'=> array(  
    'rule' =>'numeric',  
    'message' => 'Numbers only'  
),...   )

Ответ 4

'numeric' => array(
    'rule' => 'numeric',
    'message' => 'Numbers only'
),
'maxLength' => array(
    'rule' => array('maxLength', 10),
    'message' => '10 digit no'
)

Ответ 5

Есть способ сделать это просто

    array(
        'myfield' => array(
            "rule_empty" => array(
                    'rule' =>  '#.*#i',  // validate everything
                    'allowEmpty' => true,
                    'last' => false
                ),
            "rule_price" => array(
                'message' => 'Is not a valid price ! ',
                'rule' => "\/^[0-9]+(?:(\\.|,)[0-9]{1,})?$\/"
            )
        )
    );