Yii Framework Forum: 2 в 1 create и update в edit - Yii Framework Forum

Jump to content

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

2 в 1 create и update в edit Rate Topic: -----

#1 User is offline   logity 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 07-May 09

Posted 07 May 2009 - 05:11 AM

В мануале по 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' );


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

0

#2 User is offline   KJedi 

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

Posted 07 May 2009 - 05:20 AM

Проблема в таком виде как у тебя не решается.
Можно сделать так.
В виде сделать
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). Почему не положить поля профиля в таблицу юзера и не избавиться от головняка?
0

#3 User is offline   logity 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 07-May 09

Posted 07 May 2009 - 07:50 AM

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 можно ведь все в одну таблицу запихать.

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

#4 User is offline   3an 

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

Posted 07 May 2009 - 08:18 AM

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

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

Users.php

class Users extends CWidget{
    public function relations(){
        array(
            'profile'=>array(HAS_ON,'profile','userId')
        )
    }
}


а во Viewer'e ты будешь обращаться к ним как
User->profile->someAttribute;

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

#5 User is offline   logity 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 07-May 09

Posted 07 May 2009 - 08:53 AM

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

public function relations(){
        array(
            'profile'=>array(HAS_ON,'profile','userId')
        )
    }

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

0

#6 User is offline   logity 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 07-May 09

Posted 07 May 2009 - 09:15 AM

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

$user = new User ( );
$user->profile = new Profile();


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

#7 User is offline   3an 

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

Posted 07 May 2009 - 02:24 PM

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

#8 User is offline   logity 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 07-May 09

Posted 08 May 2009 - 08:02 AM


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 ();

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