public function rules() { return array('name'=>'required',); }
как, в евенте , к примеру, onBeforeValidate() изменить набор правил для проверки, возвращаемых функцией AR->rules(). То есть - есть ли способ, чтобы можно было бы изменить массив, возвращаемый функцией AR->rules() уже после определения класса AR.
понимаешь мы ж предполагаем что автор это уже знает и прочитал документацию по Yii. Следовательно скорее всего он хочет подключить какое то динамическое генерирование правил, отсюда у него и такие вопросы. ну это я так думаю, а так ждем автора, пусть пояснит что ему конкретно надо и для каких целей )
не знаю как объяснить в паре строк: делаю расширение для перевода "на лету" полей базы
В приложении есть куча моделей. В них объявляется, что некоторые поля могут при вводе/редактировании иметь ещё и другое значение (перевод).
например:в классе AR определяется, что поля name,description нужно переводить
тут же есть rules для валидации
потом в зависимости от подключённых языков (locale) и полей для перевода (array $translated) , в форме редактирования записи появляются дополнительные вкладки с полями
translated[locale][name]
translated[locale][description]
За ввод/вывод полей для перевода отвечает "независимый" класс-модель ARTranslate.
Подключение к основным моделям через CActiveRecordbehavior. Который и перехватывает событие onAfterValidate, чтобы после проверки в основной модели AR, сделать проверку необходимых добавочных полей в ARTranslate.
То есть надо в ARTranslate прописать rules для некоторых полей, вытащив их из rules от AR. Но как rules присвоить уже после объявления класса?
Это не работает!!! Также как и изменение relations() на лету Есть только вариант со статическим свойством. Но это очень плохой вариант. Похоже придется использовать Doctrine.
С relations понятно, это может обрабатываться при инстанциировании класса, потому что БД - это на самая часто изменяющаяся вещь
Хотелось бы конечно иметь возможность добавлять связи на лету скажем методом addRelation(), как во "взрослых" библиотеках. У меня есть для этого behavior, но он очень похож на хак. Кому интересно могу написать.
Что касается динамических rules() из разговора с qiang стало понятно, что такой функционал планируется в версии 1.1. Метод приведенный duke1999 не работает. Вот рабочий метод:
class Example extends CActiveRecord
{
protected $_rules = array();
private $_validators;
public function addRule($rule)
{
$this->_rules[] = $rule;
}
public function getValidators()
{
if (!$this->_validators)
$this->_validators = $this->createValidators();
return $this->_validators;
}
}
Этот метод работает, хотя это конечно "костыли" к текущей, надо признать не самой лучшей реализации CActiveRecord, которая к сожалению не позволяет писать более менее серьезные behavior без вот таких "костылей" и хаков. Детальный разбор реализации библиотеки показал, что многое там сделано с точки зрения скорости, а не будущих для неё расширений. Но буду надеяться, что в 1.1 ситуация сильно поправится.