Php Yii将两个模型中的数据收集为单一形式

Php Yii将两个模型中的数据收集为单一形式,php,forms,yii,Php,Forms,Yii,在我的web应用程序中,我需要以一种形式从两个模型收集数据。第一个模型表单类似于更新操作,用于更改现有数据,第二个表单用于创建新记录。下面是我尝试过的代码,但当我单击“保存”按钮时,它并没有保存和重定向,而是停留在同一页面上,我所做的更改将恢复到I模型和第二模型的先前值。属性将变为空 我的控制器代码 public function actionBookvegetable($id){ $BookVegetable=new BookVegetable; $model=$this-&g

在我的web应用程序中,我需要以一种形式从两个模型收集数据。第一个模型表单类似于更新操作,用于更改现有数据,第二个表单用于创建新记录。下面是我尝试过的代码,但当我单击“保存”按钮时,它并没有保存和重定向,而是停留在同一页面上,我所做的更改将恢复到I模型和第二模型的先前值。属性将变为空

我的控制器代码

public function actionBookvegetable($id){
    $BookVegetable=new BookVegetable;
    $model=$this->loadModel($id);

        if(isset($_POST['ProducerOffer'])AND (isset($_POST['BookVegetable'])) ) {



        $model->attributes=$_POST['ProducerOffer'];
        $BookVegetable->attributes=$_POST['BookVegetable'];
        if($ProducerOffer->validate()  AND  $BookVegetable->validate()) {
            $BookVegetable->save();



        $BookVegetable->booked_by=Yii::app()->user->id;
        $BookVegetable->producer_offer_id=$model->id;

        $model->save();

        }
        if (($model->hasErrors() === false)&&($BookVegetable->hasErrors===false))
        {
            $this->redirect(Yii::app()->user->returnUrl);
          }
    }
        else
        {

            Yii::app()->user->setReturnUrl($_GET['returnUrl']);
        }
        $this->render('book',array('model'=>$model,'BookVegetable'=>$BookVegetable));
        }
查看表单的我的代码

<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm',array('id'=>'non-ajax_form','enableAjaxValidation'=>false,)); ?>
<p class="help-block">Fields with <span class="required">*</span> are required.</p>

<?php echo $form->errorSummary($model,$BookVegetable); ?>
<?php echo "<br>" ?>

<?php echo $form->dropDownList($model,'vegetable_id', CHtml::listData(Vegetable::model()->findAll(),'id', 'name'), array('prompt'=>'Select Vegetable')); ?>


<?php echo CHtml::encode($model->getAttributeLabel('offered_qty')); ?>

<?php echo CHtml::textField("offered_qty",$model->offered_qty,array('readonly'=>true)); ?>


<?php echo CHtml::encode($model->getAttributeLabel('unit_cost')); ?>

<?php echo CHtml::textField("unit_cost",$model->unit_cost,array('readonly'=>true)); ?>

<?php echo CHtml::encode($model->getAttributeLabel('unit_delivery_cost')); ?>


<?php echo CHtml::textField("unit_delivery_cost",$model->unit_delivery_cost,array('readonly'=>true)); ?>
<?php echo CHtml::textField("booked_quantity",$BookVegetable->booked_quantity); ?>


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





<div class="form-actions">
    <?php $this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'submit', 'type'=>'primary', 'label'=>  'Save',)); ?

带*的字段是必需的


在分配请求的值之前,您正在保存这些值

如果有效,请尝试以下代码:

public function actionBookvegetable($id){
    $BookVegetable=new BookVegetable;
    $model=$this->loadModel($id);
    if(isset($_POST['ProducerOffer'])AND (isset($_POST['BookVegetable'])) ) 
    {
        $model->attributes=$_POST['ProducerOffer'];
        $BookVegetable->attributes= $_POST['BookVegetable'];

        /*** The below two lines should be before "$BookVegetable->save()" function ***/
        $BookVegetable->booked_by=Yii::app()->user->id;
        $BookVegetable->producer_offer_id=$model->id;

        /*** Validate() function will check for the errors **/
        if($ProducerOffer->validate()  AND  $BookVegetable->validate()) 
        {
            $BookVegetable->save();
            $model->save();
            $this->redirect(Yii::app()->user->returnUrl);
        }
        /***There is no need to check again for the errors as validate() will do that, So you can comment this three lines ***/
        /**if (($model->hasErrors() === false)&&($BookVegetable->hasErrors===false))
        {
        $this->redirect(Yii::app()->user->returnUrl);
        } */
    }
    else
    {
        Yii::app()->user->setReturnUrl($_GET['returnUrl']);
    }
    $this->render('book',array('model'=>$model,'BookVegetable'=>$BookVegetable));
}
尝试更改视图文件中的这些输入文本字段:

<?php echo $form->dropDownList($model,'vegetable_id', CHtml::listData(Vegetable::model()->findAll(),'id', 'name'), array('prompt'=>'Select Vegetable')); ?>

 /*** The first field for below input text field is for "name" of the text fields, so this must follow "ModelName[field_name]" format **/
<?php echo CHtml::textField("ProducerOffer[offered_qty]",$model->offered_qty,array('readonly'=>true)); ?>


<?php echo CHtml::textField("ProducerOffer[unit_cost]",$model->unit_cost,array('readonly'=>true)); ?>

<?php echo CHtml::textField("ProducerOffer[unit_delivery_cost]",$model->unit_delivery_cost,array('readonly'=>true)); ?>

<?php echo CHtml::textField("BookVegetable[booked_quantity]",$BookVegetable->booked_quantity); ?>

/***下面输入文本字段的第一个字段是文本字段的“名称”,因此必须遵循“ModelName[field_name]”格式**/

我希望这一定能奏效……)

你尝试过它不起作用结果是一样的你怎么用一个提交按钮发布两个表单数据?我希望您当前页面中只有一个“表单”小部件。。为什么不粘贴查看页面内容呢?即使我只使用一个表单,比如我使用一个控制器的创建操作创建另一个控制器的对象,它也不会保存。例如,如果我使用Producrofer控制器操作创建BookPlanet controoler的对象,它根本不会保存。我已经发布了它,我输入数据的视图表单的代码哦,我现在明白了..我得到了错误。。你能确切地告诉我哪些字段来自哪些模型吗。如果我是对的,字段“提供数量”、“单位交货成本”、“单位成本”来自Producerofer模型,只有一个字段,即“预订数量”来自BookPlanet模型。。