view->assign('controllerName', 'ManageBackups'); $extensionOptions = $this->configurationService->menuExtList(); $this->assignViewWidthMenuVariables('extension', $extensionOptions); $this->initializeBackupObject($langFile); $this->prepareManageBackupsViewMainSectionContent(); if ($showDiff) { $this->generateDiffContent($fileName); } } catch (LFException $e) { $this->addLFEFlashMessage($e); } $this->commonViewRenderingActionSettings(); if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->view->assign('V11', FALSE); return NULL; } else { $this->view->assign('V11', TRUE); return $this->createBackendResponse(); } } /** * This action saves in session currently selected options from selection menus in manageBackups view. * It is called on change of selection of any select menu in searchConstant view. * * @param string $extensionSelection * @param string $extKey */ public function changeSelectionAction($extensionSelection = NULL, $extKey = ''): ?\Psr\Http\Message\ResponseInterface { $this->saveSelectionsInSession( $extensionSelection, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $extKey ); if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->redirect('manageBackups'); return NULL; } else { return $this->redirect('manageBackups'); } } /** * Clears extensionAndLangFileOptions cache, and in that way refreshes list of language file options in select box. * */ public function refreshLanguageFileListAction(): ?\Psr\Http\Message\ResponseInterface { $this->clearSelectOptionsCache('extensionAndLangFileOptions'); if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->redirect('manageBackups'); return NULL; } else { return $this->redirect('manageBackups'); } } /** * Prepares main section content of manageBackupsConstant view. * * @throws LFException */ protected function prepareManageBackupsViewMainSectionContent() { $backups = $this->makeBackupsList(); if (empty($backups)) { $this->addFlashMessage( LocalizationUtility::translate('failure.backup.noFiles', 'lfeditor'), '', $severity = AbstractMessage::NOTICE, $storeInSession = TRUE ); return; } $recoverLabelThead = strtoupper( substr(LocalizationUtility::translate('function.backupMgr.recover', 'lfeditor'), 0, 1) ); $differenceLabelThead = strtoupper( substr(LocalizationUtility::translate('function.backupMgr.diff.diff', 'lfeditor'), 0, 1) ); $this->view->assign('backups', $backups); $this->view->assign('recoverLabelThead', $recoverLabelThead); $this->view->assign('differenceLabelThead', $differenceLabelThead); } /** * Makes list of backups for use in fluid page. * * @return array */ protected function makeBackupsList() { $backups = []; $metaArray = $this->backupService->getBackupObj()->getMetaInfos(2); if (is_array($metaArray)) { $keys = array_keys($metaArray); foreach ($keys as $langFile) { foreach ($metaArray[$langFile] as $fileName => $informations) { $backup = []; // get path to filename $backupPath = $informations['pathBackup']; $pathSite = Environment::getPublicPath() . '/'; $file = Typo3Lib::fixFilePath($pathSite . '/' . $backupPath . '/' . $fileName); $origFile = Typo3Lib::fixFilePath( $this->session->getDataByKey('extensionSelection') . '/' . $langFile ); // check state if (!is_file($file)) { $backup['state'] = 'function.backupMgr.missing'; } elseif (!is_file($origFile)) { $backup['state'] = 'lang.file.missing'; } else { $backup['state'] = 'function.backupMgr.ok'; } $backup['date'] = date('Y-m-d H:i:s', $informations['createdAt']); $backup['langFile'] = $langFile; $backup['fileName'] = $fileName; $backups[] = $backup; } } } return $backups; } /** * Deletes all backups. * */ public function deleteAllBackupAction(): ?\Psr\Http\Message\ResponseInterface { try { $this->initializeBackupObject(); $delFiles = []; $metaArray = $this->backupService->getBackupObj()->getMetaInfos(2); foreach ($metaArray as $langFile => $metaPiece) { $files = array_keys($metaPiece); foreach ($files as $filename) { $delFiles[$filename] = $langFile; } } $this->backupService->execBackupDelete($delFiles); $this->addFlashMessage( LocalizationUtility::translate('function.backupMgr.success.deleteAll', 'lfeditor'), '', $severity = AbstractMessage::OK, $storeInSession = TRUE ); } catch (LFException $e) { $this->addLFEFlashMessage($e); } if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->redirect('manageBackups'); return NULL; } else { return $this->redirect('manageBackups'); } } /** * Deletes backup. * * @param string $fileName * @param string $langFile * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException */ public function deleteBackupAction($fileName, $langFile): ?\Psr\Http\Message\ResponseInterface { try { $this->initializeBackupObject($langFile); $delFiles = []; $delFiles[$fileName] = ''; $this->backupService->execBackupDelete($delFiles); $this->addFlashMessage( LocalizationUtility::translate('function.backupMgr.success.delete', 'lfeditor'), '', $severity = AbstractMessage::OK, $storeInSession = TRUE ); } catch (LFException $e) { $this->addLFEFlashMessage($e); } $this->redirect('manageBackups'); if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->redirect('manageBackups'); return NULL; } else { return $this->redirect('manageBackups'); } } /** * Uses backup to recover changes. * * @param string $fileName * @param string $langFile * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException */ public function recoverBackupAction($fileName, $langFile): ?\Psr\Http\Message\ResponseInterface { try { $this->initializeBackupObject($langFile); // set backup file $metaArray = $this->backupService->getBackupObj()->getMetaInfos(3); $pathSite = Environment::getPublicPath() . '/'; $information = [ 'absPath' => $pathSite . $metaArray[$fileName]['pathBackup'], 'relFile' => $fileName, ]; $this->backupService->getBackupObj()->setVar($information); $this->backupService->getBackupObj()->readFile(); // read original file $this->configurationService->initFileObject( $this->backupService->getBackupObj()->getVar('langFile'), Typo3Lib::fixFilePath($pathSite . '/' . $this->backupService->getBackupObj()->getVar('extPath')) ); // restore $this->backupService->execBackupRestore(); $this->addFlashMessage( LocalizationUtility::translate('function.backupMgr.success.restore', 'lfeditor'), '', $severity = AbstractMessage::OK, $storeInSession = TRUE ); } catch (LFException $e) { $this->addLFEFlashMessage($e); } if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->redirect('manageBackups'); return NULL; } else { return $this->redirect('manageBackups'); } } /** * Shows differences between backup and original. * * @param string $fileName * @param string $langFile * @return \Psr\Http\Message\ResponseInterface|null * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException */ public function showDifferenceBackupAction($fileName, $langFile): ?\Psr\Http\Message\ResponseInterface { if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<')) { $this->redirect( 'manageBackups', NULL, NULL, ['fileName' => $fileName, 'langFile' => $langFile, 'showDiff' => TRUE] ); return NULL; } else { return $this->redirect( 'manageBackups', NULL, NULL, ['fileName' => $fileName, 'langFile' => $langFile, 'showDiff' => TRUE] ); } } /** * Initializes backup object. * * @param string $langFile * @throws LFException * @throws \Exception * @return void */ protected function initializeBackupObject($langFile = '') { $pathSite = Environment::getPublicPath() . '/'; $information = [ 'extPath' => SgLib::trimPath($pathSite, $this->session->getDataByKey('extensionSelection')), 'langFile' => $langFile, ]; $this->backupService->initBackupObject('base', $information); } /** * Generates content which illustrates differences between backup and current state. * * @param string $fileName * @return void */ protected function generateDiffContent($fileName) { $localLangDiff = NULL; $metaDiff = NULL; $pathSite = Environment::getPublicPath() . '/'; // set backup file $metaArray = $this->backupService->getBackupObj()->getMetaInfos(3); $informations = [ 'absPath' => Typo3Lib::fixFilePath( $pathSite . '/' . $metaArray[$fileName]['pathBackup'] ), 'relFile' => $fileName, ]; $this->backupService->getBackupObj()->setVar($informations); // exec diff // read original file $this->configurationService->initFileObject( $this->backupService->getBackupObj()->getVar('langFile'), Typo3Lib::fixFilePath($pathSite . '/' . $this->backupService->getBackupObj()->getVar('extPath')) ); // read backup file $this->backupService->getBackupObj()->readFile(); // get language data $originalLocalLang = $this->configurationService->getFileObj()->getLocalLangData(); $backupLocalLang = $this->backupService->getBackupObj()->getLocalLangData(); // get meta data $origMeta = $this->configurationService->getFileObj()->getMetaData(); $backupMeta = $this->backupService->getBackupObj()->getMetaData(); SgLib::fixMetaAttributes($origMeta); unset($originalLocalLang['trans-unit']); $localLangDiff = Functions::getBackupDiff(0, $originalLocalLang, $backupLocalLang); $metaDiff = Functions::getMetaDiff(0, $origMeta, $backupMeta); // generate diff if (is_countable($localLangDiff) ? count($localLangDiff) : 0) { $this->outputManageBackupsDiff( $localLangDiff, $metaDiff, $originalLocalLang, $backupLocalLang, $this->configurationService->getFileObj()->getOriginLangData(), $this->backupService->getBackupObj()->getOriginLangData(), $origMeta, $backupMeta ); } } /** * Generates output of difference between backup and original. * * @param array $diff language content (difference between backup and origin) * @param array $metaDiff meta content (difference between backup and origin) * @param array $origLang original language content * @param array $backupLang backup language content * @param array $origOriginLang original origins of each language * @param array $backupOriginLang backup origins of each language * @param array $origMeta original meta content * @param array $backupMeta backup meta content * @return void */ protected function outputManageBackupsDiff( $diff, $metaDiff, $origLang, $backupLang, $origOriginLang, $backupOriginLang, $origMeta, $backupMeta ) { $differences = []; // meta entry if (count($metaDiff)) { $difference = []; $difference['legend'] = LocalizationUtility::translate('function.backupMgr.diff.meta', 'lfeditor'); $difference['constants'] = []; foreach ($metaDiff as $label => $value) { $constant = []; $constant['value'] = $value; $constant['label'] = $label; if (!isset($backupMeta[$label])) { $constant['state'] = self::LANG_CONST_ADDED; } elseif (!isset($origMeta[$label])) { $constant['state'] = self::LANG_CONST_DELETED; } else { $constant['state'] = self::LANG_CONST_NORMAL; } $difference['constants'][] = $constant; } $differences[] = $difference; } // loop each language entry foreach ($diff as $langKey => $data) { $difference = []; if (!(is_countable($data) ? count($data) : 0) && ($origOriginLang[$langKey] == $backupOriginLang[$langKey])) { continue; } try { $languageFile = Typo3Lib::transTypo3File($backupOriginLang[$langKey], FALSE); } catch (\Exception $e) { $languageFile = $backupOriginLang[$langKey]; } $difference['legend'] = $langKey . ' (' . $languageFile . ')'; $difference['constants'] = []; foreach ($data as $label => $value) { $constant = []; $constant['value'] = $value; $constant['label'] = $label; if (!isset($backupLang[$langKey][$label])) { $constant['state'] = self::LANG_CONST_ADDED; } elseif (!isset($origLang[$langKey][$label])) { $constant['state'] = self::LANG_CONST_DELETED; } else { $constant['state'] = self::LANG_CONST_NORMAL; } $difference['constants'][] = $constant; } $differences[] = $difference; } $this->view->assign('differences', $differences); } }