Как эффективно установить сообщения об ошибках по умолчанию для sfValidatorInteger и т. Д.?

Я просто столкнулся с проблемой, которая, как я полагаю, является какой-то «ошибкой» фреймворка Symfony: я хочу установить сообщения об ошибках по умолчанию для различных типов валидаторов (например, sfValidatorInteger). Для этого внутри моего ProjectConfiguration::setup метода у меня есть:

sfValidatorBase::setDefaultMessage('required', 'Erforderlich.');
sfValidatorBase::setDefaultMessage('invalid', 'Format ungültig.');
sfValidatorInteger::setDefaultMessage('invalid', '"%value%" ist keine Ganzzahl.');

Это отлично работает для sfValidatorBase, но не для, например, sfValidatorInteger. sfValidatorInteger по-прежнему показывает предустановленное сообщение по умолчанию '"%value% is not an integer.'.

Итак, я взглянул на реализацию sfValidatorInteger::configure и выяснил, что он устанавливает жестко запрограммированные сообщения об ошибках экземпляра:

protected function configure($options = array(), $messages = array())
{
  $this->addMessage('max', '"%value%" must be at most %max%.');
  $this->addMessage('min', '"%value%" must be at least %min%.');

  $this->addOption('min');
  $this->addOption('max');

  $this->setMessage('invalid', '"%value%" is not an integer.');
}

Я ожидал, что сообщения об ошибках читаются из карты сообщений по умолчанию, но, очевидно, это не так.

Итак, как я могу решить эту проблему чисто, желательно, не касаясь исходного кода Symfony (поскольку мои изменения могут быть перезаписаны во время будущих обновлений)? Должен ли я получить все классы валидатора, чтобы обеспечить подходящую configure реализацию? Я так не думаю. Установка сообщений об ошибках для каждого экземпляра валидатора отдельно также не будет (чистой) опцией.

Может, я что-то не так понял в настройке валидаторов. Тогда возникает более общий вопрос: как установить сообщения об ошибках по умолчанию для различных классов валидаторов, таких как 'invalid' => '"%value%" ist keine Ganzzahl.' для sfValidatorInteger?

Заранее спасибо,
Флинш.


person Flinsch    schedule 31.01.2011    source источник


Ответы (2)


Я бы создал свои собственные валидаторы, расширяющие стандартные валидаторы Symfony, и использовал их.

person Jan    schedule 02.02.2011
comment
Спасибо! Это действительно то, что я сделал сейчас. Поскольку я использую всего несколько различных валидаторов, усилия окупились. Дополнительное преимущество: я могу обычно настраивать их в классе, а не по экземплярам с моими любимыми настройками. - person Flinsch; 03.02.2011

Я думаю, вы могли бы сделать это с помощью файла перевода xliff.

<source>"%value%" is not an integer.</source>
<target>"%value%" n'est pas un entier.</target>
person greg0ire    schedule 31.01.2011
comment
Спасибо за ваше предложение. Куда мне поместить этот конкретный xliff-файл? Насколько я понимаю, перевод xliff требует использования __("String to be translated") для работы. Но внутри sfValidatorInteger нет __(). - person Flinsch; 02.02.2011
comment
Я видел несколько вызовов для перевода в sfWidgetFormSchemaFormatter, вызывающих ошибки, так что я думаю, это все равно должно сработать. Вы должны поместить этот файл в папку i18n вашего приложения. (apps/yourApp/i18n) - person greg0ire; 02.02.2011
comment
Я не мог понять, как это реализовать. Эти файлы xliff для конкретных приложений, похоже, работают только для моего собственного использования __(), а не для файлов из других библиотек. Кроме того, мне пришлось бы создать несколько файлов xliff, по одному для каждого приложения. На мой взгляд, это не чистый способ. Но я благодарю вас. В любом случае ваш совет был полезен. - person Flinsch; 03.02.2011