2013-05-01 2 views
1

у меня есть поведение для моих моделей, поведение имеют beforeFind, BeforeSave, в методах я переопределить user_id, что-то вроде:Yii Поведение и сценарий

... 
public functio beforeSave() { 
    $this->owner->user_id = Yii::app()->user->id 
} 

У меня есть модель пользователя, как я могу отключить поведение для регистрации новый пользователь? Сохранение кода:

$user = new User(); 
$user->id = 1332; 
$user->field1 = 'data'; 
$user->save(); 

но сохранить у меня есть нуль в $ user-> идентификатор (потому что поведение работы). i попытался

$user->disableBehaviors(); 
$user->detachBehavior(); 

Безрезультатно.

Возможно, это не так? Я создаю поведение для идентификации пользователей в системе (найдите только пользователя, сохраните только с идентификатором пользователя ...), но если у меня появился новый пользователь с полными предигентами, я должен снова отключить поведение?

ответ

0

Вы можете проверить Yii :: app() - user-> isGuest, чтобы определить, вошел ли пользователь в систему или нет. или вы можете просто попытаться найти нуль. Как это:

if (!Yii::app()->user->isGuest) 
    $this->owner->user_id = Yii::app()->user->id; 

или

if (null !== Yii::app()->user->id) 
    $this->owner->user_id = Yii::app()->user->id; 
+0

Посмотрел, не универсальный, что, если у меня будет новая роль - администратор, я должен написать новую проверку, если это администратор. – Actimele

+0

Я сохраняю поля проверки в каждой модели, которые записывают имя пользователя и временную метку, а также изменение пользователя и метки времени при создании или изменении записи. Вместо написания кода для заполнения этих полей аудита в каждой модели я написал обработчик событий и привязал его к событию onBeforeSave в каждой модели в функции init(). Чтобы определить, была ли запись создана, я использовал $ model-> isNewRecord. Модель исходит из события, которое передается обработчику. – jmarkmurphy

1

Если условие может быть изменено в будущем я просто передать его в качестве параметра обратного вызова в поведении от модели.

Это дает вам немного больше контроля над состоянием. Следовательно, поведение становится более многоразовым - если оно используется несколькими моделями, это условие может быть уникальным для каждого.

Пример ниже немного упрощен, но вы должны получить эту идею.

Поведение:

class SomeBehavior extends CActiveRecordBehavior 
{ 
    public $trigger; 

    public function beforeSave($event) 
    { 
     if(!call_user_func($this->trigger)) 
      return; 

     // do what you need 
     $this->owner->user_id = Yii::app()->user->id; 

    } 
} 

Модель:

class SomeModel extends CActiveRecord 
{ 
    public function behaviors() 
    { 
     $me=$this; 

     return array(
      'some'=>array(
       'class'=>'SomeBehavior', 
       'trigger'=>function() use($me){ 
        return $me->scenario=='some-scenario'; 
       } 
      ) 
     ); 

    } 
} 

Также я использую PHP 5.3. Итак, я использую закрытие для trigger callback. Если ваша версия PHP меньше 5.3 - вместо нее можно использовать любое вызываемое слово. Проверьте здесь http://www.php.net/manual/en/function.is-callable.php

1

Из-за поведения это метод, вы можете объявить свою собственную логику внутри.

модели знает о его сценарии, так что нет никаких проблем, чтобы возвращать различные массивы для различных условий :)

Надеется, что это будет полезно для кого-то.

+0

Это не дает ответа на вопрос.Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – WebChemist

+0

Вы правы! Моя ошибка, извините. – johnComUa

Смежные вопросы