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)?