2 declare(strict_types = 1);
18 use Symfony\Component\Yaml\Yaml;
75 $this->view->getModuleTemplate()->setModuleName($this->request->getPluginName() .
'_' . $this->request->getControllerName());
76 $this->view->getModuleTemplate()->setFlashMessageQueue($this->controllerContext->getFlashMessageQueue());
79 $this->view->assign(
'stylesheets', $this->
resolveResourcePaths($this->formSettings[
'formManager'][
'stylesheets']));
80 $this->view->assign(
'dynamicRequireJsModules', $this->formSettings[
'formManager'][
'dynamicRequireJsModules']);
82 if (!empty($this->formSettings[
'formManager'][
'javaScriptTranslationFile'])) {
95 $this->defaultViewObjectName = JsonView::class;
109 public function createAction(
string $formName,
string $templatePath,
string $prototypeName,
string $savePath)
111 if (!$this->formPersistenceManager->isAllowedPersistencePath($savePath)) {
116 throw new FormException(sprintf(
'The template path "%s" is not allowed', $templatePath), 1329233410);
118 if (empty($formName)) {
119 throw new FormException(
'No form name', 1472312204);
122 $templatePath = GeneralUtility::getFileAbsFileName($templatePath);
123 $form = Yaml::parse(file_get_contents($templatePath));
124 $form[
'label'] = $formName;
126 $form[
'prototypeName'] = $prototypeName;
128 $formPersistenceIdentifier = $this->formPersistenceManager->getUniquePersistenceIdentifier($form[
'identifier'], $savePath);
130 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'ext/form'][
'beforeFormCreate'] ?? [] as $className) {
131 $hookObj = GeneralUtility::makeInstance($className);
132 if (method_exists($hookObj,
'beforeFormCreate')) {
133 $form = $hookObj->beforeFormCreate(
134 $formPersistenceIdentifier,
141 'status' =>
'success',
142 'url' => $this->controllerContext->getUriBuilder()->uriFor(
'index', [
'formPersistenceIdentifier' => $formPersistenceIdentifier],
'FormEditor')
146 $this->formPersistenceManager->save($formPersistenceIdentifier, $form);
150 'message' => $e->getMessage(),
151 'code' => $e->getCode(),
158 $this->view->setVariablesToRender([
171 $this->defaultViewObjectName = JsonView::class;
183 public function duplicateAction(
string $formName,
string $formPersistenceIdentifier,
string $savePath)
185 if (!$this->formPersistenceManager->isAllowedPersistencePath($savePath)) {
188 if (!$this->formPersistenceManager->isAllowedPersistencePath($formPersistenceIdentifier)) {
192 $formToDuplicate = $this->formPersistenceManager->load($formPersistenceIdentifier);
193 $formToDuplicate[
'label'] = $formName;
196 $formPersistenceIdentifier = $this->formPersistenceManager->getUniquePersistenceIdentifier($formToDuplicate[
'identifier'], $savePath);
198 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'ext/form'][
'beforeFormDuplicate'] ?? [] as $className) {
199 $hookObj = GeneralUtility::makeInstance($className);
200 if (method_exists($hookObj,
'beforeFormDuplicate')) {
201 $formToDuplicate = $hookObj->beforeFormDuplicate(
202 $formPersistenceIdentifier,
209 'status' =>
'success',
210 'url' => $this->controllerContext->getUriBuilder()->uriFor(
'index', [
'formPersistenceIdentifier' => $formPersistenceIdentifier],
'FormEditor')
214 $this->formPersistenceManager->save($formPersistenceIdentifier, $formToDuplicate);
218 'message' => $e->getMessage(),
219 'code' => $e->getCode(),
226 $this->view->setVariablesToRender([
239 $this->defaultViewObjectName = JsonView::class;
251 if (!$this->formPersistenceManager->isAllowedPersistencePath($formPersistenceIdentifier)) {
256 $this->view->assign(
'formPersistenceIdentifier', $formPersistenceIdentifier);
259 $this->view->setVariablesToRender([
261 'formPersistenceIdentifier'
272 public function deleteAction(
string $formPersistenceIdentifier)
274 if (!$this->formPersistenceManager->isAllowedPersistencePath($formPersistenceIdentifier)) {
278 if (empty($this->databaseService->getReferencesByPersistenceIdentifier($formPersistenceIdentifier))) {
279 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'ext/form'][
'beforeFormDelete'] ?? [] as $className) {
280 $hookObj = GeneralUtility::makeInstance($className);
281 if (method_exists($hookObj,
'beforeFormDelete')) {
282 $hookObj->beforeFormDelete(
283 $formPersistenceIdentifier
288 $this->formPersistenceManager->delete($formPersistenceIdentifier);
291 $this->formSettings[
'formManager'][
'controller'],
292 $this->formSettings[
'formManager'][
'translationFile']
296 sprintf($controllerConfiguration[
'deleteAction'][
'errorMessage'], $formPersistenceIdentifier),
297 $controllerConfiguration[
'deleteAction'][
'errorTitle'],
317 $preparedAccessibleFormStorageFolders = [];
318 foreach ($this->formPersistenceManager->getAccessibleFormStorageFolders() as $identifier => $folder) {
320 if ($folder->getCombinedIdentifier() ===
'1:/user_upload/') {
324 $preparedAccessibleFormStorageFolders[] = [
325 'label' => $folder->getName(),
326 'value' => $identifier
330 if ($this->formSettings[
'persistenceManager'][
'allowSaveToExtensionPaths']) {
331 foreach ($this->formPersistenceManager->getAccessibleExtensionFolders() as $relativePath => $fullPath) {
332 $preparedAccessibleFormStorageFolders[] = [
333 'label' => $relativePath,
334 'value' => $relativePath
339 return $preparedAccessibleFormStorageFolders;
350 $formManagerAppInitialData = [
351 'selectablePrototypesConfiguration' => $this->formSettings[
'formManager'][
'selectablePrototypesConfiguration'],
354 'create' => $this->controllerContext->getUriBuilder()->uriFor(
'create'),
355 'duplicate' => $this->controllerContext->getUriBuilder()->uriFor(
'duplicate'),
356 'delete' => $this->controllerContext->getUriBuilder()->uriFor(
'delete'),
357 'references' => $this->controllerContext->getUriBuilder()->uriFor(
'references')
363 $formManagerAppInitialData,
364 $this->formSettings[
'formManager'][
'translationFile'] ??
null
366 return json_encode($formManagerAppInitialData);
376 $allReferencesForFileUid = $this->databaseService->getAllReferencesForFileUid();
377 $allReferencesForPersistenceIdentifier = $this->databaseService->getAllReferencesForPersistenceIdentifier();
379 $availableFormDefinitions = [];
380 foreach ($this->formPersistenceManager->listForms() as $formDefinition) {
383 isset($formDefinition[
'fileUid'])
384 && array_key_exists($formDefinition[
'fileUid'], $allReferencesForFileUid)
386 $referenceCount = $allReferencesForFileUid[$formDefinition[
'fileUid']];
387 } elseif (array_key_exists($formDefinition[
'persistenceIdentifier'], $allReferencesForPersistenceIdentifier)) {
388 $referenceCount = $allReferencesForPersistenceIdentifier[$formDefinition[
'persistenceIdentifier']];
391 $formDefinition[
'referenceCount'] = $referenceCount;
392 $availableFormDefinitions[] = $formDefinition;
395 return $availableFormDefinitions;
408 if (empty($persistenceIdentifier)) {
409 throw new \InvalidArgumentException(
'$persistenceIdentifier must not be empty.', 1477071939);
413 $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
415 $referenceRows = $this->databaseService->getReferencesByPersistenceIdentifier($persistenceIdentifier);
416 foreach ($referenceRows as &$referenceRow) {
417 $record = $this->
getRecord($referenceRow[
'tablename'], $referenceRow[
'recuid']);
421 $pageRecord = $this->
getRecord(
'pages', $record[
'pid']);
424 $referenceRow[
'tablename'] => [
425 $referenceRow[
'recuid'] =>
'edit'
432 'recordPageTitle' => is_array($pageRecord) ? $this->
getRecordTitle(
'pages', $pageRecord) :
'',
433 'recordTitle' => $this->
getRecordTitle($referenceRow[
'tablename'], $record,
true),
434 'recordIcon' => $iconFactory->getIconForRecord($referenceRow[
'tablename'], $record,
Icon::SIZE_SMALL)->render(),
435 'recordUid' => $referenceRow[
'recuid'],
436 'recordEditUrl' => $this->
getModuleUrl(
'record_edit', $urlParameters),
456 foreach ($this->formSettings[
'formManager'][
'selectablePrototypesConfiguration'] as $prototypesConfiguration) {
457 if ($prototypesConfiguration[
'identifier'] !== $prototypeName) {
460 foreach ($prototypesConfiguration[
'newFormTemplates'] as $templatesConfiguration) {
461 if ($templatesConfiguration[
'templatePath'] !== $templatePath) {
469 $templatePath = GeneralUtility::getFileAbsFileName($templatePath);
470 if (!is_file($templatePath)) {
485 $buttonBar = $this->view->getModuleTemplate()->getDocHeaderComponent()->getButtonBar();
487 $moduleName = $currentRequest->getPluginName();
491 $addFormButton = $buttonBar->makeLinkButton()
492 ->setDataAttributes([
'identifier' =>
'newForm'])
494 ->setTitle($this->
getLanguageService()->sL(
'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.create_new_form'))
495 ->setIcon($this->view->getModuleTemplate()->getIconFactory()->getIcon(
'actions-add',
Icon::SIZE_SMALL));
499 $reloadButton = $buttonBar->makeLinkButton()
500 ->setHref(GeneralUtility::getIndpEnv(
'REQUEST_URI'))
501 ->setTitle($this->
getLanguageService()->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.reload'))
502 ->setIcon($this->view->getModuleTemplate()->getIconFactory()->getIcon(
'actions-refresh',
Icon::SIZE_SMALL));
507 if ($mayMakeShortcut) {
509 if (count($getVars) === 0) {
510 $modulePrefix = strtolower(
'tx_' .
$extensionName .
'_' . $moduleName);
511 $getVars = [
'id',
'route', $modulePrefix];
514 $shortcutButton = $buttonBar->makeShortcutButton()
515 ->setModuleName($moduleName)
516 ->setDisplayName($this->
getLanguageService()->sL(
'LLL:EXT:form/Resources/Private/Language/Database.xlf:module.shortcut_name'))
517 ->setGetVariables($getVars);
530 $csConverter = GeneralUtility::makeInstance(CharsetConverter::class);
532 $formIdentifier = $csConverter->specCharsToASCII(
'utf-8', $formName);
533 $formIdentifier = preg_replace(
'/[^a-zA-Z0-9-_]/',
'', $formIdentifier);
534 $formIdentifier = lcfirst($formIdentifier);
535 return $formIdentifier;
545 protected function getRecord(
string $table,
int $uid)
558 protected function getRecordTitle(
string $table, array $row,
bool $prep =
false):
string
570 protected function getModuleUrl(
string $moduleName, array $urlParameters = []):
string
573 $uriBuilder = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\UriBuilder::class);
574 return (
string)
$uriBuilder->buildUriFromRoute($moduleName, $urlParameters);
604 return GeneralUtility::makeInstance(PageRenderer::class);