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