[英]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.