Yii从另一个控制器调用控制器函数

rjjhvcjd  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(230)

在我的Web应用程序中,工作流要求我应该从一个控制器函数调用另一个函数。我是否应该添加额外的代码或一些配置来继续?现在这是我实现的方式。但当我单击“保存”按钮时,没有任何React,值只是从表单中变空。
我的代码。我想在“ProducerOfferController”中创建一个“BookVegetable”模型的对象。我的代码在ProducerOffer控制器中

public function actionCreate()
{
    //$book_vegetable=new BookVegetable;
    $model=new BookVegetable;
    if(isset($_POST['BookVegetable']))
    {
        $model->attributes=$_POST['BookVegetable'];
        $model->booked_by = Yii::app()->user->id;
        $model->save();
        if ($model->hasErrors() === false)
        {
            $this->redirect(Yii::app()->user->returnUrl);
        }
    }
    else
    {
        Yii::app()->user->setReturnUrl($_GET['returnUrl']);
    }
    $this->render('book',array('model'=>$model,));
}

来自视图的我的代码

<div style='padding-left:50px'>
    <?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); ?>
    <?php echo "<br>" ?>

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

我的方案

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

        $model->attributes=$_POST['ProducerOffer'];
        $BookVegetable->attributes=$_POST['BookVegetable'];
        $BookVegetable->booked_by=Yii::app()->user->id;
        $BookVegetable->producer_offer_id=$model->id;
        $model->save();
        $BookVegetable->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));
        }

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

我应该如何解决这个问题?是否有必要添加任何额外的东西来使用一个控制器内的另一个控制器操作保存前的url和它的相同后,我按保存也

http://localhost/xxx/producerOffer/bookvegetable/20?returnUrl=%xxx%2FproducerOffer%2Fmanage
nnt7mjpx

nnt7mjpx1#

在Yii 2中实现此目的的一种方法

背景

在SiteController中,action index方法从另一个名为voyzes的模型中获取所有对象的记录。

在站点控制器中

包括其他型号,例如Voyzes

现在在SiteController操作索引方法中,实现代码来访问model/SQL/NoSQL或任何东西,并将其设置在数组中,然后将其返回到视图。

现在,在索引视图中,您应该有来自另一个模型的数据。

bxfogqkk

bxfogqkk2#

根据你提供的信息..当你到这里的时候,
http://xxx.yyy.zzz/xxxx/producerOffer/create
实际上,它应该显示书的形式,当你点击保存按钮,并进入returnUrl

$this->redirect(Yii::app()->user->returnUrl);

我建议您将下面的代码写为,

$model->save();
$BookVegetable->save();

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

结束日期

if($model->save() && $BookVegetable->save())
    $this->redirect('yourAction'); //if params needed, $this->redirect(array('yourAction', 'id' => $model->id));

当你到这里的时候
无论您在ActionBookvegetable下编写的代码将触发什么。
为确保正确提交值,请更改此代码

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

结束日期

if($model->save())
    $this->redirect('yourAction');
else
    print_r(getErrors());

这将打印任何阻止保存模型的错误。请在您尝试此操作后告诉我。

jmo0nnb3

jmo0nnb33#

在我的工作中,我在控制器中有很多关于“loadModel”例程的逻辑,以确保登录的用户可以访问特定的模型。我发现当我需要访问模型时,可以从另一个控制器进行操作,而无需移动或重新复制loadmodel例程:

$caseviewController = Yii::app()->createController('Caseview');
//use this method from caseview controller to securley load case view model
$caseview = $caseviewController[0]->loadModel($caseviewid);

相关问题