簡體   English   中英

yii2在請求后渲染

[英]yii2 render after post-request

我有一個帶有checkboxcolumn和google-map(2amigos)的gridview的視圖。 用戶通過選擇網格視圖中的相應項目來選擇要在地圖中顯示的機器。 一個html按鈕將所選的鍵提交給控制器。 遵循控制代碼(通過后請求更新dataProvider):

//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-string寫入后響應,但視圖不會重新呈現。 如果我使用activeForm而不是gridview(選擇機器)和一個submit-button來做同樣的事情,頁面將按其應有的方式重新渲染(但是這種方式對我不起作用,因為我需要帶有filter和排序)。 如何在請求后重新渲染地圖(或視圖)?

當通過ajax請求視圖時,嘗試使用renderAjax方法呈現視圖。 我假設您使用actionLocating來呈現頁面獲取請求和Ajax的視圖。 因此,在控制器中調用render之前,請檢查這是否是ajax請求:

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

return $this->$renderMethod('locating', $viewParams);
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,
        ]);
}

您可以在基本控制器上創建一些函數,以確保該函數是否以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,
]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM