Может быть эта форма сообщения поможет вам:
Поставь код
sfValidatorBase::setDefaultMessage('required', 'Field required');
в "конфигурации" вашей конфигурации приложения apps/youApp/config/yourAppConfiguration.class.php
.
Таким образом, вы сможете установить значение по умолчанию для каждого типа сообщения об ошибке.
Если вы хотите установить определенные сообщения об ошибках для определенных полей, подумайте о том, чтобы создать класс формы, который определяет все это, и пусть все другие формы наследуются от этого.
Затем подклассы только определяют, какие поля должны отображаться (и, возможно, настраиваемую логику проверки).
Пример того, как это сделать, можно найти в главе Admin Generator книги Symfony.
Это самый чистый подход ИМХО.
Edit:
Если вы хотите оставить поля пустыми, вы должны добавить опцию required => false
:
'email' => new sfValidatorEmail(array('required' => false))
Относительно сообщения об ошибке: Похоже, что urlres
помечен как уникальный в таблице базы данных, и значение уже существует. Возможно, вам следует проверить определение схемы базы данных.
Редактировать 2:
Чтобы проверить и длину, и уникальность, вы должны использовать sfValidatorAnd
и sfValidatorDoctrineUnique
:
$this->setValidator('urlres', new sfValidatorAnd(
array(
new sfValidatorString(
array( 'min_length' => 6, ),
array( 'required' => 'Required field',
'min_length' => 'URL must be at least %min_length% chars long.' )
),
new sfValidatorDoctrineUnique(
array( 'model' => 'yourModel',
'column' => 'theColumn',
'primary_key' => 'thePrimaryKeyColumn',
'throw_global_error' => false),
array('invalid' => "That URL already exists")
)
));
Кроме того, использование вами кода ошибки invalid
в валидаторе строк некорректно. Вы устанавливаете недопустимое сообщение на
URL exists
, но как может string validator узнать это ? Он только проверяет, соответствует ли данная строка критериям min_length
, max_length
или нет.
Кстати, я предположил, что вы используете Doctrine, но я думаю, что те же валидаторы доступны для Propel.
Редактировать 3:
Установите опцию 'throw_global_error' => false
. Но я не уверен, что это работает.
Вы также можете взглянуть на исходный код , если он вам поможет.