Добавление Записей В Две Таблицы С Одной Страницы

Есть таблица user: id, login, password, role (employer | admin).

Есть таблица lpu: id, name, text.

Есть таблица lpususers: id, user_id, lpu_id

При создании пользователя user/create нужно показать либо чекбоксы, либо множественный селект с всевозможными значениями lpu.id.

Реализовал во вьюшке _form для create.php


<?php

/* @var $this UserController */

/* @var $model User */

/* @var $form CActiveForm */

?>


<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

    'id'=>'user-form',

    'enableAjaxValidation'=>false,

)); ?>


    <p class="note">Поля, отмеченные <span class="required">*</span>, обязательны для заполнения</p>


    <?php echo $form->errorSummary($model); ?>


    <div class="row">

        <?php echo $form->labelEx($model,'login'); ?>

        <?php echo $form->textField($model,'login',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'login'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'username'); ?>

        <?php echo $form->textField($model,'username',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'username'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'password'); ?>

        <?php echo $form->passwordField($model,'password',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'password'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'email'); ?>

        <?php echo $form->textField($model,'email',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'email'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'role'); ?>

        <?php

        echo CHtml::activeDropDownList($model, 'role', array('employer'=>'employer', 'admin'=>'admin'));

        echo $form->error($model,'role'); ?>

    </div>

    

    <div class="row">

        <?php echo $form->labelEx(Lpususers::model(),'lpu_id'); ?>

        <?php echo $form->dropDownList(Lpususers::model(),'lpu_id',

        CHtml::listData(Lpu::model()->findAll(array('order'=>'id ASC')),'id','name')); ?>

    </div>

    

    <div class="row buttons">

        <?php echo CHtml::submitButton($model->isNewRecord ? 'Создать' : 'Сохранить');

        echo CHtml::form('','POST',array ('enctype' =>'multipart/form-data')); ?>

    </div>


<?php $this->endWidget(); ?>


</div><!-- form -->

Теперь не знаю как сделать следующее. При нажатии на кнопку "Сохранить" - помимо создания пользователя, добавлялись данные в таблицу lpususers, где user_id - наш id активного пользователя и lpu_id - выбранные id в выпадающем списке.

Подскажите реализацию?

Ну я, например, так люблю делать: в основной модели завожу виртуальное поле, например public $relatedIds, которое и использую в чекбоксах (и в правила валидации его надо добавить тоже, иначе не присвоится массово). При сохранениии пользователя в это поле попадет массив, который я разгребаю в каком-нибудь триггере типа afterSave и создаю нужные записи.

Сделал так!

В UserController


public function actionCreate()

    {

        $model=new User;

        $lpu=new Lpususers;

        //$lpu = $_POST['Lpususers'];

        if(isset($_POST['User']))

        {

            $lpu->attributes=$_POST['Lpususers'];

            $lpu->save();


        }


        if(isset($_POST['User']))

        {

            $model->attributes=$_POST['User'];

            if($model->save())

                $this->redirect(array('view','id'=>$model->id));

        }


        $this->render('create',array(

            'model'=>$model, 'lpu'=>$lpu,

        ));

    } 

во вьюхе user/create


<?php echo $this->renderPartial('_form', array('model'=>$model, 'lpu'=>$lpu)); ?>

в форме создания


<?php

/* @var $this UserController */

/* @var $model User */

/* @var $form CActiveForm */

?>


<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

    'id'=>'lpu-form',

    'enableAjaxValidation'=>false,

)); ?>


    <p class="note">Поля, отмеченные <span class="required">*</span>, обязательны для заполнения</p>


    <?php echo $form->errorSummary($model); ?>


    <div class="row">

        <?php echo $form->labelEx($model,'login'); ?>

        <?php echo $form->textField($model,'login',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'login'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'username'); ?>

        <?php echo $form->textField($model,'username',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'username'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'password'); ?>

        <?php echo $form->passwordField($model,'password',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'password'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'email'); ?>

        <?php echo $form->textField($model,'email',array('size'=>60,'maxlength'=>128)); ?>

        <?php echo $form->error($model,'email'); ?>

    </div>


    <div class="row">

        <?php echo $form->labelEx($model,'role'); ?>

        <?php

        echo CHtml::activeDropDownList($model, 'role', array('employer'=>'employer', 'admin'=>'admin'));

        echo $form->error($model,'role'); ?>

    </div>

    

    <div class="row">

        <?php echo $form->labelEx($lpu,'user_id'); ?>

        <?php echo $form->dropDownList($lpu,'user_id',

        CHtml::listData(User::model()->findAll(array('order'=>'id ASC')),'id','id')); ?>

    </div>

    <div class="row">

        <?php echo $form->labelEx($lpu,'lpu_id'); ?>

        <?php echo $form->dropDownList($lpu,'lpu_id',

            CHtml::listData(Lpu::model()->findAll(array('order'=>'id ASC')),'id','id')); ?>

    </div>

    

    <div class="row buttons">

        <?php echo CHtml::submitButton($lpu->isNewRecord ? 'Создать' : 'Сохранить');

        echo CHtml::form('','POST',array ('enctype' =>'multipart/form-data')); ?>

    </div>


<?php $this->endWidget(); ?>


</div><!-- form -->

Теперь я ручками заношу данные в одну и в другую таблицу! НО! столкнулся со следующей проблемой. Как бы узнать будущий id созданного пользователя? Сперва нужно создать пользователя, и его созданный id аутоинкрементом добавить в другую табличку…

Сейчас буду чекбоксы крутить, или множественный селектор

Вот для вытаскивания id только что созданной записи товарищ ORey и написал что он пользуется событиями, например




protected function afterSave()

    {

        parent::afterSave();

        //делайте тут свои темные делишки, ваша только чот созданная модель это $this

        //соответственно id = $this->id

    }



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

2 способ:




public function actionCreate()

    {

        $model=new User;

        $lpu=new Lpususers;

        if(isset($_POST['User'])&&isset($_POST['Lpususers']))

        {

            $model->attributes=$_POST['User'];

            $lpu->attributes=$_POST['Lpususers'];

            if($model->validate()&&$lpu->validate()){

                $model->save(false);

                $lpu->id=$model->id;//да id у нас уже есть

                $lpu->save(false);

                $this->redirect(array('view','id'=>$model->id));

            }

        }

        $this->render('create',array(

            'model'=>$model, 'lpu'=>$lpu,

        ));

    }



Так будет в разы лучше нежели у вас. Зачем вы проверяете 2 раза 1 и тот же пост, и зачем нужны 2 if непонятно. В данном же коде, мы обходимся 1 (мы ведь не хотим чтобы у нас сохранилось все при отсутствии полей для $lpu?), далее делаем валидацию модели и lpu, чтобы удостоверится в том что данные корректны. Сохраняем модель (save(false) отключаем валидацию перед сохранением), теперь нам доступен id сохраненной записи. Как то так.


public function actionCreate()

	{


		$user=new User();

		if(isset($_POST['User']))

		{

			$user->setAttributes($_POST['User']);


			if($user->save()) {

				foreach($_POST["userLpuIds"] AS $id)

				{

					$lpu=new Lpususers();

					$lpu->lpu_id =  $id;

					$lpu->user_id = $user->id;

					$lpu->save(false);

				}

				return $this->redirect(array('view','id'=>$user->id));

			}

		}


		$lpu=new Lpususers();

		$this->render('create',array( 'model'=>$user, 'lpu'=>$lpu, ));

	}

Вот так сделал