Yii2如何在不重定向的情况下发送控制器动作响应?

时间:2018-01-22 12:47:51

标签: ajax yii2 single-page-application renderpartial

我在Yii2中有一个单页面应用程序

主页包含 1.包含对象列表的列+创建按钮 2.用于创建/更新表单的动态内容的列

我的问题是在加载(通过ajax)创建表单时,然后我通过AjaxSubmitButton发送数据,这很好(db更新)但不是用新的对象数据更改动态内容区域,而是重定向到视图部分形式。

如何让新响应进入与发送响应相同的div?

这是现在在#singleObjContainer

中加载的表单
    <div class="course-form">

<?php 
    $form = yii\bootstrap\ActiveForm::begin(); 
?>

<span>
    <h4 class='listTitle'>Add Course</h4> 
</span>
<span class="form-group pull-right">
    <?php 

        AjaxSubmitButton::begin([
            'label' => 'Save',
            'ajaxOptions' => [
                'type'=>'POST',
                'url'=> Url::toRoute(['course/create-form']),
                'success' => new \yii\web\JsExpression('function(html)
                {
                    $("#singleObjContainer").empty().append(html);
                }'),
            ],
            'options' => ['class' => 'btn btn-success', 'type' => 'submit'],
            ]);

        AjaxSubmitButton::end();
    ?>
</span>

<hr class='myHr'>

<div>
<?php

    echo $form->field($model, 'name')->textInput(['maxlength' => true]);

    echo $form->field($model, 'description')->textarea(['rows' => '4']);

    echo $form->field($model, 'img')->label(Html::img(Yii::getAlias('@uploadsUrl/').'courses/'.$model->img,['width' => '30%']),['encodeLabel' => false])->fileInput();

?>
</div>

<?php ActiveForm::end(); ?>

这是控制器动作:

    public function actionCreateForm()
{
    $model = new Course();


    if ( $model->load(Yii::$app->request->post())) 
    {
        // get the instance of the image
        $image = UploadedFile::getInstance( $model, 'img');

        // save image name to the model
        $model->img = $image->baseName.".".$image->extension;

        // go through validation rule and save
        if( $model->save() )
        {
            // validation ok, save image in the file system
            $image->saveAs( Yii::getAlias('@uploads/').'courses/'.$model->img);

            // load the details view into the singleObj container

            $courseStudents = $this->getCourseStudents($model['id']);

            return $this->renderPartial('_viewForm', ['model' => $model, 'courseStudents' => $courseStudents]);


        }
    }
    else 
    {
        return $this->renderPartial('_createForm', ['model' => $model,]);
    }


}

2 个答案:

答案 0 :(得分:0)

如果您需要,您的结果将直接发送到ajax请求..只需返回..最终使用数组的json_encode。

  return json_encode( $model);

这样你就可以获得一个json的答案,结构相当于你的$ model

在您的控制器中添加适当的操作

public function actionRefreshForm()
{
  //your appllication code 
   $my_new_html_code ='<div>test new html code </div>;
   return $my_new_html_code;

}

在您的ajaxOptions中调用相关操作

 'ajaxOptions' => [
            'type'=>'POST',
            'url'=> Url::toRoute(['course/refresh-form']),
            'success' => new \yii\web\JsExpression('function(html)
            {
                $("#singleObjContainer").empty().append(html);
            }'),
        ],

答案 1 :(得分:0)

您可以使用yii\widgets\Pjax。我想你会很容易的。您可以在本文中了解有关它的更多信息。 http://blog.neattutorials.com/yii2-pjax-tutorial