Вполне ожидаемая гадость от Db_NoRecordExists и как с ней бороться

Dec 27, 2011 16:14

Всем привет!

Сейчас я расскажу вам, о работе с валидаторами типа Db_NoRecordExists.

Мной они применяются для работы с учётками.

В случае регистрации новой учётки все просто: в конфиге формы для уникальных полей вроде логин или email прописывается:

Db_NoRecordExists

users
login

Указанный в файле конфигурации валидатор типа Db_NoRecordExists не позволяют создать учётку с дублирующимися логином.

В коде контроллера пишется

$Users = new App_Model_Users();
$FormConfig = new Zend_Config_XML('Form.xml');
$Form = new Zend_Form($FormConfig);
if ($this->getRequest()->isPost()) {
if ($Form->isValid($this->getRequest()->getPost())) {
if ($Users->addUser($UserSettingsForm->getValues())) {
// все ок
} else {
// ошибка при создании учётки
};
} else
// неправильно введённые данные
}

Всё хорошо при регистрации нового пользователя, но возникает сложность в форме для изменении данных уже существующей учётки.

Вот у тебя есть форма, где пользователь может поменять, логин, e-mail, имя и т.п.
Для того, чтобы логин и e-mail были уникальными в системе, опять используется валидатор Db_NoRecordExists, но если пользователь решил оставить свой логин без изменений, а поменять только имя, то мерзкий валидатор всё равно выдаст сообщение об ошибке.

Для того, чтобы валидатор не "ругался" на уже существующий логин, можно после создания формы, разбавить код контроллера след. строками:

$Users = new App_Model_Users();
$UserID = $Users->getCurrentUserID();
$Form->login->getValidator('Db_NoRecordExists')->setExclude(array('field' => 'user_id', 'value' => $UserID));

Теперь валидатор будет игнорировать совпадения логинов, e-mail'ов для записи с user_id='$UserID'.

После этого пользователь может успешно изменять данные своей учётки.

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

Пользуйтесь на здоровье.

zend framework, Хозяйке на заметку

Previous post Next post
Up