logity
(Logity)
1
В мануале по 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' );
может кто уже сталкивался с такой проблемой?
KJedi
(Konstantin Mirin)
2
Проблема в таком виде как у тебя не решается.
Можно сделать так.
В виде сделать
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). Почему не положить поля профиля в таблицу юзера и не избавиться от головняка?
logity
(Logity)
3
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 можно ведь все в одну таблицу запихать.
Вообще предложенный вариант я тоже пробовал и это работает, но коряво и вот это действительно геморой. Хотелось более гибкого решения
3an
(Zap Aibulatov)
4
Точно не уверен, но ты сможешь обращаться к модели профиля если укажешь отношение HAS_ONE в модель пользователя.
Должно выглядеть примерно так
Users.php
class Users extends CWidget{
public function relations(){
array(
'profile'=>array(HAS_ON,'profile','userId')
)
}
}
а во Viewer'e ты будешь обращаться к ним как
User->profile->someAttribute;
Повоторюсь точно не уверен, но попробуй
logity
(Logity)
5
В этом то и загвоздка, я тоже так думал. Но на деле отношения не подгружаются просто так
public function relations(){
array(
'profile'=>array(HAS_ON,'profile','userId')
)
}
т.е. если мы используем User::model()->with('profile')->find* как нибудь при выполнении find* отношения подгрузяться. А так не хотят…
logity
(Logity)
6
В общем пока я пришел к такому заключению
$user = new User ( );
$user->profile = new Profile();
по-моему самое простое решение
3an
(Zap Aibulatov)
7
оно вроде бы сразу должно подгрузиться)
logity
(Logity)
8
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 ();