Kartik Detailview 中的更新数据不起作用
Update data in Kartik Detailview didn't work
我使用 Kartik 细节视图显示了细节。通过单击右上角的铅笔图标按钮,此小部件具有 Edit 内联功能
然后 table 将像这样编辑 table:
我已经编辑了数据,然后单击软盘图标按钮作为保存。
没有任何反应,我的数据还是一样,我的更新没有成功。
这是我在view.php
中的代码
<?=
DetailView::widget([
'model' => $model,
'condensed' => true,
'hover' => true,
'mode' => DetailView::MODE_VIEW,
'panel' => [
'heading' => 'Data Details',
'type' => DetailView::TYPE_INFO,
],
'attributes' => [
'product',
'productId',
'distDate',
'created_at',
'created_by',
[
'attribute' => 'is_exported',
'value' => $model->isExported->name,
],
],
'buttons1' => '{update}',
])
?>
为什么插件没有保存编辑的数据?我的代码有什么问题?
更新:
这是我控制器中的操作:
public function actionUpdate($id) {
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->productId]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
我用的是纯action,我没有改Controller里面的代码
这是我的模型
<?php
namespace app\modules\vatout\models;
use Yii;
class VatoutFakturOut extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'vatout_faktur_out';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['user_id', 'parent_id', 'product'], 'required'],
[['user_id', 'parent_id', 'is_exported'], 'integer'],
[['distDate', 'updated_at', 'created_at'], 'safe'],
[['updated_by', 'created_by'], 'string', 'max' => 16],
[['product'], 'string', 'max' => 128],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'producrID' => 'Product ID',
'user_id' => 'User ID',
'parent_id' => 'Parent ID',
'distDate' => 'Dist Date',
'Product' => 'Product',
'is_exported' => 'Is Exported',
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getIsExported()
{
return $this->hasOne(VatoutStatus::className(), ['id' => 'is_exported']);
}
}
第$model = $this->findModel($id);
行:
您在 Controller 上使用 $this
,因此它会尝试从数据库(不存在)中查找控制器的数据。此外,控制器中没有这样的方法 findModel()
,这应该用于具有 ActiveRecord
扩展名的模型。正确的用法是:
$model = VatoutFakturOut::findOne($id);
不过,这个widget好像没有传任何$id
(所以actionUpdate($id)
里的参数$id
没用)。如何获得身份证件?来自 Yii::$app->request->post()['VatoutFakturOut']['productId']
。但是应该检查它是否被定义,否则你会得到一个警告:
$post = Yii::$app->request->post();
if (empty($post['VatoutFakturOut']['productId'])) {
throw new NotFoundHttpException('Not found.');
}
第三件事是您赋予用户编辑 ID 的能力(即使它没有被覆盖)...这是您不应该做的事情。我会稍微更改视图文件的代码:
'attributes' => [
'product',
[
'attribute' => 'productId',
'options' => ['readonly' => true],
],
'distDate',
'created_at',
'created_by',
[
'attribute' => 'is_exported',
'value' => $model->isExported->name,
],
],
假设productId
是主键。这将不允许用户编辑此字段,但它仍会发送到控制器。
最终结果:
public function actionUpdate()
{
$post = Yii::$app->request->post();
if (empty($post['VatoutFakturOut']['id'])) {
throw new NotFoundHttpException('VatoutFakturOut not found.');
}
$model = VatoutFakturOut::findOne($post['VatoutFakturOut']['id']);
if ($model->load($post) && $model->save()) {
return $this->redirect(['view', 'id' => $model->productId]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
我使用 Kartik 细节视图显示了细节。通过单击右上角的铅笔图标按钮,此小部件具有 Edit 内联功能
然后 table 将像这样编辑 table:
没有任何反应,我的数据还是一样,我的更新没有成功。
这是我在view.php
中的代码<?=
DetailView::widget([
'model' => $model,
'condensed' => true,
'hover' => true,
'mode' => DetailView::MODE_VIEW,
'panel' => [
'heading' => 'Data Details',
'type' => DetailView::TYPE_INFO,
],
'attributes' => [
'product',
'productId',
'distDate',
'created_at',
'created_by',
[
'attribute' => 'is_exported',
'value' => $model->isExported->name,
],
],
'buttons1' => '{update}',
])
?>
为什么插件没有保存编辑的数据?我的代码有什么问题?
更新:
这是我控制器中的操作:
public function actionUpdate($id) {
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->productId]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
我用的是纯action,我没有改Controller里面的代码
这是我的模型
<?php
namespace app\modules\vatout\models;
use Yii;
class VatoutFakturOut extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'vatout_faktur_out';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['user_id', 'parent_id', 'product'], 'required'],
[['user_id', 'parent_id', 'is_exported'], 'integer'],
[['distDate', 'updated_at', 'created_at'], 'safe'],
[['updated_by', 'created_by'], 'string', 'max' => 16],
[['product'], 'string', 'max' => 128],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'producrID' => 'Product ID',
'user_id' => 'User ID',
'parent_id' => 'Parent ID',
'distDate' => 'Dist Date',
'Product' => 'Product',
'is_exported' => 'Is Exported',
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getIsExported()
{
return $this->hasOne(VatoutStatus::className(), ['id' => 'is_exported']);
}
}
第$model = $this->findModel($id);
行:
您在 Controller 上使用 $this
,因此它会尝试从数据库(不存在)中查找控制器的数据。此外,控制器中没有这样的方法 findModel()
,这应该用于具有 ActiveRecord
扩展名的模型。正确的用法是:
$model = VatoutFakturOut::findOne($id);
不过,这个widget好像没有传任何$id
(所以actionUpdate($id)
里的参数$id
没用)。如何获得身份证件?来自 Yii::$app->request->post()['VatoutFakturOut']['productId']
。但是应该检查它是否被定义,否则你会得到一个警告:
$post = Yii::$app->request->post();
if (empty($post['VatoutFakturOut']['productId'])) {
throw new NotFoundHttpException('Not found.');
}
第三件事是您赋予用户编辑 ID 的能力(即使它没有被覆盖)...这是您不应该做的事情。我会稍微更改视图文件的代码:
'attributes' => [
'product',
[
'attribute' => 'productId',
'options' => ['readonly' => true],
],
'distDate',
'created_at',
'created_by',
[
'attribute' => 'is_exported',
'value' => $model->isExported->name,
],
],
假设productId
是主键。这将不允许用户编辑此字段,但它仍会发送到控制器。
最终结果:
public function actionUpdate()
{
$post = Yii::$app->request->post();
if (empty($post['VatoutFakturOut']['id'])) {
throw new NotFoundHttpException('VatoutFakturOut not found.');
}
$model = VatoutFakturOut::findOne($post['VatoutFakturOut']['id']);
if ($model->load($post) && $model->save()) {
return $this->redirect(['view', 'id' => $model->productId]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}