Yii2 Gii 生成创建视图不工作/保存但更新
Yii2 Gii generated create view not working / saving but update does
刚开始使用 Yii(两周前)。
TL;DR
通过 Gii 创建生成的视图不起作用,但更新可以,即使它们共享未编辑的表单和控制器。
问题:
我用的是Yii2 advanced app template.
然后我通过模型生成器生成了一个模型,并通过 CRUD 生成器controller/views。
我唯一改变的是从表单中删除两个日期时间字段 "created_at" 和 "created_by" 并添加一个 TimestampBehavior:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
// if you're using datetime instead of UNIX timestamp:
'value' => new Expression('NOW()'),
],
];
}
我遇到的奇怪情况是,更新有效,但创建无效。没有显示错误,只是停留在页面上或重新呈现?
这是来自控制器的未修改代码:
(if 中的“$model->save”应该将其保存到数据库中,我说得对吗?)
创建:
public function actionCreate()
{
$model = new Seminar();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
更新:
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
如果需要更多信息,请发表评论。
谢谢。
更新 - 解决方案
在两个有用的答案之后,我尝试转储错误并显示
array(1) { ["created_at"]=> array(1) { [0]=> string(32) "Created At darf nicht leer sein." } }
按照建议,我在规则的 "required" 部分留下了 "created_at"。清理干净后创建作品。
我认为它没有向我显示错误,因为我删除了表单中的字段,因为用户不应直接输入数据。
你显示的控制器没问题
一定是模型有问题。您可以通过编辑 actionCreate:
来检查问题出在哪里
public function actionCreate()
{
$model = new Seminar();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
var_dump($model->getErrors());
/*return $this->render('create', [
'model' => $model,
]);*/
}
}
现在,关于您的更改:因为您使用的是列名 created_at
和 updated_at
,您可以通过设置来简化行为:
public function behaviors()
{
return [
TimestampBehavior::className()
];
};
此外,如果字段 created_at
或 updated_at
存在,请检查您的模型 rules() 并将其删除。他们不再需要了。
检查模型中的规则,然后重试。另外,尝试使用 $model->save(false)
。它会在没有检查验证的情况下保存表单,所以问题是数据没有验证。
刚开始使用 Yii(两周前)。
TL;DR
通过 Gii 创建生成的视图不起作用,但更新可以,即使它们共享未编辑的表单和控制器。
问题:
我用的是Yii2 advanced app template.
然后我通过模型生成器生成了一个模型,并通过 CRUD 生成器controller/views。
我唯一改变的是从表单中删除两个日期时间字段 "created_at" 和 "created_by" 并添加一个 TimestampBehavior:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
// if you're using datetime instead of UNIX timestamp:
'value' => new Expression('NOW()'),
],
];
}
我遇到的奇怪情况是,更新有效,但创建无效。没有显示错误,只是停留在页面上或重新呈现?
这是来自控制器的未修改代码:
(if 中的“$model->save”应该将其保存到数据库中,我说得对吗?)
创建:
public function actionCreate()
{
$model = new Seminar();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
更新:
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
如果需要更多信息,请发表评论。 谢谢。
更新 - 解决方案
在两个有用的答案之后,我尝试转储错误并显示
array(1) { ["created_at"]=> array(1) { [0]=> string(32) "Created At darf nicht leer sein." } }
按照建议,我在规则的 "required" 部分留下了 "created_at"。清理干净后创建作品。 我认为它没有向我显示错误,因为我删除了表单中的字段,因为用户不应直接输入数据。
你显示的控制器没问题
一定是模型有问题。您可以通过编辑 actionCreate:
来检查问题出在哪里public function actionCreate()
{
$model = new Seminar();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
var_dump($model->getErrors());
/*return $this->render('create', [
'model' => $model,
]);*/
}
}
现在,关于您的更改:因为您使用的是列名 created_at
和 updated_at
,您可以通过设置来简化行为:
public function behaviors()
{
return [
TimestampBehavior::className()
];
};
此外,如果字段 created_at
或 updated_at
存在,请检查您的模型 rules() 并将其删除。他们不再需要了。
检查模型中的规则,然后重试。另外,尝试使用 $model->save(false)
。它会在没有检查验证的情况下保存表单,所以问题是数据没有验证。