Несколько моделей в одной и той же ActiveForm yii2

иметь несколько моделей в одной и той же форме. Я не хочу сохранять данные в обеих моделях, но я просто хочу отображать одну переменную в файле просмотра.

У меня есть 2 таблицы Organiser и Event Organiser войдут в систему и Create Event Теперь есть несколько полей, которые являются общими в обеих таблицах, поэтому, когда пользователь войдет в систему, нажмите кнопку Create Event, я хочу отобразить address из таблицы Organiser в форме

Это то, что я делал до сих пор, что может быть неправильным подходом, поэтому дайте мне знать, можно ли этого добиться другим более простым способом.

public function actionCreate()
{
    $model = new Event();

    $model2 = $this->findModel2(Yii::$app->user->id);


    if ($model->load(Yii::$app->request->post())) {

        if($_POST['User']['address'] == null)
        {
            $model->location = $model2->address;
        }
        else{
            $model->location = $_POST['User']['address'];
        }

        $model->is_active = 1 ;

        $model->save();


        return $this->redirect(['view', 'id' => $model->id]);
    } else {

        return $this->render('create', [
            'model' => $model,
            'model2' => $model2
        ]);
    }
}
protected function findModel2($id)
{
    if (($model2 = User::findOne($id)) !== null) {
        return $model2;
    } else {
        throw new NotFoundHttpException('The requested page does not     exist.');
    }
}

А вот и мой код _form.php

 <?php $form = ActiveForm::begin([
    'options' => [
        'id' => 'create-event-form'
    ]
]); ?>


 <?= $form->field($model, 'interest_id')->dropDownList(
    ArrayHelper::map(Areaintrest::find()->all(),'id','area_intrest'),
    ['prompt'=> 'Select Event Category']
) ?>

<?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?>
   <?php
      if ($model->isNewRecord){
        echo $form->field($model2,'address')->textInput(['class' => 'placepicker form-control'])->label('Location');
    }
    else
        echo $form->field($model,'location')->textInput(['class' => 'placepicker form-control']);

?>

<di"form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update',     ['class' => $model->isNewRecord ? 'btn btn-danger' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>

Теперь проблема заключается в том, что когда дело доходит до сохранения, часть выдает error, говоря unknown property address, потому что этого поля не существует в таблице базы данных Event, я просто хочу, чтобы эти данные отображались в поле местоположения моего create form

так что мне здесь делать

Вот структура таблицы

Organiser          Event 
organiser_id       event_id
username           organiser_id 
clubname           title
image              location
email
firstname
lastname    
address 

Страница ошибки говорит что-то вроде этого

Unknown Property – yii\base\UnknownPropertyException

Getting unknown property: common\models\Event::address

А вот и моя модель Event

class Event extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
      return 'event';
    }


public function rules()
{
    return [
        [['organiser_id', 'interest_id', 'title', 'location'], 'required'],
        [['organiser_id', 'interest_id'], 'integer'],
        [['title', 'location'], 'string', 'max' => 255],
    ];
}

/**
 * @inheritdoc
 */
public function attributeLabels()
{
    return [
        'id' => 'ID',
        'organiser_id' => 'Organiser ID',
        'interest_id' => 'Event Type',
        'title' => 'Event Title',
        'location' => 'Location'

    ];
}


public function getOrganiser()
{
    return $this->hasOne(User::className(), ['organiser_id' => 'organiser_id']);
}

}

Вот моя модель User, представляющая Organiser таблицу и имя модели в модели внешнего интерфейса SignUp.php.

   class SignupForm extends Model
{
public $username;
public $address;
public $password;
public $password_repeat;



public function rules()
{
    return [
        ['username', 'filter', 'filter' => 'trim'],
        ['username', 'required'], 
        ['address', 'required'],
        ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
        ['username', 'string', 'min' => 2, 'max' => 255],


        [['file'], 'file', 'extensions'=>'jpg, gif, png'],



        ['password', 'required'],
        ['password', 'string', 'min' => 6],

        ['password_repeat', 'compare', 'compareAttribute' => 'password'],
    ];
}

public function attributeLabels()
{
    return [
        'password_repeat' => 'Confirm Password',
        'address' => 'Address',
        'username' => 'Username',
    ];
}



public function signup()
{
    if ($this->validate()) {
        $user = new User();
        $model = new SignupForm();
        $user->address = $this->address;
        $user->username = $this->username;

        $user->setPassword($this->password);
        $user->generateAuthKey();
        if ($user->save()) {
            return $user;
        }
    }

    return null;
}

}

Итак, я хочу отобразить organiser.address в форме Create event в поле location Надеюсь, теперь вы это понимаете, спасибо.


person Mike Ross    schedule 10.09.2015    source источник
comment
я не понимаю это точно. Можете ли вы показать структуру вашей таблицы?   -  person Insane Skull    schedule 10.09.2015
comment
@InsaneSkull я обновил структуру базы данных. Все, что я хочу сделать, это отображать значения в поле из другой таблицы как значение по умолчанию.   -  person Mike Ross    schedule 10.09.2015
comment
Вы можете добавить виртуальные атрибуты с именем address в свою модель, проверьте это yiiframework.com/wiki/167/   -  person Ganesh Ghalame    schedule 10.09.2015
comment
вы можете создать объект таблицы organiser и перейти с помощью create. Например $model3 = new Organiser(); и return $this->render('create', [ 'model' => $model, 'model2' => $model2, 'model3' => $model3 ]);   -  person Insane Skull    schedule 10.09.2015
comment
@ganeshGhalame это именно то, что я сделал .. я добавил атрибут address в раздел правил модели event   -  person Mike Ross    schedule 10.09.2015
comment
@InsaneSkull я сделал это. Вы можете видеть это в моем коде ActionCreate, который я прикрепил к вопросу. Моя Organiser модель User в проекте   -  person Mike Ross    schedule 10.09.2015
comment
Как вы думаете, почему это должно быть здесь? if($_POST['User']['address'] == null) { $model-›location = $model2-›address; } Это должно быть $_POST['Event']['address'], проверьте firebug или что-то в этом роде.   -  person Anton M.    schedule 10.09.2015
comment
скрин ошибки пожалуйста.   -  person Insane Skull    schedule 10.09.2015
comment
@АнтонМ. Потому что, если запись новая, то имя моего поля формы address. и если его форма обновления, чем имя поля, location. Итак, если его форма создания и значение равно null, я хочу получить значение из таблицы Organiser.address и сохранить его в базе данных event.location   -  person Mike Ross    schedule 10.09.2015
comment
@InsaneSkull Включены строки с ошибками, о которых идет речь.   -  person Mike Ross    schedule 10.09.2015
comment
@MikeRoss, так что в этом случае вы можете использовать $model->isNewRecord   -  person Ganesh Ghalame    schedule 10.09.2015
comment
пожалуйста, удалите атрибут address из модели event, он там не нужен, и попробуйте. ваш адрес будет исходить от модели user.   -  person Insane Skull    schedule 10.09.2015
comment
@InsaneSkull, кажется, решает проблему. Но как я могу заставить проверку работать. Могу ли я импортировать ту же проверку, которая была в модели Organiser, или мне нужно выполнить ее вручную для этой формы view.   -  person Mike Ross    schedule 10.09.2015
comment
@InsaneSkull я чувствую, что передаю ненужные переменные в форму просмотра. Мне нужно только 1 поле organiser.address и отображать его в форме Event, но я передаю все model со всеми ненужными атрибутами. Дайте мне знать, есть ли другой способ добиться этого. Спасибо   -  person Mike Ross    schedule 10.09.2015
comment
Извините, названия моделей заставляют меня что-то пропустить. Пожалуйста, покажите структуру модели пользователя.   -  person Anton M.    schedule 10.09.2015
comment
И я не могу понять, зачем вам нужно поле address от пользователя, почему не location из Event, и перед вызовом рендера, если это новая модель $model-›location = $model2-›address; А также вы ищете пользователя дважды.   -  person Anton M.    schedule 10.09.2015
comment
@АнтонМ. Я знаю, что мой код беспорядок. Я хочу получить данные, которые находятся в organiser.address, и отобразить в поле формы event создания event.location, чтобы пользователю не приходилось снова заполнять ту же форму. Это главное, что я хочу сделать. И organiser — это имя таблицы, но имя модели в моем проекте для organiserUser Надеюсь, вы поняли идею. Спасибо   -  person Mike Ross    schedule 10.09.2015
comment
он будет импортировать правила проверки из модели user. так что вы проходите обе модели.   -  person Insane Skull    schedule 10.09.2015
comment
@InsaneSkull да, я думал, что это должно произойти, но этого не происходит. Потому что в моей модели User требуется поле address, но когда я импортирую его в Event, создаю форму, это поле больше не требуется. Это просто обычное поле ввода. Вот почему я должен проверить переменную [$_POST] перед сохранением.   -  person Mike Ross    schedule 10.09.2015
comment
ваш $model2 имеет все поля organiser и проверку этого. в этом случае покажите также модель User.   -  person Insane Skull    schedule 10.09.2015


Ответы (1)


Может быть, ваша функция должна выглядеть так

public function actionCreate()
{
    $event= new Event();

    $user= $this->findModel2(Yii::$app->user->id);
    $event->location = $user->address;

    if ($event->load(Yii::$app->request->post()) && $event->save()) {//active can set by default validator
        return $this->redirect(['view', 'id' => $event->id]);
    }
    return $this->render('create', [
        'event' => $event
    ]);

}

И в форме вы показываете местоположение всегда. Затем вы можете использовать его в обновлении и создавать без просмотра ifs. Надеюсь, что это поможет вам.

person Anton M.    schedule 10.09.2015
comment
Идеальное решение... Таким образом, мне не нужно передавать несколько моделей в форму и нет ненужных условий if.. Большое спасибо - person Mike Ross; 11.09.2015