Ранее я уже упоминал о переопределении одной из библиотек с целью избавления от index.php в URL при использовании url::redirect(). Сегодня, подготавливая проект для статьи о модуле Auth (да-да, на очереди аутентификация), столкнулся с небольшой проблемой.
Проблема
Не буду сильно вдаваться в подробности (они будут описаны в статье), просто скажу, что в модуле Auth поставляется модель Auth_User, у которой присутствует метод validate(). Он выполняет проверку введенных данных на соответствие следующим правилам (они описаны в теле модели и извне их не изменить):
/** * Validates and optionally saves a new user record from an array. * * @param array values to check * @param boolean save the record when validation succeeds * @return boolean */ public function validate(array & $array, $save = FALSE) { $array = Validation::factory($array) ->pre_filter('trim') ->add_rules('email', 'required', 'length[4,127]', 'valid::email') ->add_rules('username', 'required', 'length[4,32]', 'chars[a-zA-Z0-9_.]', array($this, 'username_exists')) ->add_rules('password', 'required', 'length[5,42]') ->add_rules('password_confirm', 'matches[password]'); |
Если вы читали статью в справочнике об объекте Validation (нет?! так прочтите ), то все должно быть понятно. Сперва данные фильтруются (функция trim() удаляет пробелы слева и справа в строке), далее добавляются правила:
- Адрес электронной почты должен присутствовать (required), быть от 4 до 127 символов длиной (length[4,127]), ну и быть собственно корректным электронным адресом (valid::email)
- Имя пользователя должно присутствовать, длина 4-32 символа, состоять из латинских букв, цифр, знака подчеркивания и точки (chars[a-zA-Z0-9_.]), плюс дополнительная проверка методом username_exists модели Auth_User.
- Пароль должен присутствовать, длина от 5 до 42 символов.
- Подтверждение пароля должно соответствовать паролю (естественно, нет смысла делать проверку длины и т.д.)
И если проблем со стандартными правилами нет, то username_exists ведет себя странно — существующие логины пропускает, а незанятые не дает зарегистрировать. Смотрим исходники:
/** * Tests if a username exists in the database. This can be used as a * Valdidation rule. * * @param mixed id to check * @return boolean */ public function username_exists($id) { return (bool) $this->db ->where($this->unique_key($id), $id) ->count_records($this->table_name); } |
Ошибку видите? Считаю до десяти и даю подсказку — какой будет результат, если количество записей (count_records()) будет равно нулю? Вот и я о том же. В итоге пришлось немного порыскать на форуме Kohana и выяснилось, что проблема известна, и в будущих версиях (2.4 и 2.3.2) она будет исправлена. Сейчас же остается только вручную вносить изменения, чем и займемся.
Лекарство
Единственный видимый мне способ (кроме правки непосредственно исходного файла) — копирование скрипта Auth_User.php в application/models и уже там править под себя. Т.е. мы будем использовать преимущества каскадной файловой системы (сперва класс смотрится в application, и только потом в modules). Вот какие мы внесем поправки:
// файл application/models/Auth_User.php // Строка 35. Вместо ->add_rules('username', 'required', 'length[4,32]', 'chars[a-zA-Z0-9_.]', array($this, 'username_exists')) // пишем ->add_rules('username', 'required', 'length[4,32]', 'chars[a-zA-Z0-9_.]', array($this, 'username_available')) // Строка 124. Заменяем метод username_exists на свой метод username_available: public function username_available($id) { return !$this->db ->where($this->unique_key($id), $id) ->count_records($this->table_name); } |
Сохраняем, проверяем. Теперь все тип-топ.
Постскриптум
Подобные сырости встречаются, поэтому я и решил создать для них отдельную рубрику «Напильник». До встречи!
Комментарии (0)
Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.