2 в 1 create и update в edit

В мануале по Yii в разлеле формы для создания пользователя делаются следующие действия



$user = new User ( );


// соответвенно в виде


echo CHtml::activeLabel ( $user, name );


а для обновления запись загржается



$user = $this->loadUser ();


Но что если я хочу в этой форме вывести профайл пользователя в случае обновления все работает в loadUser добавится with



User::model()->with( 'profile')->findByPk($userId); 


// в виде


echo CHtml::activeLabel ( $user->profile, 'photo' );


а вот с добавлением так не выходит т.е. with используется в связке с find* А искать мне нечего

$user = new User ( )->with( 'profile');

И фактически в вид передается User без related полей и такой номер уже не проходит



echo CHtml::activeLabel ( $user->profile, 'photo' );


может кто уже сталкивался с такой проблемой?

Проблема в таком виде как у тебя не решается.

Можно сделать так.

В виде сделать

if (empty($profileModel)) $profileModel = $user->profile;

Для всех полей профиля делать:

echo CHtml::activeLabel ( $profileModel, 'photo' );

В действии так:

if (/is new record/)

{

$profileModel = new Profile();

}

$this->render('profile', array('user' => $user, 'profileModel' => $profileModel));

А вообще-то странно как-то. Зачем тебе связь 1:1? (User - Profile). Почему не положить поля профиля в таблицу юзера и не избавиться от головняка?

Quote

Проблема в таком виде как у тебя не решается.

Можно сделать так.

В виде сделать

if (empty($profileModel)) $profileModel = $user->profile;

Для всех полей профиля делать:

echo CHtml::activeLabel ( $profileModel, 'photo' );

В действии так:

if (/is new record/)

{

$profileModel = new Profile();

}

$this->render('profile', array('user' => $user, 'profileModel' => $profileModel));

А вообще-то странно как-то. Зачем тебе связь 1:1? (User - Profile). Почему не положить поля профиля в таблицу юзера и не избавиться от головняка?

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

Вообще предложенный вариант я тоже пробовал и это работает, но коряво и вот это действительно геморой. Хотелось более гибкого решения

Точно не уверен, но ты сможешь обращаться к модели профиля если укажешь отношение HAS_ONE  в модель пользователя.

Должно выглядеть примерно так

Users.php



class Users extends CWidget{


    public function relations(){


         array(


             'profile'=>array(HAS_ON,'profile','userId')


         )


    }


}


а во Viewer'e ты будешь обращаться к ним как

User->profile->someAttribute;

Повоторюсь точно не уверен, но попробуй

В этом то и загвоздка, я тоже так думал. Но на деле отношения не подгружаются просто так



 public function relations(){


         array(


             'profile'=>array(HAS_ON,'profile','userId')


         )


    }


т.е. если мы используем User::model()->with('profile')->find* как нибудь при выполнении find* отношения подгрузяться. А так не хотят…

В общем пока я пришел к такому заключению



$user = new User ( );


$user->profile = new Profile();


по-моему самое простое решение

оно вроде бы сразу должно подгрузиться)



public function getRelated($name, $refresh = false) {


		if (! $refresh && (isset ( $this->_related [$name] ) || array_key_exists ( $name, $this->_related )))


			return $this->_related [$name];


		


		$md = $this->getMetaData ();


		if (isset ( $md->relations [$name] )) {


			Yii::trace ( 'lazy loading ' . get_class ( $this ) . '.' . $name, 'system.db.ar.CActiveRecord' );


			$relation = $md->relations [$name];


			if ($this->getIsNewRecord () && ($relation instanceof CHasOneRelation || $relation instanceof CHasManyRelation))


				return $this->_related [$name] = $relation instanceof CHasOneRelation ? null : array ();


			if (! empty ( $relation->with )) {


				$r = array ($name );


				foreach ( $relation->with as $w )


					$r [] = $name . '.' . $w;


			} else


				$r = $name;


			$finder = new CActiveFinder ( $this, $r );


			$finder->lazyFind ( $this );


			return isset ( $this->_related [$name] ) ? $this->_related [$name] : $this->_related [$name] = null;


		} else


			throw new CDbException ( Yii::t ( 'yii', '{class} does not have relation "{name}".', array ('{class}' => get_class ( $this ), '{name}' => $name ) ) );


	}


Т.е. будет подгружаться



$finder = new CActiveFinder ( $this, $r );


$finder->lazyFind ( $this );


А искать нечего… запись новая

В случае отношения HAS_ONE (чуть выше обсуждалось) вообще вернется NULL



			if ($this->getIsNewRecord () && ($relation instanceof CHasOneRelation || $relation instanceof CHasManyRelation))


				return $this->_related [$name] = $relation instanceof CHasOneRelation ? null : array ();