Yii2 如何从相关模型的 gridview 中显示单个记录

Yii2 How to display a single record from a related model's gridview

我有两个表,'employee' 和 'employee_payrecords'。

我有一个名为 'dashboard' 的视图,它基于 Employee 模型。员工与 employee_payrecords (n:m) 相关。在仪表板上,我有一个显示所有工资记录的 gridview 小部件。我希望能够单击 'view'(在 Gridview 小部件的操作列中)以获得工资记录,并在新的 window(1 个工资记录)中显示工资记录。目前,如果我将鼠标悬停在工资记录的 'view' 操作上,它会在浏览器的底部预览栏中显示工资记录的正确 ID,但如果我单击 'view' 操作项,它会给我一个 'Not Found' 错误.我只是想在自己的视图中显示工资记录。我错过了什么?

在 EmployeeController 中,我有一个从 EmployeePayrecord 模型(通过 Employee 模型关联)查看薪水的操作:

public function actionViewPaycheck($id)
{
    $model = EmployeePayrecord::findOne($id);

    return $this->render('viewPaycheck', [
        'model' => $model,
    ]);
}

在 Employee 模型中 我有一个方法来检索所有工资记录(对于 'dashboard' 视图中的 Gridview):

public function getEmployeePayrecords()
{
    return $this->hasMany(\frontend\models\EmployeePayrecord::className(), ['employee_id' => 'id']);
}

在 'dashboard' 视图中 我创建了我认为正确的 URL 如上所述,它确实显示了正确的记录号对于 link 浏览器预览中的薪资记录(在我单击 'view' 操作按钮之前。)此外,此处未显示的是视图薪资视图 (viewPaycheck.php),这是url指的是,显示工资记录:

[
     'class' => 'yii\grid\ActionColumn',
     'template' => '{view}',
     'header' => 'Actions',
     'buttons' => [
           'view' => function ($url, $model) {
                return Html::a(
                   '<span>view</span>',
                   ['employee/view-paycheck', 'id' => $model->id],
                   ['title' => Yii::t('app', 'View Paycheck')]
                 );
             }
      ],
],

动作呈现仪表板视图:

public function actionDashboard($id)
{
    /**
     * Use the employee layout for 'dashboard'
     */
    $this->layout = 'employee';

    $model = $this->findModel($id);

    $providerEmployeePayrecords = new \yii\data\ArrayDataProvider([
        'allModels' => $model->employeePayrecords,
        'pagination' => [
            'pageSize' => 5,
        ]
    ]);

    return $this->render('dashboard', [
        'model' => $model,
        'providerEmployeePayrecords' => $providerEmployeePayrecords,

    ]);
}

因为您只是在一个按钮中使用它,所以没有必要修改整个 urlCreator。

[
    'class' => 'yii\grid\ActionColumn',
    'template' => '{view}',
    'header' => 'Actions',
    'buttons' => [
        'view' => function ($url, $model) {
            return Html::a(
                '<span>view</span>', 
                ['employee/view-paycheck', 'id' => $model->id], 
                ['title' => Yii::t('app', 'View Paycheck')]
            );
        }
    ],
],

更新

经过漫长的调试过程,我们终于找到了错误的核心。

视图中有两个 GridView(Kartik 的版本),都使用 Pjax(通过 pjax 设置而不是 Pjax 包装器),显然第二个使用不同的 link view 按钮,已以某种方式加载到第一个 pjax 容器中,更改了按钮 link 的目标 URL。

pjaxSettings 已设置为对容器使用不同的 ID,因此情况并非如此,但看起来这有一个错误。

从 GridView 中删除 pjax 设置并使用标准 Pjax 包装器(Pjax::begin()Pjax::end())有助于解决问题。