Обновите две модели разных баз данных с одним представлением в yii

У меня есть представление (_form.php) с полями (имя, сводка) кнопку отправки. Если я нажму кнопку "Отправить", она должна обновить поле "Имя" одной модели и поле "Сводка" другой модели. Оба эти модели относятся к разным базам данных. Может ли кто-нибудь помочь в этом. Я попробовал следующее для этого
В _form.php(тест)

<?php echo $form->labelEx($model, ‘name’); ?>
<?php echo $form->textField($model, ‘name’, array(‘size’ => 60, ‘maxlength’ => 250)); ?>
<?php echo $form->error($model, ‘name’); ?>
<?php echo $form->labelEx(Test1::model(), ‘summary’); ?>
<?php echo $form->textField(Test1::model(), ‘summary’, array(‘size’ => 60, ‘maxlength’ => 250)); ?>
<?php echo $form->error(Test1::model(), ‘summary’); ?>
<?php echo CHtml::submitButton($model->isNewRecord ? ‘Create’ : ‘Save’); ?>

В TestController.php

public function actionCreate() {
        $model = new Test;
        if (isset($_POST['Test'])) {
            $model->attributes = $_POST['Test'];
            if ($model->save()) {
                $modeltest1 = new Test1;
                $modeltest1->attributes = $_POST['Test1'];
                $modeltest1->Id = $model->Id;
                if ($modeltest1->save())
                    $this->redirect(array('view', 'Id' => $model->Id));
            }
        }
        $this->render('create', array(
            'model' => $model,
        ));
    }  

Этот код не работает. Как я могу заставить его работать для разных баз данных. Я пошел по ссылке ниже для этого.

http://www.yiiframework.com/wiki/291/update-two-models-with-one-view/

1 ответ

Этот код на самом деле должен работать, но это плохо.

Я предполагаю, что вы вообще не понимаете, что такое модель и что она делает в Yii, а также как визуализировать и создавать формы.

Я постараюсь объяснить, как это должно быть.

1-й из всех не использовать Test::model() в представлениях, если только вы не хотите вызывать какую-либо функцию из нее (но старайтесь избегать ее). Это можно сделать, передав его из контроллера:

    public function actionCreate() {
            $model_name = new Name;
            $model_summary=new Summary;
//something here
            $this->render('create', array(
                'name' => $model_name,
                'summary'=>$model_summary,
            ));
        }  

Когда вы выполняете рендеринг, вы передаете переменные в ваше представление (name_in_view=>$variable)

Второй. По вашему мнению вы можете использовать свои переменные.

<?php echo $form->labelEx($name, ‘name’);
echo $form->textField($name, ‘name’, array(‘size’ => 60, ‘maxlength’ => 250));
echo $form->error($name, ‘name’);
echo $form->labelEx($summary, ‘summary’);
echo $form->textField($summary, ‘summary’, array(‘size’ => 60, ‘maxlength’ => 250)); ?>
echo $form->error($summary, ‘summary’); ?>
echo CHtml::submitButton($model->isNewRecord ? ‘Create’ : ‘Save’); ?>

Третий. Вы должны понять, что такое модель. Это класс, который расширяет CActiveRecord в этом случае. Ваш код в контроллере должен выглядеть примерно так:

public function actionCreate() {
                $model_name = new Name;
                $model_summary=new Summary;
                if (isset($_POST['Name']))
                   $model_name->attributes=$_POST['Name'];
                if (isset($_POST['Summary']))
                   $model_name->attributes=$_POST['Summary'];
                if ($model_name->save()&&$model_summary->save())
                   $this->redirect(array('view', 'Id' => $model->Id));  
                $this->render('create', array(
                    'name' => $model_name,
                    'summary'=>$model_summary,
                ));
            }

$model->attributes=$_POST[] здесь массовое назначение атрибутов, поэтому они должны быть безопасными в правилах. Вы всегда можете назначить атрибуты своими руками (1 на 1) или сформировать массив и вытолкнуть его из массива.

Другие вопросы по тегам