|null $incomingFieldArray * @param-out array|null $incomingFieldArray */ public function processDatamap_preProcessFieldArray( ?array &$incomingFieldArray, string $table, string|int $id, DataHandler $dataHandler, ): void { if ($table !== 'form_definition') { return; } $isUpdate = MathUtility::canBeInterpretedAsInteger($id); $command = $isUpdate ? FormDefinitionPersistenceCommand::Update : FormDefinitionPersistenceCommand::Create; $recordIdentifier = $isUpdate ? (int)$id : (string)$id; if (!$this->guard->isInvocationAllowed($command, $recordIdentifier, $incomingFieldArray)) { $incomingFieldArray = null; $dataHandler->log( $table, $isUpdate ? (int)$id : 0, $isUpdate ? SystemLogDatabaseAction::UPDATE : SystemLogDatabaseAction::INSERT, null, SystemLogErrorClassification::USER_ERROR, 'Persisting form definition "%s" via DataHandler is denied', null, [$id], ); return; } $this->guard->consumeInvocation($command, $recordIdentifier, $incomingFieldArray); } /** * Blocks unauthorised delete commands on form_definition records. * * Sets $commandIsProcessed to true (preventing DataHandler's built-in * delete) when no COMMAND_FORM_DELETE grant is pending. This mirrors the * FilePersistenceSlot pattern for FAL-based form definitions. */ public function processCmdmap( string $command, string $table, int|string $id, mixed $value, bool &$commandIsProcessed, DataHandler $dataHandler, ): void { if ($table !== 'form_definition' || $command !== 'delete') { return; } if (!$this->guard->isInvocationAllowed(FormDefinitionPersistenceCommand::Delete, (int)$id)) { $commandIsProcessed = true; $dataHandler->log( $table, (int)$id, SystemLogDatabaseAction::DELETE, null, SystemLogErrorClassification::USER_ERROR, 'Deleting form definition "%s" via DataHandler is denied', null, [$id], ); return; } $this->guard->consumeInvocation(FormDefinitionPersistenceCommand::Delete, (int)$id); } }