Yii从另一个控制器调用控制器功能

时间:2014-04-08 06:53:05

标签: php forms yii

在我的Web应用程序中,工作流程要求我应该从另一个函数调用一个控制器函数 我应该添加额外的代码或一些配置来继续吗?现在这就是我实施的方式。但是当我点击"保存"按钮什么都没有发生,值只是从表单中变空。

我的代码。我想创建一个模型对象" BookVegetable"内部" ProducerOfferController" 。 我在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',)); ?> 

我该如何解决这个问题?是否必须添加额外的内容以在另一个控制器中使用一个控制器操作 保存前的网址和按下保存后的网址相同

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

3 个答案:

答案 0 :(得分:0)

根据您提供的信息..当您到这里时,

http://xxx.yyy.zzz/xxxx/producerOffer/create

实际上它应该显示书的形式,当你点击那里的保存按钮并转到returnUrl。

$这 - &GT;重定向(Yii的::应用程序() - &GT;用户&GT; 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));

当你到这里时,http://xxx.yyy.zzz/xxxx/producerOffer/bookvegetable

您在ActionBookvegetable下编写的代码将会触发。

要确保您的值正确提交,请更改此代码

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

to,

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

这将打印任何阻止保存模型的错误。试一试后请告诉我。

答案 1 :(得分:0)

在Yii2中执行此操作的一种方法

<强>背景

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

在SiteController中

包括其他型号ex。 Voyzes

enter image description here

现在,在SiteController动作索引方法中,实现代码以访问模型/ SQL / NoSQL或任何内容,并将其设置为数组并将其返回到视图。对于前者

enter image description here

现在,在索引视图中,您应该拥有其他模型的数据。

答案 2 :(得分:-1)

在我的工作中,我在&#34; loadModel&#34;周围有很多逻辑。控制器中的例程以确保登录的用户可以访问特定模型。当我需要访问模型时,我发现这可以从另一个控制器工作,而无需移动或重新复制loadmodel例程:

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