0

刚开始使用 Yii(两周前)。

TL;博士

通过 Gii 生成的视图创建不起作用,但更新可以,即使它们共享未编辑的表单和控制器。

问题:

我使用Yii2 高级应用模板

然后我通过模型生成器生成模型,并通过 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”应该将其保存到数据库中?)

创造:

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”留在了规则的“必需”部分。清理后创建作品。我认为它没有显示错误,因为我删除了表单中的字段,因为用户不应该直接输入数据。

4

2 回答 2

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,然后将其删除。他们不再需要了。

于 2015-12-02T16:08:24.740 回答
1

检查模型中的规则,然后重试。另外,尝试使用$model->save(false). 它将在没有检查验证的情况下保存表单,所以问题是数据没有验证。

于 2015-12-02T16:09:18.873 回答