persistenceManager = $persistenceManager; } /** * Prefixes / namespaces the given name with the form field prefix */ protected function prefixFieldName(string $fieldName): string { if ($fieldName === '') { return ''; } $viewHelperVariableContainer = $this->renderingContext->getViewHelperVariableContainer(); if (!$viewHelperVariableContainer->exists(FormViewHelper::class, 'fieldNamePrefix')) { return $fieldName; } $fieldNamePrefix = (string)$viewHelperVariableContainer->get(FormViewHelper::class, 'fieldNamePrefix'); if ($fieldNamePrefix === '') { return $fieldName; } $fieldNameSegments = explode('[', $fieldName, 2); $fieldName = $fieldNamePrefix . '[' . $fieldNameSegments[0] . ']'; if (count($fieldNameSegments) > 1) { $fieldName .= '[' . $fieldNameSegments[1]; } return $fieldName; } /** * Renders a hidden form field containing the technical identity of the given object. * * @param mixed $object Object to create the identity field for. Non-objects are ignored. * @param string|null $name Name * @return string A hidden field containing the Identity (uid) of the given object * @see \TYPO3\CMS\Extbase\Mvc\Controller\Argument::setValue() */ protected function renderHiddenIdentityField(mixed $object, ?string $name): string { if ($object instanceof LazyLoadingProxy) { $object = $object->_loadRealInstance(); } if (!is_object($object) || !($object instanceof AbstractDomainObject) || ($object->_isNew() && !$object->_isClone())) { return ''; } // Intentionally NOT using PersistenceManager::getIdentifierByObject here. // Using that one breaks re-submission of data in forms in case of an error. $identifier = $object->getUid(); if ($identifier === null) { return LF . '' . LF; } $name = $this->prefixFieldName($name ?? '') . '[__identity]'; $this->registerFieldNameForFormTokenGeneration($name); $endingSlash = ($this->shouldUseXHtmlSlash() ? '/' : ''); return LF . '' . LF; } /** * Register a field name for inclusion in the HMAC / Form Token generation */ protected function registerFieldNameForFormTokenGeneration(string $fieldName): void { $viewHelperVariableContainer = $this->renderingContext->getViewHelperVariableContainer(); if ($viewHelperVariableContainer->exists(FormViewHelper::class, 'formFieldNames')) { $formFieldNames = $viewHelperVariableContainer->get(FormViewHelper::class, 'formFieldNames'); } else { $formFieldNames = []; } $formFieldNames[] = $fieldName; $viewHelperVariableContainer->addOrUpdate(FormViewHelper::class, 'formFieldNames', $formFieldNames); } protected function shouldUseXHtmlSlash(): bool { return DocType::createFromRequest($this->renderingContext->getAttribute(ServerRequestInterface::class))->isXmlCompliant(); } }