/** * Builds the expert configuration form (TYPO3 7+). * * @param array $row * @return string */ protected function buildForm(array $row) { $record = array('uid' => static::virtualRecordId, 'pid' => 0); $record = array_merge($record, $row); // Trick to use a virtual record $dataProviders =& $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord']; $originalProvider = 'TYPO3\\CMS\\Backend\\Form\\FormDataProvider\\DatabaseEditRow'; $databaseEditRowProvider = $dataProviders[$originalProvider]; unset($dataProviders[$originalProvider]); \Causal\ImageAutoresize\Backend\Form\FormDataProvider\VirtualDatabaseEditRow::initialize($record); $dataProviders['Causal\\ImageAutoresize\\Backend\\Form\\FormDataProvider\\VirtualDatabaseEditRow'] = $databaseEditRowProvider; /** @var \TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord $formDataGroup */ $formDataGroup = GeneralUtility::makeInstance('TYPO3\\CMS\\Backend\\Form\\FormDataGroup\\TcaDatabaseRecord'); /** @var \TYPO3\CMS\Backend\Form\FormDataCompiler $formDataCompiler */ $formDataCompiler = GeneralUtility::makeInstance('TYPO3\\CMS\\Backend\\Form\\FormDataCompiler', $formDataGroup); /** @var \TYPO3\CMS\Backend\Form\NodeFactory $nodeFactory */ $nodeFactory = GeneralUtility::makeInstance('TYPO3\\CMS\\Backend\\Form\\NodeFactory'); $formDataCompilerInput = array('tableName' => static::virtualTable, 'vanillaUid' => $record['uid'], 'command' => 'edit', 'returnUrl' => ''); // Load the configuration of virtual table 'tx_imageautoresize' $this->loadVirtualTca(); $formData = $formDataCompiler->compile($formDataCompilerInput); $formData['renderType'] = 'outerWrapContainer'; $formResult = $nodeFactory->create($formData)->render(); // Remove header and footer $html = preg_replace('/<h1>.*<\\/h1>/', '', $formResult['html']); $startFooter = strrpos($html, '<div class="help-block text-right">'); $endTag = '</div>'; if ($startFooter !== false) { $endFooter = strpos($html, $endTag, $startFooter); $html = substr($html, 0, $startFooter) . substr($html, $endFooter + strlen($endTag)); } $formResult['html'] = ''; $formResult['doSaveFieldName'] = 'doSave'; // @todo: Put all the stuff into FormEngine as final "compiler" class // @todo: This is done here for now to not rewrite JStop() // @todo: and printNeededJSFunctions() now $this->formResultCompiler->mergeResult($formResult); // Combine it all $formContent = ' <!-- EDITING FORM --> ' . $html . ' <input type="hidden" name="returnUrl" value="' . htmlspecialchars($this->retUrl) . '" /> <input type="hidden" name="closeDoc" value="0" /> <input type="hidden" name="doSave" value="0" /> <input type="hidden" name="_serialNumber" value="' . md5(microtime()) . '" /> <input type="hidden" name="_scrollPosition" value="" />'; return $formContent; }
/** * Creates the editing form with FormEnigne, based on the input from GPvars. * * @return string HTML form elements wrapped in tables */ public function makeEditForm() { // Initialize variables: $this->elementsData = array(); $this->errorC = 0; $this->newC = 0; $editForm = ''; $trData = null; $beUser = $this->getBackendUser(); // Traverse the GPvar edit array // Tables: foreach ($this->editconf as $table => $conf) { if (is_array($conf) && $GLOBALS['TCA'][$table] && $beUser->check('tables_modify', $table)) { // Traverse the keys/comments of each table (keys can be a commalist of uids) foreach ($conf as $cKey => $command) { if ($command == 'edit' || $command == 'new') { // Get the ids: $ids = GeneralUtility::trimExplode(',', $cKey, true); // Traverse the ids: foreach ($ids as $theUid) { // Don't save this document title in the document selector if the document is new. if ($command === 'new') { $this->dontStoreDocumentRef = 1; } /** @var TcaDatabaseRecord $formDataGroup */ $formDataGroup = GeneralUtility::makeInstance(TcaDatabaseRecord::class); /** @var FormDataCompiler $formDataCompiler */ $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup); /** @var NodeFactory $nodeFactory */ $nodeFactory = GeneralUtility::makeInstance(NodeFactory::class); try { // Reset viewId - it should hold data of last entry only $this->viewId = 0; $this->viewId_addParams = ''; $formDataCompilerInput = ['tableName' => $table, 'vanillaUid' => (int) $theUid, 'command' => $command, 'returnUrl' => $this->R_URI]; if (is_array($this->overrideVals) && is_array($this->overrideVals[$table])) { $formDataCompilerInput['overrideValues'] = $this->overrideVals[$table]; } $formData = $formDataCompiler->compile($formDataCompilerInput); // Set this->viewId if possible if ($command === 'new' && $table !== 'pages' && !empty($formData['parentPageRow']['uid'])) { $this->viewId = $formData['parentPageRow']['uid']; } else { if ($table == 'pages') { $this->viewId = $formData['databaseRow']['uid']; } elseif (!empty($formData['parentPageRow']['uid'])) { $this->viewId = $formData['parentPageRow']['uid']; // Adding "&L=xx" if the record being edited has a languageField with a value larger than zero! if (!empty($formData['processedTca']['ctrl']['languageField']) && is_array($formData['databaseRow'][$formData['processedTca']['ctrl']['languageField']]) && $formData['databaseRow'][$formData['processedTca']['ctrl']['languageField']][0] > 0) { $this->viewId_addParams = '&L=' . $formData['databaseRow'][$formData['processedTca']['ctrl']['languageField']][0]; } } } // Determine if delete button can be shown $deleteAccess = false; if ($command === 'edit') { $permission = $formData['userPermissionOnPage']; if ($formData['tableName'] === 'pages') { $deleteAccess = $permission & Permission::PAGE_DELETE ? true : false; } else { $deleteAccess = $permission & Permission::CONTENT_EDIT ? true : false; } } // Display "is-locked" message: if ($command === 'edit') { $lockInfo = BackendUtility::isRecordLocked($table, $formData['databaseRow']['uid']); if ($lockInfo) { /** @var $flashMessage \TYPO3\CMS\Core\Messaging\FlashMessage */ $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, htmlspecialchars($lockInfo['msg']), '', FlashMessage::WARNING); /** @var $flashMessageService \TYPO3\CMS\Core\Messaging\FlashMessageService */ $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); /** @var $defaultFlashMessageQueue FlashMessageQueue */ $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier(); $defaultFlashMessageQueue->enqueue($flashMessage); } } // Record title if (!$this->storeTitle) { $this->storeTitle = $this->recTitle ? htmlspecialchars($this->recTitle) : BackendUtility::getRecordTitle($table, FormEngineUtility::databaseRowCompatibility($formData['databaseRow']), true); } $this->elementsData[] = array('table' => $table, 'uid' => $formData['databaseRow']['uid'], 'pid' => $formData['databaseRow']['pid'], 'cmd' => $command, 'deleteAccess' => $deleteAccess); if ($command !== 'new') { BackendUtility::lockRecords($table, $formData['databaseRow']['uid'], $table === 'tt_content' ? $formData['databaseRow']['pid'] : 0); } // Set list if only specific fields should be rendered. This will trigger // ListOfFieldsContainer instead of FullRecordContainer in OuterWrapContainer if ($this->columnsOnly) { if (is_array($this->columnsOnly)) { $formData['fieldListToRender'] = $this->columnsOnly[$table]; } else { $formData['fieldListToRender'] = $this->columnsOnly; } } $formData['renderType'] = 'outerWrapContainer'; $formResult = $nodeFactory->create($formData)->render(); $html = $formResult['html']; $formResult['html'] = ''; $formResult['doSaveFieldName'] = 'doSave'; // @todo: Put all the stuff into FormEngine as final "compiler" class // @todo: This is done here for now to not rewrite JStop() // @todo: and printNeededJSFunctions() now $this->formResultCompiler->mergeResult($formResult); // Seems the pid is set as hidden field (again) at end?! if ($command == 'new') { // @todo: looks ugly $html .= LF . '<input type="hidden"' . ' name="data[' . $table . '][' . $formData['databaseRow']['uid'] . '][pid]"' . ' value="' . $formData['databaseRow']['pid'] . '" />'; $this->newC++; } $editForm .= $html; } catch (AccessDeniedException $e) { $this->errorC++; // Try to fetch error message from "recordInternals" be user object // @todo: This construct should be logged and localized and de-uglified $message = $beUser->errorMsg; if (empty($message)) { // Create message from exception. $message = $e->getMessage() . ' ' . $e->getCode(); } $editForm .= $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.noEditPermission', true) . '<br /><br />' . htmlspecialchars($message) . '<br /><br />'; } } // End of for each uid } } } } return $editForm; }