Files

45 lines
1.6 KiB
PHP
Raw Permalink Normal View History

2026-06-11 19:03:29 +02:00
<?php
use Reservair\Logger\Logger;
class RsvFormProcessor {
/** Submit every element. If one fails, undo the ones that already succeeded. */
public function submit(RsvFormDefinition $definition, int $submit_id, RsvFormData $data): RsvFormSubmitResult {
global $rsv_form_registry;
$result = new RsvFormSubmitResult();
$committed = [];
foreach ($definition->getElements() as $element) {
$handler = $rsv_form_registry->get($element->getType());
if ($handler === null) {
$result->addError($element->getName(), 'handler_missing', 'No handler registered for element type ' . $element->getType());
$this->rollback_all($committed, $submit_id, $data, $result);
return $result;
}
if (!$handler->submit($element, $submit_id, $data->getElements(), $result)) {
$this->rollback_all($committed, $submit_id, $data, $result);
return $result;
}
$committed[] = [$handler, $element];
}
return $result;
}
/**
* @param array<int,array{0:RsvFormElementHandler,1:RsvFormElementDefinition}> $committed
*/
private function rollback_all(array $committed, int $submit_id, RsvFormData $data, RsvFormSubmitResult $result): void {
foreach (array_reverse($committed) as [$handler, $element]) {
try {
$handler->rollback($element, $submit_id, $data->getElements(), $result);
} catch (\Throwable $e) {
Logger::error($e);
}
}
}
}