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()
)有助于解决问题。
我有两个表,'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()
)有助于解决问题。