initial
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user