Настройка ошибок symfony

Есть ли в Symfony «лучшая практика» для настройки ошибок формы? Например, если бы я хотел показать «Campo obligatorio», когда поле обязательно.

1) Как я могу сделать это лучше и независимо от того, какие формы это называют? 2) Как я могу настроить сообщение «Объект с таким же «% namefield» уже существует». ?

Спасибо

обновлено

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

$this->setValidator('urlres', new sfValidatorString(array(
                          'min_length' => 6,
                        ), array(
                          'min_length' => 'URL must be longer',
                          'required'   => 'Required field',
                          'invalid' => 'URL exist'
                        )));

печатает мне: * Объект с таким же «urlres» уже существует.

обновлено Феликс, ваше решение просто фантастическое, но оно выводит мне эту ошибку: "urlres: этот URL уже существует"

Есть ли способ удалить «поле:» ??

Спасибо


person nebur85    schedule 18.01.2010    source источник


Ответы (3)


Возможно, вам поможет эта форма:

Введите код

sfValidatorBase::setDefaultMessage('required', 'Field required');

в «конфигурации» вашей конфигурации приложения apps/youApp/config/yourAppConfiguration.class.php.

Таким образом вы сможете установить значение по умолчанию для каждого типа сообщения об ошибке.


Если вы хотите установить определенные сообщения об ошибках для определенных полей, подумайте о создании класса формы, который определяет все это и позволяет всем другим формам наследоваться от этого.
Затем подклассы определяют только, какие поля должны отображаться (и, возможно, пользовательские логика проверки).

Вы можете найти пример того, как это сделать, в главе Генератор администрирования. из книги Symfony.

Это самый чистый подход ИМХО.


Изменить:

Если вы хотите оставить поля пустыми, вам нужно добавить опцию 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 может это узнать? Он только проверяет, соответствует ли данная строка критериям min_length, max_length или нет.

Кстати, я предполагал, что вы используете Doctrine, но я думаю, что те же валидаторы доступны для Propel.


Изменить 3.
Установите параметр 'throw_global_error' => false. Но я не уверен, что это работает.

Вы также можете ознакомиться с исходный код, если он вам поможет.

person Felix Kling    schedule 19.01.2010
comment
Спасибо, Феликс, он отлично работает, и это чистый метод делать то, что я хочу. Можете ли вы помочь мне с тем, что объект с такими же URL-адресами уже существует. ошибка? какой тип ошибки я должен поймать, чтобы настроить это сообщение об ошибке? большое спасибо. - person nebur85; 20.01.2010
comment
И еще вопрос... возможно ли валидировать поле, только если оно заполнено? В моей форме я мог бы заполнить адрес электронной почты или номер телефона... но для проверки адреса электронной почты мне нужно назначить sfValidatorEmail для поля электронной почты... если я это сделаю, они вызовут "недопустимую" ошибку... - person nebur85; 20.01.2010
comment
да Феликс, уникален. поэтому я должен прочитать перед вставкой, чтобы показать пользовательскую ошибку? Благодарность - person nebur85; 20.01.2010
comment
спасибо, Феликс, все работает отлично :) он печатает мне этот URL-адрес ошибки: этот URL-адрес уже существует, есть ли способ показать только сообщение об ошибке без поля ..? - person nebur85; 21.01.2010

Позвольте мне попытаться помочь вам. Вы можете легко настроить стандартные ошибки формы в методе configure вашего класса формы. Вот пример: 1)

<?php
   class myForm extends BaseMyForm
      public function configure(){
         parent::configure();
         $this->setValidator(
            'my_field' => new sfValidatorString(
               array('min_length'=>3, 'max_length'=>32, 'required'=>true),
               array('required' => 'Hey, this field is required!')
            )
         );
      }

2) Просто измените сообщение с кодом «недействительно».

Все, что вам нужно, это просто найти действительный код сообщения, чтобы настроить определенные сообщения по умолчанию. Дополнительная информация — Формы Symfony в действии: Глава 2 — Проверка формы< /а>

Обновлено:

И если вы не хотите настраивать сообщения об ошибках во всех ваших классах форм, просто создайте свой собственный базовый класс валидатора:

abstract class myBaseValidator extends sfValidatorBase

и там переопределить «обязательные» и «недопустимые» сообщения по умолчанию.

person Darmen Amanbayev    schedule 18.01.2010
comment
DArmen, спасибо, но я пытаюсь сказать... возможно, в проекте у вас есть более одной формы из одного и того же объекта/объекта или, возможно, во всех объектах/объектах вы хотите показать сообщение "вы должны ввести поле". Возможно ли написать «ошибки по умолчанию» только в одном месте? Я попробую «недопустимую» ошибку и надеюсь, что это сработает :) спасибо, Дармен. - person nebur85; 19.01.2010
comment
Я вижу в других проектах, что они создают класс, а внутри определяют текстовые ошибки. Так они могут это сделать, но... есть другой способ? - person nebur85; 19.01.2010
comment
@Darmen: ВЫ ДЕЛАЕТЕ ЭТО НЕПРАВИЛЬНО - обнаружено жесткое кодирование - person Andrei Dziahel; 19.01.2010
comment
@Develop7, да, я знаю, мой плохой. Просто хотел показать схематично - person Darmen Amanbayev; 20.01.2010
comment
Создание пользовательского базового валидатора для установки сообщений required, invalid по умолчанию действительно не нужно (если даже не неправильно), так как вы можете установить значение по умолчанию, например. sfValidatorBase::setDefaultMessage('required', 'Field required'); - person Felix Kling; 20.01.2010

Есть ли способ удалить «поле:» ??

Да: throw_global_error => true

person srus    schedule 14.09.2010