3

我有一个用于创建一批事件的表格。它有名称、描述、位置、开始和结束时间的输入,所有这些都是事件表中的列。它还有许多日期输入,使用字段名称,如dates.0.date,dates.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'). 但我不知道如何按日期向用户报告该错误。从实体文档推断并使用其他地方标准的点表示法,我已经尝试过,并确认在呈现视图时(即,如果我使用)$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 对象并将错误分配给它?如何做到这一点对我来说不是很明显。

4

0 回答 0