* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) */ namespace PrestaShop\Module\AutoUpgrade; use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration; use PrestaShop\Module\AutoUpgrade\Twig\Block\RollbackForm; use PrestaShop\Module\AutoUpgrade\Twig\Block\UpgradeButtonBlock; use PrestaShop\Module\AutoUpgrade\Twig\Block\UpgradeChecklist; use PrestaShop\Module\AutoUpgrade\Twig\Form\BackupOptionsForm; use PrestaShop\Module\AutoUpgrade\Twig\Form\FormRenderer; use PrestaShop\Module\AutoUpgrade\Twig\Form\UpgradeOptionsForm; use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator; use Twig\Environment; /** * Constructs the upgrade page. */ class UpgradePage { const TRANSLATION_DOMAIN = 'Modules.Autoupgrade.Admin'; /** * @var Environment */ private $twig; /** * @var UpgradeConfiguration */ private $config; /** * @var Translator */ private $translator; /** * @var UpgradeSelfCheck */ private $upgradeSelfCheck; /** * @var string */ private $autoupgradePath; /** * @var Upgrader */ private $upgrader; /** * @var string */ private $prodRootPath; /** * @var string */ private $adminPath; /** * @var string */ private $currentIndex; /** * @var string */ private $token; /** * @var string */ private $backupName; /** * @var string */ private $downloadPath; /** * @var BackupFinder */ private $backupFinder; /** * @param Environment $twig */ public function __construct( UpgradeConfiguration $config, $twig, Translator $translator, UpgradeSelfCheck $upgradeSelfCheck, Upgrader $upgrader, BackupFinder $backupFinder, string $autoupgradePath, string $prodRootPath, string $adminPath, string $currentIndex, string $token, string $backupName, string $downloadPath ) { $this->config = $config; $this->translator = $translator; $this->upgrader = $upgrader; $this->upgradeSelfCheck = $upgradeSelfCheck; $this->autoupgradePath = $autoupgradePath; $this->prodRootPath = $prodRootPath; $this->adminPath = $adminPath; $this->currentIndex = $currentIndex; $this->token = $token; $this->backupName = $backupName; $this->twig = $twig; $this->downloadPath = $downloadPath; $this->backupFinder = $backupFinder; } public function display(string $ajaxResult): string { $twig = $this->twig; $translationDomain = self::TRANSLATION_DOMAIN; $errMessageData = $this->getErrorMessage(); if (!empty($errMessageData)) { return $twig ->render('@ModuleAutoUpgrade/error.html.twig', $errMessageData); } $templateData = [ 'psBaseUri' => __PS_BASE_URI__, 'translationDomain' => $translationDomain, 'jsParams' => $this->getJsParams($ajaxResult), 'rollbackForm' => $this->getRollbackFormVars(), 'backupOptions' => $this->getBackupOptionsForm(), 'upgradeOptions' => $this->getUpgradeOptionsForm(), 'currentIndex' => $this->currentIndex, 'token' => $this->token, ]; $templateData = array_merge( $templateData, $this->getChecklistBlockVars(), $this->getUpgradeButtonBlockVars(), $this->getRollbackFormVars() ); return $twig->render('@ModuleAutoUpgrade/main.html.twig', $templateData); } /** * @return array */ private function getChecklistBlockVars(): array { return (new UpgradeChecklist( $this->twig, $this->upgradeSelfCheck, $this->currentIndex, $this->token ))->getTemplateVars(); } /** * @return array */ private function getUpgradeButtonBlockVars(): array { return (new UpgradeButtonBlock( $this->twig, $this->translator, $this->config, $this->upgrader, $this->upgradeSelfCheck, $this->downloadPath, $this->token ))->getTemplateVars(); } /** * @return array */ private function getRollbackFormVars(): array { return (new RollbackForm($this->twig, $this->backupFinder)) ->getTemplateVars(); } private function getBackupOptionsForm(): string { $formRenderer = new FormRenderer($this->config, $this->twig, $this->translator); return (new BackupOptionsForm($this->translator, $formRenderer)) ->render(); } private function getUpgradeOptionsForm(): string { $formRenderer = new FormRenderer($this->config, $this->twig, $this->translator); return (new UpgradeOptionsForm($this->translator, $formRenderer)) ->render(); } /** * @return array */ private function getErrorMessage(): array { $translator = $this->translator; // PrestaShop demo mode if (defined('_PS_MODE_DEMO_') && true == _PS_MODE_DEMO_) { return [ 'message' => $translator->trans('This functionality has been disabled.'), ]; } if (!file_exists($this->autoupgradePath . DIRECTORY_SEPARATOR . 'ajax-upgradetab.php')) { return [ 'message' => $translator->trans( '[TECHNICAL ERROR] ajax-upgradetab.php is missing. Please reinstall or reset the module.' ), ]; } return []; } /** * @param string $ajaxResult Json encoded response data * * @return array */ private function getJsParams(string $ajaxResult): array { // relative admin dir $adminDir = trim(str_replace($this->prodRootPath, '', $this->adminPath), DIRECTORY_SEPARATOR); $translator = $this->translator; return [ 'psBaseUri' => __PS_BASE_URI__, '_PS_MODE_DEV_' => (defined('_PS_MODE_DEV_') && true == _PS_MODE_DEV_), 'PS_AUTOUP_BACKUP' => $this->config->shouldBackupFilesAndDatabase(), 'adminDir' => $adminDir, 'adminUrl' => __PS_BASE_URI__ . $adminDir, 'token' => $this->token, 'firstTimeParams' => json_decode($ajaxResult), 'ajaxUpgradeTabExists' => file_exists($this->autoupgradePath . DIRECTORY_SEPARATOR . 'ajax-upgradetab.php'), 'currentIndex' => $this->currentIndex, 'tab' => 'AdminSelfUpgrade', 'channel' => $this->config->get('channel'), 'autoupgrade' => [ 'version' => $this->upgradeSelfCheck->getModuleVersion(), ], 'translation' => [ 'confirmDeleteBackup' => $translator->trans('Are you sure you want to delete this backup?'), 'delete' => $translator->trans('Delete'), 'updateInProgress' => $translator->trans('An update is currently in progress... Click "OK" to abort.'), 'upgradingPrestaShop' => $translator->trans('Upgrading PrestaShop'), 'upgradeComplete' => $translator->trans('Upgrade complete'), 'upgradeCompleteWithWarnings' => $translator->trans('Upgrade complete, but warning notifications has been found.'), 'startingRestore' => $translator->trans('Starting restoration...'), 'restoreComplete' => $translator->trans('Restoration complete.'), 'cannotDownloadFile' => $translator->trans('Your server cannot download the file. Please upload it first by ftp in your admin/autoupgrade directory'), 'jsonParseErrorForAction' => $translator->trans('Javascript error (parseJSON) detected for action '), 'endOfProcess' => $translator->trans('End of process'), 'processCancelledCheckForRestore' => $translator->trans('Operation canceled. Checking for restoration...'), 'confirmRestoreBackup' => $translator->trans('Do you want to restore %s?', [$this->backupName]), 'processCancelledWithError' => $translator->trans('Operation canceled. An error happened.'), 'missingAjaxUpgradeTab' => $translator->trans('[TECHNICAL ERROR] ajax-upgradetab.php is missing. Please reinstall the module.'), 'clickToRefreshAndUseNewConfiguration' => $translator->trans('Click to refresh the page and use the new configuration'), 'errorDetectedDuring' => $translator->trans('Error detected during'), 'downloadTimeout' => $translator->trans('The request exceeded the max_time_limit. Please change your server configuration.'), 'seeOrHideList' => $translator->trans('See or hide the list'), 'coreFiles' => $translator->trans('Core file(s)'), 'mailFiles' => $translator->trans('Mail file(s)'), 'translationFiles' => $translator->trans('Translation file(s)'), 'linkAndMd5CannotBeEmpty' => $translator->trans('Link and MD5 hash cannot be empty'), 'needToEnterArchiveVersionNumber' => $translator->trans('You need to enter the version number associated with the archive.'), 'noArchiveSelected' => $translator->trans('No archive has been selected.'), 'needToEnterDirectoryVersionNumber' => $translator->trans('You need to enter the version number associated with the directory.'), 'confirmSkipBackup' => $translator->trans('Please confirm that you want to skip the backup.'), 'confirmPreserveFileOptions' => $translator->trans('Please confirm that you want to preserve file options.'), 'lessOptions' => $translator->trans('Less options'), 'moreOptions' => $translator->trans('More options (Expert mode)'), 'filesWillBeDeleted' => $translator->trans('These files will be deleted'), 'filesWillBeReplaced' => $translator->trans('These files will be replaced'), 'noXmlSelected' => $translator->trans('No XML file has been selected.'), 'noArchiveAndXmlSelected' => $translator->trans('No archive and no XML file have been selected.'), ], ]; } }