如何在不刷新/更改页面的情况下刷新Yii小部件

时间:2015-02-26 17:23:57

标签: javascript php jquery yii

我在提交TbActiveForm并且renderPartial擦除我的页面并仅显示部分视图时遇到问题。我想在我的动作触发并完成后仅重新加载小部件。我还使用模态来显示和进行更改。

视图:

$form = $this->beginWidget(
     'booster.widgets.TbActiveForm',
     array(
         'id' => 'horizontalForm',
         'type' => 'horizontal',
         'action' => Yii::app()->createUrl('orderControl/order/returns.save'),
          )
     );
     echo $form->hiddenField(
          $editReturnFormModel,
          'orderId',
          array(
              'value' => $editReturnFormModel->orderId
         )
     );
     $this->widget(
           'bootstrap.widgets.TbButton',
           array('buttonType' => 'submit', 'type' => 'primary', 'label' => 'Save')
                        );
     $this->endWidget();

动作:

$this->controller->renderPartial('ScModules.orderControl.widgets.ReturnsWidget.views._returnItems', array('returnsDataProvider'=>$returnsDataProvider, 'editReturnFormModel'=>$editReturnFormModel));

另一点是Yii::app()->createUrl('orderControl/order/returns.save')将页面网址全部更改。在此页面上我指示,视图创建正常。我需要在当前页面上重建/刷新小部件而不是将其发送到其他地方。任何关于解决方案的想法都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

  1. 将您的表单小部件包含在div或您喜欢的任何块标记内。<div id="myFormWrapper"> (your widget goes here) </div>
  2. 在表单中添加自定义ID(id =“formId”)并提交按钮(id =“submitButtonId”)
  3. 添加一些jQuery以提交表单并将旧窗口小部件替换为新
  4. 
    
        $(document).on('click', '#submitButtonId' , function() {
            $.ajax({
                type: 'POST',
                url: $('#formId').attr('action'),
                data : $('#formId').serialize(),
                beforeSend : function(){
                        //do anything you want before sending the form
                },
                success : function(data){
                        //We'll replace the old form with the new form widget  
                        $('#myFormWrapper').html(data);
    
                },
                error : function(data){
                    console.log('ops');
                },
            });
            return false;
        });
    
    
    1. 在Controller操作中执行任何操作并使用renderPartial。
    2. 
      
          //The action below should be the same that you used in the action attribute of the form
          public function actionProcessForm(){
             $model = new MyFormModelName();
             if(isset($_POST['MyFormModelName'])){
                $model->attributes = $_POST['MyFormModelName'];
                if($model->save()){
                   //Do whatever you want here
                   $returnsDataProvider = new CActiveDataProvider('YourModel');
                   $this->renderPartial('//folder/to/your/view',  array('returnsDataProvider'=> $returnsDataProvider, 'editReturnFormModel'=>$editReturnFormModel));
                }else{
                    //You might want to render something else here
                    $this->renderPartial('errorViewPage');
                }
             }
          }