我有一个用于创建一批事件的表单。它有名称,描述,位置,开始和结束时间的输入,所有这些都是事件表中的列。它还有一些日期输入,使用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')
。但我无法弄清楚如何以日期为基础向用户报告该错误。从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对象并将错误分配给它?我没有立即明白如何做到这一点。