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());。しかし、入力フィールドを作成すると、日付が間違っていてもエラー メッセージは表示されません。それらにはすべて送信された値が含まれていますが、エラーはありません。

フィールド名のベースに "dates" の代わりに "date" を使用して (例:date.0.dateの代わりにdates.0.date)、"dates" がテーブルの列ではないためにエラー チェックをスキップしているかどうかを確認しましたが、これにより残りのデータを検証する時点で検証エラーが発生したため、そのオプションをそれ以上追求しませんでした。

関連するエンティティにエラーを設定するコードが他の場所にあり、この状況に変換すると のようになりますが$event->dates[0]->errors($e->errors('date'));$event日付と呼ばれるものに関連付けられていないため、ここでこれを機能させる方法がわかりません。datesエンティティに配列として作成してみたの$eventですが、代入$event['dates'][$i] = $this->Events->newEntity(...);すると「オーバーロードされた要素を間接的に変更しても効果がありません」というPHP警告が出て、エンティティが捨てられてしまいます。おそらく、手動で ArrayContext オブジェクトを作成し、それにエラーを割り当てますか? それを行う方法はすぐにはわかりません。

4

0 に答える 0