如何报告非列输入字段的错误

时间:2015-10-20 01:59:22

标签: cakephp error-handling cakephp-3.0 cakephp-3.1

我有一个用于创建一批事件的表单。它有名称,描述,位置,开始和结束时间的输入,所有这些都是事件表中的列。它还有一些日期输入,使用dates.0.datedates.1.date等字段名称。

echo $this->Form->input('name');
echo $this->Form->input('description');
echo $this->Form->input('location');
echo $this->Form->input('start');
echo $this->Form->input('end');
for ($i = 0; $i < $this->request->data['repeat_count']; ++ $i) {
    echo $this->Form->input("dates.$i.date", ['type' => 'date']);
}

保存过程遍历提交的输入中的日期数组,创建一个包含其余数据的实体和每个数据的日期,并保存它。也就是说,生成的实体将具有名称,描述,位置,开始,结束和日期的字段。 (希望很清楚!)这部分工作得很好,并且它包含在transactional函数中,这样只有在所有事件都成功的情况下才会保存事件。

$event = $this->Events->newEntity(array_merge(
    $this->request->data, ['team_id' => $id, 'dates' => []]));

if (!$this->Events->connection()->transactional(function () use ($id, $event) {
    for ($i = 0; $i < $this->request->data['repeat_count']; ++ $i) {
        // Use $e for the entity that is actually saved, so the
        // $event entity isn't mangled
        $e = $this->Events->newEntity(array_merge(
            $this->request->data,
            [
                'team_id' => $id,
                'date' => $this->request->data['dates'][$i]['date']
            ]
        ));
        $this->Events->save($e);
    }
    if ($event->errors()) {
        $this->Flash->warning(__('The event could not be saved. Please correct the errors below and try again.'));
        return false;
    }
    return false;
})) {
    $this->set(compact('event'));
    return;
}

问题在于提供无效日期。实体未保存,错误正确位于$e->errors('date')。但我无法弄清楚如何以日期为基础向用户报告该错误。从the entity documentation推断并使用其他地方标准的点符号,我尝试了$event->errors("dates.$i.date", $e->errors('date'));,并确认在呈现视图时实体中的错误列表中保留了任何此类错误(即如果我使用debug($event->errors());)。但是当我创建输入字段时,错误日期没有错误消息。它们都有提交的值,只是没有错误。

尝试使用“日期”代替“日期”作为字段名称的基础(例如date.0.date而不是dates.0.date),以查看是否由于“日期”而跳过错误检查不是表中的列,但这只是在我验证其余数据时导致验证错误,所以我没有进一步追求该选项。

我在其他地方有一些代码可以设置关联实体的错误,如果转换为这种情况,它们看起来像$event->dates[0]->errors($e->errors('date'));,但是$event与称为日期的东西无关,所以我不知道看看如何在这里工作。我尝试在dates实体中创建$event作为数组,但是分配$event['dates'][$i] = $this->Events->newEntity(...);会导致PHP警告:“重载元素的间接修改无效”,实体被丢弃。也许手动创建一些ArrayContext对象并将错误分配给它?我没有立即明白如何做到这一点。

0 个答案:

没有答案