Изменение AR->rules() на "лету". Как?

есть в модели AR, к примеру,

public function rules() { return array('name'=>'required',); }

как, в евенте , к примеру, onBeforeValidate() изменить набор правил для проверки, возвращаемых функцией AR->rules(). То есть - есть ли способ, чтобы можно было бы изменить массив, возвращаемый функцией AR->rules() уже после определения класса AR.

недумаю

Хм… А для чего такое вообще могло понадобиться?

Если для различных сценариев проверки — то курим вот это: http://www.yiiframew…e/ru/form.model, внимание на раздел «Выполнение проверки».

есть такое понятие "сценарий", так вот в контроллере задаешь сценарий, и далее в rules добавляешь вызов "on", пример ниже:

контроллер

модель

в итоге проверка 'required' выполнится только для сценария 'create'.

to bio

понимаешь мы ж предполагаем что автор это уже знает и прочитал документацию по Yii. Следовательно скорее всего он хочет подключить какое то динамическое генерирование правил, отсюда у него и такие вопросы. ну это я так думаю, а так ждем автора, пусть пояснит что ему конкретно надо и для каких целей )

а если сделать примерно так?

Не делал, но набор правил сгенирируется на лету и выдастся для валидации именно он;

не знаю как объяснить в паре строк: делаю расширение для перевода "на лету" полей базы

В приложении есть куча моделей. В них объявляется, что некоторые поля могут при вводе/редактировании иметь ещё и другое значение (перевод).

например:в классе AR определяется, что поля name,description нужно переводить

тут же есть rules для валидации

потом в зависимости от  подключённых языков (locale) и полей для перевода (array $translated) , в форме редактирования записи появляются дополнительные вкладки с полями

translated[locale][name]

translated[locale][description]

За ввод/вывод полей для перевода отвечает "независимый" класс-модель ARTranslate.

Подключение к основным моделям через CActiveRecordbehavior. Который и перехватывает событие onAfterValidate, чтобы после проверки в основной модели AR, сделать проверку необходимых добавочных полей в ARTranslate.

То есть надо в ARTranslate прописать rules для некоторых полей, вытащив их из rules от AR. Но как rules присвоить уже после объявления класса?

Quote

а если сделать примерно так?

Не делал, но набор правил сгенирируется на лету и выдастся для валидации именно он;

спасибо, выглядит неплохо :) попробую…

Это не работает!!! Также как и изменение relations() на лету :( Есть только вариант со статическим свойством. Но это очень плохой вариант. Похоже придется использовать Doctrine.

Хм, а как насчет возвращать значение некоторого атрибута? Ведь rules() вызывается только когда идет метод validate().

С relations понятно, это может обрабатываться при инстанциировании класса, потому что БД - это на самая часто изменяющаяся вещь :)

Quote

С 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 ситуация сильно поправится.