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

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

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

#1 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 28 May 2009 - 01:32 PM

есть в модели AR, к примеру,
public function rules() { return array('name'=>'required',); }

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

#2 User is offline   Zolter 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 377
  • Joined: 26-March 09

Posted 28 May 2009 - 05:03 PM

недумаю
0

#3 User is offline   jz 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 29-April 09

Posted 28 May 2009 - 07:53 PM

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

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

#4 User is offline   bio 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 07-May 09
  • Location:Ukraine

Posted 29 May 2009 - 02:40 PM

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

контроллер

модель


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

0

#5 User is offline   Zolter 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 377
  • Joined: 26-March 09

Posted 29 May 2009 - 02:45 PM

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

#6 User is offline   3an 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 15
  • Joined: 16-January 09

Posted 31 May 2009 - 01:15 AM

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


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

#7 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 01 June 2009 - 12:52 AM

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

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


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

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

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

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

#8 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 01 June 2009 - 12:58 AM

Quote

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





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


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

#9 User is offline   creocoder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 199
  • Joined: 09-March 09
  • Location:*.php

Posted 16 June 2009 - 04:54 PM

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

#10 User is offline   KJedi 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 381
  • Joined: 19-October 08
  • Location:Nikolaev, Ukraine (Europe)

Posted 20 June 2009 - 05:56 AM

Хм, а как насчет возвращать значение некоторого атрибута? Ведь rules() вызывается только когда идет метод validate().
С relations понятно, это может обрабатываться при инстанциировании класса, потому что БД - это на самая часто изменяющаяся вещь :)
0

#11 User is offline   creocoder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 199
  • Joined: 09-March 09
  • Location:*.php

Posted 20 June 2009 - 01:57 PM

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users