Как правильно прописать метод update для 2 моделей?

Вопрос такой: есть метод в связанной модели который сохраняет данные сразу в 2 таблицы
public function actionCreate()
	{

		$model=new Fio;
		$phone = new Phone;

		// Uncomment the following line if AJAX validation is needed
	//	 $this->performAjaxValidation($model);

		if(isset($_POST['Fio'], $_POST['Phone']))
		{
			$model->attributes=$_POST['Fio']; // сначало сохраняем fio
//			$model->Street_ID=6;
            $model->Street_ID = $_POST['Street_ID']; // затем говорим ему что Street_ID нужно брать из Street_ID которое обьявлено в DynamicStreets методе
			$phone->attributes=$_POST['Phone'];
			//$phone->Type_ID=2;
			//$phone->FIO_ID = $model -> $_POST['ID'];
            if(($model->save())){
                $phone->FIO_ID = $model-> ID;
                if ($phone->save())
                $this->redirect(array('view', 'id' => $model->ID));
			}

		}
        $this->redirect(array('index'));

	}

данные берутся из формы этой модели. Мне нужно настроить Update для них, но возникли сложности с формой для update.
<div class="row">
        <?PHP echo CHtml::form();
        $data = CHtml::listData(Town::model()->findAll(), 'ID', 'Town'); // первое поле, тут запрашивается  город и его id
        echo CHtml::dropDownList('ID', '',$data,
            array(
                'prompt'=>'Select Region',
                'ajax' => array(
                    'type'=>'POST',
                    'url'=>Yii::app()->createUrl('Fio/dynamicStreets'), //ссылка на метод в контроллере
                    'update'=>'#Street_ID', //тэг для второго поля
                    'data'=>array('ID'=>'js:this.value'),
                )));
        echo CHtml::dropDownList('Street_ID','', array(), array('prompt'=>'Select City'));?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'Surname'); ?>
		<?php echo $form->textArea($model,'Surname',array('rows'=>1, 'cols'=>40)); ?>
		<?php echo $form->error($model,'Surname'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'Patronymic'); ?>
		<?php echo $form->textArea($model,'Patronymic',array('rows'=>1, 'cols'=>40)); ?>
		<?php echo $form->error($model,'Patronymic'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'Name'); ?>
		<?php echo $form->textArea($model,'Name',array('rows'=>1, 'cols'=>40)); ?>
		<?php echo $form->error($model,'Name'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'Building'); ?>
		<?php echo $form->textField($model,'Building'); ?>
		<?php echo $form->error($model,'Building'); ?>
	</div>
    <div>
        <?php echo $form->labelEx($phone,'Number'); ?>
        <?php echo $form->textArea($phone,'Number',array('rows'=>1, 'cols'=>40)); ?>
        <?php echo $form->error($phone,'Number'); ?>
    </div>
    <div>
        <?php echo $form->labelEx($phone,'Type_ID'); ?>
        <?php echo $form->dropDownList($phone,'Type_ID', CHtml ::listData(Type::model()->findAll(), 'ID','Type_Phone')); ?>
        <?php echo $form->error($phone,'Type_ID'); ?>
    </div>

когда я прописываю
<?php $this->renderPartial('_form', array('model'=>$model,
  //  'phone'=>$phone
)); ?>
он ругается на $phone, этот редер в update view, такой же рендер прописан в index, там он без проблем принимается. Когда пытаешся перейти на update с этим кодом он пишет что $phone из формы
<div>
        <?php echo $form->labelEx($phone,'Number'); ?>
        <?php echo $form->textArea($phone,'Number',array('rows'=>1, 'cols'=>40)); ?>
        <?php echo $form->error($phone,'Number'); ?>
    </div>

не определён
  • Вопрос задан
  • 214 просмотров
Решения вопроса 2
@masterfreelance
программист со стажем
Связь один к одному?
Тогда вы должны также определить $phone
$phone = Phone::find->where(['fio_id' => $model->id])>one();

и передать его
$this->renderPartial('_form', array('model'=>$model, 'phone'=>$phone));
Ответ написан
@Ababinili Автор вопроса
protected function populatePhoneForFioID($fioId, $phones) // получаем значения
    {
        if (!empty($phones)) { // проверяем нif (!empty($phones)) { // проверяем не пустое ли phone
            $numbers = $phones['Number']; // обьявляем значения
            $types = $phones['Type_ID'];
            if (sizeof($numbers) === sizeof($types)) { //проверям размер обьектов number and type
                foreach ($types as $key => $type) { // перебираем types ключ значение
                    if (isset($numbers[$key]) && !empty($numbers[$key])) {// если number не пустой и key не пустой
                        if ($this->isPhoneForUpdate($key, $phones['ID'])) { // это обновление то обращаемся к методу
                            $phone = Phone::model()->findByPk($key);// ищем эти значения в модели
                        } else { // обновляем
                            $phone = new Phone;
                        }
                        $phone->FIO_ID = $fioId;
                        $phone->Type_ID = $type;
                        $phone->Number = $numbers[$key];
                        $phone->save();
                    }
                }
            } else {
                throw new CHttpException("Data size mismatch", 0);
            }
        }
    }

    protected function populateCreateNumber($fioId, $phones)
    {
        if (!empty($phones)) {
            $numbers = $phones['Number'];
            $types = $phones['Type_ID'];
            if (sizeof($numbers) === sizeof($types)) {
                foreach ($types as $key => $type) {
                    if (isset($numbers[$key]) && !empty($numbers[$key])) {
                        $phone = new Phone;
                        $phone->FIO_ID = $fioId;
                        $phone->Type_ID = $type;
                        $phone->Number = $numbers[$key];
                        $phone->save();
                    }
                }
            } else {
                throw new CHttpException("Data size mismatch", 0);
            }
        }
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate()
    {
        $model = new Fio;
        $phone = new Phone;

        // Uncomment the following line if AJAX validation is needed
        $this->performAjaxValidation($model);

        if (isset($_POST['Fio']) && isset($_POST['Phone'])) {
            $model->attributes = $_POST['Fio']; // присваиваем все отрибуты model Fio
            $model->Street_ID = $_POST['Street_ID']; // затем говорим ему что Street_ID нужно брать из Street_ID которое обьявлено в DynamicStreets методе
            if ($model->save()) {
                $this->populateCreateNumber($model->ID, $_POST['Phone']);
                $this->redirect(array('view', 'id' => $model->ID));
            }
        }
        $this->redirect(array('index'));

    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы