yii2:如何使用 previos 过滤器生成报告
yii2: how to generate reports with previos filter
我完全不熟悉 Yii2 和 Web 应用程序编程。但我必须面对挑战,所以我希望在这里能得到一点帮助...
目前我正在开发一个报告模块,用户可以在其中基本配置他自己的报告。然后在报告网格的视图中有一个带有 "evaluate report" 按钮的操作列。到目前为止,我已经做到了,一旦单击按钮,就会呈现带有基于数组的数据网格的 "evaluation"-视图(修改了 ReportModel 和 ReportController)。
但这不是我想要的功能:单击按钮后,首先应该呈现一个表单(过滤器),用户可以在其中设置一些进一步的过滤器选项。单击过滤器表单中的提交按钮后,应将这些选项传递给 SQL-语句,并且数据网格应呈现在过滤器表单下方的同一页面上。过滤器表单应随时可编辑,单击提交按钮后应重新呈现新的数据网格。
我需要的是对实现此类功能的专业方法的解释(无需代码)...它更像是 "how to" 我需要的指南。请记住,我不是专业程序员,非常感谢!
基本思想是重用您的表单。当用户首先访问此页面时,他通过 GET 访问它,而您只呈现空的过滤器表单并且不显示任何数据(或者可能是最新的 10 条记录)。通过提交表单,将调用 POST 请求,在其主体中携带表单内容。由于提交是对网络服务器的新请求,您可以评估表单值并使用它们两次:首先,您使用它们来过滤数据,然后再次将值传递给您的过滤表单。生成的页面包含您之前输入的值和生成的过滤数据的表单。然后,用户可以像提交表单之前一样继续使用该表单。
希望你能明白...:)
这是我的控制器代码:
public function actionEvaluate($id)
{
$model = $this->findModel($id);
$model->signalIds = $model->getSignalIds();
$model->machineIds = $model->getMachineIds();
$model->driverIds = $model->getDriverIds();
$model->sqlarr = $model->getSqlArray();
$model->columnarr = $model->getColumnNames();
if ($model->load(Yii::$app->request->post())){
$query = New Query;
if ($model->object == 'VEHICLES'){
$query ->select($model->sqlarr)
->from('trips')
->where(['machine_id' => $model->machineIds])
->groupBy('id_trip')
->leftJoin('can_data', 'can_data.trip_id = id_trip')
->rightJoin('machine', 'machine.id_machine = machine_id')
->all();
}else{
$query ->select(['trips.begin','trips.end','can_data.duration','can_data.distance'])
->from('trips')
->where(['driver_id' => $model->driverIds])
->groupBy('machine_id')
->leftJoin('can_data', 'can_data.trip_id = trips.id_trip')
->all();
$data = $query->createCommand()->queryAll();
}
$data = $query->createCommand()->queryAll();
$dataProvider = new ArrayDataProvider([
'allModels'=>$data,]);
}else{
$dataProvider = new ArrayDataProvider([
'allModels'=>[],]);
}
return $this->render('evaluate', [
'dataProvider' => $dataProvider,
'model' => $model,]);
}
还有几个问题:
目前,如果没有 post,我将跳过并清空 dataProvider。问题是,当我按下提交按钮时没有任何反应,但在我看来至少应该呈现基于查询的数据网格?
有POST怎么实现网格渲染?
How could I realise a rendering of the grid only if theres a POST?
试试这个:
public function actionEvaluate($id)
{
$model = $this->findModel($id);
$model->signalIds = $model->getSignalIds();
$model->machineIds = $model->getMachineIds();
$model->driverIds = $model->getDriverIds();
$model->sqlarr = $model->getSqlArray();
$model->columnarr = $model->getColumnNames();
if ($model->load(Yii::$app->request->post())){
$query = New Query;
if ($model->object == 'VEHICLES'){
$query ->select($model->sqlarr)
->from('trips')
->where(['machine_id' => $model->machineIds])
->groupBy('id_trip')
->leftJoin('can_data', 'can_data.trip_id = id_trip')
->rightJoin('machine', 'machine.id_machine = machine_id')
->all();
}else{
$query ->select(['trips.begin','trips.end','can_data.duration','can_data.distance'])
->from('trips')
->where(['driver_id' => $model->driverIds])
->groupBy('machine_id')
->leftJoin('can_data', 'can_data.trip_id = trips.id_trip');
}
$dataProvider = new ActiveDataProvider(['query'=>$query]);
}else{
$dataProvider = null;
}
return $this->render('evaluate', [
'dataProvider' => $dataProvider,
'model' => $model,]);
}
$dataprovider 可以为 null 或 ActiveDataProvider 的实例。在您的模板中,您像以前一样使用 GridView,但用 if:
包围它
...
<?php if ($dataProvider !== null): =>
[ insert your GridView code here ]
<?php endif; ?>
...
The problem ist, when I push the Submit-Button nothing happens, but in my point of view at least the datagrid based on the query shold be rendered?
没有更多细节就很难说了。您确定您的网络服务器显示任何错误吗(参见 Showing all errors and warnings)?
我完全不熟悉 Yii2 和 Web 应用程序编程。但我必须面对挑战,所以我希望在这里能得到一点帮助...
目前我正在开发一个报告模块,用户可以在其中基本配置他自己的报告。然后在报告网格的视图中有一个带有 "evaluate report" 按钮的操作列。到目前为止,我已经做到了,一旦单击按钮,就会呈现带有基于数组的数据网格的 "evaluation"-视图(修改了 ReportModel 和 ReportController)。
但这不是我想要的功能:单击按钮后,首先应该呈现一个表单(过滤器),用户可以在其中设置一些进一步的过滤器选项。单击过滤器表单中的提交按钮后,应将这些选项传递给 SQL-语句,并且数据网格应呈现在过滤器表单下方的同一页面上。过滤器表单应随时可编辑,单击提交按钮后应重新呈现新的数据网格。
我需要的是对实现此类功能的专业方法的解释(无需代码)...它更像是 "how to" 我需要的指南。请记住,我不是专业程序员,非常感谢!
基本思想是重用您的表单。当用户首先访问此页面时,他通过 GET 访问它,而您只呈现空的过滤器表单并且不显示任何数据(或者可能是最新的 10 条记录)。通过提交表单,将调用 POST 请求,在其主体中携带表单内容。由于提交是对网络服务器的新请求,您可以评估表单值并使用它们两次:首先,您使用它们来过滤数据,然后再次将值传递给您的过滤表单。生成的页面包含您之前输入的值和生成的过滤数据的表单。然后,用户可以像提交表单之前一样继续使用该表单。
希望你能明白...:)
这是我的控制器代码:
public function actionEvaluate($id)
{
$model = $this->findModel($id);
$model->signalIds = $model->getSignalIds();
$model->machineIds = $model->getMachineIds();
$model->driverIds = $model->getDriverIds();
$model->sqlarr = $model->getSqlArray();
$model->columnarr = $model->getColumnNames();
if ($model->load(Yii::$app->request->post())){
$query = New Query;
if ($model->object == 'VEHICLES'){
$query ->select($model->sqlarr)
->from('trips')
->where(['machine_id' => $model->machineIds])
->groupBy('id_trip')
->leftJoin('can_data', 'can_data.trip_id = id_trip')
->rightJoin('machine', 'machine.id_machine = machine_id')
->all();
}else{
$query ->select(['trips.begin','trips.end','can_data.duration','can_data.distance'])
->from('trips')
->where(['driver_id' => $model->driverIds])
->groupBy('machine_id')
->leftJoin('can_data', 'can_data.trip_id = trips.id_trip')
->all();
$data = $query->createCommand()->queryAll();
}
$data = $query->createCommand()->queryAll();
$dataProvider = new ArrayDataProvider([
'allModels'=>$data,]);
}else{
$dataProvider = new ArrayDataProvider([
'allModels'=>[],]);
}
return $this->render('evaluate', [
'dataProvider' => $dataProvider,
'model' => $model,]);
}
还有几个问题: 目前,如果没有 post,我将跳过并清空 dataProvider。问题是,当我按下提交按钮时没有任何反应,但在我看来至少应该呈现基于查询的数据网格?
有POST怎么实现网格渲染?
How could I realise a rendering of the grid only if theres a POST?
试试这个:
public function actionEvaluate($id)
{
$model = $this->findModel($id);
$model->signalIds = $model->getSignalIds();
$model->machineIds = $model->getMachineIds();
$model->driverIds = $model->getDriverIds();
$model->sqlarr = $model->getSqlArray();
$model->columnarr = $model->getColumnNames();
if ($model->load(Yii::$app->request->post())){
$query = New Query;
if ($model->object == 'VEHICLES'){
$query ->select($model->sqlarr)
->from('trips')
->where(['machine_id' => $model->machineIds])
->groupBy('id_trip')
->leftJoin('can_data', 'can_data.trip_id = id_trip')
->rightJoin('machine', 'machine.id_machine = machine_id')
->all();
}else{
$query ->select(['trips.begin','trips.end','can_data.duration','can_data.distance'])
->from('trips')
->where(['driver_id' => $model->driverIds])
->groupBy('machine_id')
->leftJoin('can_data', 'can_data.trip_id = trips.id_trip');
}
$dataProvider = new ActiveDataProvider(['query'=>$query]);
}else{
$dataProvider = null;
}
return $this->render('evaluate', [
'dataProvider' => $dataProvider,
'model' => $model,]);
}
$dataprovider 可以为 null 或 ActiveDataProvider 的实例。在您的模板中,您像以前一样使用 GridView,但用 if:
包围它...
<?php if ($dataProvider !== null): =>
[ insert your GridView code here ]
<?php endif; ?>
...
The problem ist, when I push the Submit-Button nothing happens, but in my point of view at least the datagrid based on the query shold be rendered?
没有更多细节就很难说了。您确定您的网络服务器显示任何错误吗(参见 Showing all errors and warnings)?