刚刚开始使用Yii(两周前)。
TL; DR
通过Gii生成的视图创建不起作用,但更新确实如此,即使它们共享未编辑的表单和控制器。
问题:
我使用Yii2 advanced app template。
然后我通过CRUD生成器通过模型生成器和控制器/视图生成模型。
我唯一改变的是从表单中删除两个日期时间字段“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”应该将其保存到数据库?)
CREATE:
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." } }
正如所建议的那样,我将“created_at”留在了规则的“必需”部分。清理后,创建工作。 我认为它没有向我显示错误,因为我删除了表单中的字段,因为用户不应该直接输入数据。
答案 0 :(得分:1)
你展示的控制器还可以。
模型一定有问题。您可以通过编辑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
在那里,请检查您的模型规则(),然后将其删除。他们不再需要了。
答案 1 :(得分:1)
检查模型中的规则,然后重试。另外,请尝试使用$model->save(false)
。它将保存表单而不进行检查验证,因此问题是数据无法验证。