【问题标题】:yii2 render after post-requestyii2 在请求后渲染
【发布时间】:2017-11-13 16:08:00
【问题描述】:

我有一个带有复选框列的网格视图和一个谷歌地图(2amigos)的视图。用户通过在网格视图中选择相应的项目来选择要在地图中显示的机器。一个 html 按钮将选定的键提交给控制器。遵循控制器代码(dataProvider 由 post-request 更新):

//some code before render   
$dataProvider = new ActiveDataProvider(['query'=>$query, 'pagination'=>false]);
return $this->render('locating', [
    'model' => $model,
    'searchModel' => $searchModel,
    'dataProvider1' => $dataProvider1,
    'dataProvider' => $dataProvider,
    ]);
}

这是 html 按钮的 js 脚本:

$('#showButton').click(function(){
    var keys = $('#w0').yiiGridView('getSelectedRows');
    $.post("http://localhost:8080/eddb1/frontend/web/index.php?r=tracking/locating",
    {'keylist': keys},
    function(data){
        console.log(data);
    });
});

问题是,通过 post 请求,php-render 命令的结果会作为 html 字符串写入 post-response,但视图不会重新呈现。如果我对 activeForm 而不是 gridview (以选择机器)和提交按钮执行相同操作,则页面将按应有的方式重新渲染(但这种方式对我不起作用,因为我需要带有过滤器的 gridview 和排序)。我该怎么做才能使地图(或视图)通过后请求重新呈现?

【问题讨论】:

  • 请出示控制器代码...
  • 不明白为什么......但我会发布整个控制器代码
  • 对这个问题有什么想法吗?
  • 如果我理解正确,您正在尝试在同一视图中使用网格视图和活动表单。你正在使用什么样的类gridview? Yii2 gridview的普通类?
  • 不,你理解错了:我需要使用gridview而不是activeform...使用activeform和multiselect-field一切正常但如果我使用带有普通参数的gridview则不行-post 请求如上面的代码所示。

标签: javascript post view yii2 render


【解决方案1】:

当通过 ajax 请求视图时,尝试使用 renderAjax 方法呈现视图。我假设您使用actionLocating 为页面获取请求和ajax 呈现您的视图。因此,在您在控制器中调用 render 之前,请检查这是否是 ajax 请求:

$renderMethod = Yii::$app->request->isAjax ? 'renderAjax' : 'render';

return $this->$renderMethod('locating', $viewParams);

【讨论】:

  • 您好托尼,感谢您的回答。请原谅我迟到的回复......我正在旅行。
  • 我之前试过 renderAjax,也试过你的代码...同样的结果:dataProvider 被正确创建但仍然没有渲染
  • 也许错误就在这里:$dataProvider1 = $searchModel->search(Yii::$app->request->queryParams); ...要去看看。
  • 你的 js 代码是什么样子的?您完全按照您的问题发布它吗?
  • 是的,代码是一样的,我也试过$.ajax,但结果一样
【解决方案2】:
public function actionLocating()
{
    $searchModel = new ViewMachinesSearch();
    $dataProvider1 = $searchModel->search(Yii::$app->request->queryParams);
    $dataProvider1->pagination = false;
    $model = new TrackingForm();

    if (Yii::$app->request->post()){
        $model->machine_select = Yii::$app->request->post('keylist');
        $machines = $model->machine_select;
    }else{
        $machines = $model->getMachines();
    }

    if(!in_array(Yii::$app->user->identity->company_id, Yii::$app->CompaniesByUser->getCompaniesByUser(21))){
        $query = New Query;
        $query  ->select(['licenceplate', 'identifier', 'timestamp', 'lat', 'lng'])
                ->from('gps_live')
                ->where(['machine_id' => $machines])
                ->orderBy(['timestamp' => SORT_DESC]);
    }else{
        $subquery = New Query;
        $subquery   ->select(['licenceplate', 'identifier', 'timestamp', 'lat', 'lng'])
                    ->from('btc_m1_v1_1')
                    ->join('INNER JOIN', 'machine', 'machine.id_machine = machine_id')
                    ->where(['machine_id' => $machines])
                    ->andWhere('lat <> 0')
                    ->andWhere('lng <> 0')
                    ->orderBy(['timestamp' => SORT_DESC]);
        $query = New Query;
        $query  ->from(['sub' => $subquery])
                ->groupBy(['sub.licenceplate'])
                ->all();
    }

    $dataProvider = new ActiveDataProvider(['query'=>$query, 'pagination'=>false]);
    return $this->render('locating', [
        'model' => $model,
        'searchModel' => $searchModel,
        'dataProvider1' => $dataProvider1,
        'dataProvider' => $dataProvider,
        ]);
}

【讨论】:

    【解决方案3】:

    你可以在你的基本控制器上创建一些函数来确保它是否被渲染为 ajax,代码看起来像这样。

    protected function renderIsAjax($view, $params = [])
    {
        if (Yii::$app->request->isAjax) {
            return $this->renderAjax($view, $params);
        } else {
            return $this->render($view, $params);
    }
    

    然后在您的控制器中调用该方法

    return $this->renderIsAjax('locating', [
        'model' => $model,
        'searchModel' => $searchModel,
        'dataProvider1' => $dataProvider1,
        'dataProvider' => $dataProvider,
    ]);
    

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 2021-07-19
      • 2017-06-23
      相关资源
      最近更新 更多