Я предполагаю, что вы просто хотите добавить новый валидатор, а не выдавать sfValidatorError (особенно если sfValidatorError должен иметь ссылку на sfValidator, который его выбросил)
к сожалению, у меня нет среды для тестирования этих фрагментов кода, но они дадут вам общие понятия.
сначала: создайте свой класс валидатора
class timestampIsNotEvenValidator extends sfValidatorBase {
protected function doClean($value) {
if(strtotime('now') % 2){
throw new sfValidatorError($this, 'timestamp is not even');
}
return $value; //this return is critical!
}
}
затем: добавьте валидатор к вашей форме (но лучше сделайте это в методе настройки форм):
protected function processForm(sfWebRequest $request, sfForm $form)
{
$form->mergePostValidator(new timestampIsNotEvenValidator());
$form->bind(...);
if ($form->isValid()) { //false if timestampIsNotEventValidator throwed sfValidatorError
}
затем вы можете отобразить глобальные ошибки (генерируемые пост-валидатором) в вашем шаблоне, вызвав
//indexSuccess.php
$form->renderGlobalErrors();
или если вы хотите связать ошибку с конкретным полем вашей формы (например, еслиу вас есть тип «поля» в вашей форме, и вы хотите, чтобы ошибка, выдаваемая глобальным валидатором, отображалась как ошибка «поля», а не глобальная) вы можете изменить свой валидатор:
//i dont know if following solution is the best one there is, but it works
class timestampIsNotEvenValidator extends sfValidatorBase {
protected function doClean($value) {
if(strtotime('now') % 2){
throw new sfValidatorErrorSchema($this, array(
'field' => new sfValidatorError($this, 'timestamp is not even')
));
}
return $value; //this return is critical!
}
}
и для справки - после валидатораполучит массив значений всех полей формы в качестве аргумента $ value в чистом методе.