45 lines
1.6 KiB
PHP
45 lines
1.6 KiB
PHP
|
|
<?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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|