/** * Create the panel of buttons for submitting the form or otherwise * perform operations. * * @return void */ protected function getButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); // Shortcut $shortcutButton = $buttonBar->makeShortcutButton()->setModuleName($this->moduleName)->setSetVariables(['function']); $buttonBar->addButton($shortcutButton); }
/** * Render the list * * @param array $pArray * @param array $lines * @param int $c * @return array */ public function renderList($pArray, $lines = array(), $c = 0) { if (!is_array($pArray)) { return $lines; } $statusCheckedIcon = $this->moduleTemplate->getIconFactory()->getIcon('status-status-checked', Icon::SIZE_SMALL)->render(); foreach ($pArray as $k => $v) { if (MathUtility::canBeInterpretedAsInteger($k)) { if (isset($pArray[$k . '_'])) { $lines[] = '<tr> <td nowrap><span style="width: 1px; height: 1px; display:inline-block; margin-left: ' . $c * 20 . 'px"></span>' . '<a href="' . htmlspecialchars(GeneralUtility::linkThisScript(array('id' => $k))) . '" title="' . htmlspecialchars('ID: ' . $k) . '">' . $this->moduleTemplate->getIconFactory()->getIconForRecord('pages', BackendUtility::getRecordWSOL('pages', $k), Icon::SIZE_SMALL)->render() . ' ' . GeneralUtility::fixed_lgd_cs($pArray[$k], 30) . '</a></td> <td>' . $pArray[$k . '_']['count'] . '</td> <td>' . ($pArray[$k . '_']['root_max_val'] > 0 ? $statusCheckedIcon : '') . '</td> <td>' . ($pArray[$k . '_']['root_min_val'] == 0 ? $statusCheckedIcon : '') . '</td> </tr>'; } else { $lines[] = '<tr> <td nowrap><span style="width: 1px; height: 1px; display:inline-block; margin-left: ' . $c * 20 . 'px"></span>' . $this->moduleTemplate->getIconFactory()->getIconForRecord('pages', BackendUtility::getRecordWSOL('pages', $k), Icon::SIZE_SMALL)->render() . GeneralUtility::fixed_lgd_cs($pArray[$k], 30) . '</td> <td></td> <td></td> <td></td> </tr>'; } $lines = $this->renderList($pArray[$k . '.'], $lines, $c + 1); } } return $lines; }
/** * This method prepares the link for opening the devlog in a new window * * @return string Hyperlink with icon and appropriate JavaScript */ protected function openInNewWindow() { $url = GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL'); $onClick = 'devlogWin=window.open(' . GeneralUtility::quoteJSvalue($url) . ',\'taskcenter\',\'width=790,status=0,menubar=1,resizable=1,location=0,scrollbars=1,toolbar=0\');return false;'; $content = '<a href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.openInNewWindow', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-window-open', Icon::SIZE_SMALL)->render() . '</a>'; return $content; }
/** * Returns some statistics and a social link to Twitter. * * @return void */ protected function addStatisticsAndSocialLink() { $fileName = PATH_site . 'typo3conf/.tx_imageautoresize'; if (!is_file($fileName)) { return; } $data = json_decode(file_get_contents($fileName), true); if (!is_array($data) || !(isset($data['images']) && isset($data['bytes']))) { return; } $resourcesPath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath($this->extKey) . 'Resources/Public/'; $pageRenderer = version_compare(TYPO3_version, '7.5.99', '>') ? $this->moduleTemplate->getPageRenderer() : $this->doc->getPageRenderer(); $pageRenderer->addCssFile($resourcesPath . 'Css/twitter.css'); $pageRenderer->addJsFile($resourcesPath . 'JavaScript/popup.js'); $totalSpaceClaimed = GeneralUtility::formatSize((int) $data['bytes']); $messagePattern = $this->languageService->getLL('storage.claimed'); $message = sprintf($messagePattern, $totalSpaceClaimed, (int) $data['images']); $flashMessage = htmlspecialchars($message); $twitterMessagePattern = $this->languageService->getLL('social.twitter'); $message = sprintf($twitterMessagePattern, $totalSpaceClaimed); $url = 'https://typo3.org/extensions/repository/view/image_autoresize'; $twitterLink = 'https://twitter.com/intent/tweet?text=' . urlencode($message) . '&url=' . urlencode($url); $twitterLink = GeneralUtility::quoteJSvalue($twitterLink); $flashMessage .= ' <div class="custom-tweet-button"> <a href="#" onclick="popitup(' . $twitterLink . ',\'twitter\')" title="' . $this->languageService->getLL('social.share', true) . '"> <i class="btn-icon"></i> <span class="btn-text">Tweet</span> </a> </div>'; if (version_compare(TYPO3_version, '7.0.0', '>=')) { $this->content .= ' <div class="alert alert-info"> <div class="media"> <div class="media-left"> <span class="fa-stack fa-lg"> <i class="fa fa-circle fa-stack-2x"></i> <i class="fa fa-info fa-stack-1x"></i> </span> </div> <div class="media-body"> ' . $flashMessage . ' </div> </div> </div> '; } else { $this->content .= ' <div id="typo3-messages"> <div class="typo3-message message-information"> <div class="message-body"> ' . $flashMessage . ' </div> </div> </div> '; } }
/** * Generates the action menu */ protected function getModuleMenu() { $menu = $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry()->makeMenu(); $menu->setIdentifier('ConfigurationJumpMenu'); foreach ($this->MOD_MENU['function'] as $controller => $title) { $item = $menu->makeMenuItem()->setHref(BackendUtility::getModuleUrl($this->moduleName, ['id' => $this->id, 'SET' => ['function' => $controller]]))->setTitle($title); if ($controller === (int) $this->MOD_SETTINGS['function']) { $item->setActive(true); } $menu->addMenuItem($item); } $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry()->addMenu($menu); }
/** * Register docHeader buttons */ protected function getButtons() { /** @var ButtonBar $buttonBar */ $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); /** @var IconFactory $iconFactory */ $iconFactory = $this->moduleTemplate->getIconFactory(); // Refresh $refreshButton = $buttonBar->makeLinkButton()->setHref(GeneralUtility::getIndpEnv('REQUEST_URI'))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.reload'))->setIcon($iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL)); $buttonBar->addButton($refreshButton, ButtonBar::BUTTON_POSITION_RIGHT); // CSH $cshButton = $buttonBar->makeHelpButton()->setModuleName('xMOD_csh_corebe')->setFieldName('filetree'); $buttonBar->addButton($cshButton); }
/** * Create the panel of buttons for submitting the form or otherwise * perform operations. * * @return void */ protected function getButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); // Fullscreen Button $url = GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL'); $onClick = 'devlogWin=window.open(' . GeneralUtility::quoteJSvalue($url) . ',\'taskcenter\',\'width=790,status=0,menubar=1,resizable=1,location=0,scrollbars=1,toolbar=0\');return false;'; $fullscreenButton = $buttonBar->makeLinkButton()->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.openInNewWindow', true))->setOnClick($onClick)->setHref('#')->setIcon($this->iconFactory->getIcon('actions-window-open', Icon::SIZE_SMALL)); $buttonBar->addButton($fullscreenButton, ButtonBar::BUTTON_POSITION_RIGHT, 1); // Shortcut if ($this->getBackendUser()->mayMakeShortcut()) { $shortCutButton = $buttonBar->makeFullyRenderedButton()->setHtmlSource($this->moduleTemplate->makeShortcutIcon('', 'function', $this->moduleName)); $buttonBar->addButton($shortCutButton, ButtonBar::BUTTON_POSITION_RIGHT, 2); } }
/** * Create the panel of buttons for submitting the form or otherwise perform operations. */ protected function getButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); // CSH $cshButton = $buttonBar->makeHelpButton()->setModuleName('_MOD_web_func')->setFieldName(''); $buttonBar->addButton($cshButton); if ($this->id && is_array($this->pageinfo)) { // View page $viewButton = $buttonBar->makeLinkButton()->setOnClick(BackendUtility::viewOnClick($this->pageinfo['uid'], '', BackendUtility::BEgetRootLine($this->pageinfo['uid'])))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage'))->setIcon($this->iconFactory->getIcon('actions-document-view', Icon::SIZE_SMALL))->setHref('#'); $buttonBar->addButton($viewButton); // Shortcut $shortcutButton = $buttonBar->makeShortcutButton()->setModuleName($this->moduleName)->setGetVariables(['id', 'edit_record', 'pointer', 'new_unique_uid', 'search_field', 'search_levels', 'showLimit'])->setSetVariables(array_keys($this->MOD_MENU)); $buttonBar->addButton($shortcutButton); } }
/** * Get page title with icon, table title and record title * * @return array */ protected function getPageTitle() : array { $pageTitle = ['title' => strip_tags(BackendUtility::getRecordTitle($this->table, $this->row))]; if ($this->type === 'folder') { $pageTitle['table'] = $this->getLanguageService()->sL('LLL:EXT:lang/Resources/Private/Language/locallang_common.xlf:folder'); $pageTitle['icon'] = $this->iconFactory->getIconForResource($this->folderObject, Icon::SIZE_SMALL)->render(); } elseif ($this->type === 'file') { $pageTitle['table'] = $this->getLanguageService()->sL($GLOBALS['TCA'][$this->table]['ctrl']['title']); $pageTitle['icon'] = $this->iconFactory->getIconForResource($this->fileObject, Icon::SIZE_SMALL)->render(); } else { $pageTitle['table'] = $this->getLanguageService()->sL($GLOBALS['TCA'][$this->table]['ctrl']['title']); $pageTitle['icon'] = $this->iconFactory->getIconForRecord($this->table, $this->row, Icon::SIZE_SMALL); } $this->moduleTemplate->setTitle($pageTitle['table'] . ': ' . $pageTitle['title']); return $pageTitle; }
/** * Render page title with icon, table title and record title * * @return string */ protected function renderPageTitle() { $title = strip_tags(BackendUtility::getRecordTitle($this->table, $this->row)); if ($this->type === 'folder') { $table = $this->getLanguageService()->sL('LLL:EXT:lang/locallang_common.xlf:folder'); $icon = $this->iconFactory->getIconForResource($this->folderObject, Icon::SIZE_SMALL)->render(); } elseif ($this->type === 'file') { $table = $this->getLanguageService()->sL($GLOBALS['TCA'][$this->table]['ctrl']['title']); $icon = $this->iconFactory->getIconForResource($this->fileObject, Icon::SIZE_SMALL)->render(); } else { $table = $this->getLanguageService()->sL($GLOBALS['TCA'][$this->table]['ctrl']['title']); $icon = $this->iconFactory->getIconForRecord($this->table, $this->row, Icon::SIZE_SMALL); } // Set HTML title tag $this->moduleTemplate->setTitle($table . ': ' . $title); return '<h1>' . ($table ? '<small>' . $table . '</small><br />' : '') . $icon . $title . '</h1>'; }
/** * Create the panel of buttons for submitting the form or otherwise perform operations. */ protected function getButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); // CSH $cshButton = $buttonBar->makeFullyRenderedButton()->setHtmlSource(BackendUtility::cshItem('_MOD_web_func', '')); $buttonBar->addButton($cshButton); if ($this->id && is_array($this->pageinfo)) { // View page $viewButton = $buttonBar->makeLinkButton()->setOnClick(BackendUtility::viewOnClick($this->pageinfo['uid'], '', BackendUtility::BEgetRootLine($this->pageinfo['uid'])))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage', true))->setIcon($this->iconFactory->getIcon('actions-document-view', Icon::SIZE_SMALL))->setHref('#'); $buttonBar->addButton($viewButton); // Shortcut if ($this->getBackendUser()->mayMakeShortcut()) { $shortCutButton = $buttonBar->makeFullyRenderedButton()->setHtmlSource($this->moduleTemplate->makeShortcutIcon('id, edit_record, pointer, new_unique_uid, search_field, search_levels, showLimit', implode(',', array_keys($this->MOD_MENU)), $this->moduleName)); $buttonBar->addButton($shortCutButton, ButtonBar::BUTTON_POSITION_RIGHT); } } }
/** * Create the panel of buttons for submitting the form or otherwise perform operations. */ protected function getButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); // CSH $helpButton = $buttonBar->makeHelpButton()->setModuleName('_MOD_' . $this->moduleName)->setFieldName(''); $buttonBar->addButton($helpButton); // Add and Reload if (empty($this->CMD) || $this->CMD === 'list' || $this->CMD === 'delete' || $this->CMD === 'stop' || $this->CMD === 'toggleHidden') { $reloadButton = $buttonBar->makeLinkButton()->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.reload'))->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-refresh', Icon::SIZE_SMALL))->setHref($this->moduleUri); $buttonBar->addButton($reloadButton, ButtonBar::BUTTON_POSITION_RIGHT, 1); if ($this->MOD_SETTINGS['function'] === 'scheduler' && !empty($this->getRegisteredClasses())) { $addButton = $buttonBar->makeLinkButton()->setTitle($this->getLanguageService()->getLL('action.add'))->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-document-new', Icon::SIZE_SMALL))->setHref($this->moduleUri . '&CMD=add'); $buttonBar->addButton($addButton, ButtonBar::BUTTON_POSITION_LEFT, 2); } } // Close and Save if ($this->CMD === 'add' || $this->CMD === 'edit') { // Close $closeButton = $buttonBar->makeLinkButton()->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_common.xlf:cancel'))->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-document-close', Icon::SIZE_SMALL))->setOnClick('document.location=' . GeneralUtility::quoteJSvalue($this->moduleUri))->setHref('#'); $buttonBar->addButton($closeButton, ButtonBar::BUTTON_POSITION_LEFT, 2); // Save, SaveAndClose, SaveAndNew $saveButtonDropdown = $buttonBar->makeSplitButton(); $saveButton = $buttonBar->makeInputButton()->setName('CMD')->setValue('save')->setForm('tx_scheduler_form')->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-document-save', Icon::SIZE_SMALL))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_common.xlf:save')); $saveButtonDropdown->addItem($saveButton); $saveAndNewButton = $buttonBar->makeInputButton()->setName('CMD')->setValue('savenew')->setForm('tx_scheduler_form')->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-document-save-new', Icon::SIZE_SMALL))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_common.xlf:saveAndCreateNewDoc')); $saveButtonDropdown->addItem($saveAndNewButton); $saveAndCloseButton = $buttonBar->makeInputButton()->setName('CMD')->setValue('saveclose')->setForm('tx_scheduler_form')->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-document-save-close', Icon::SIZE_SMALL))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_common.xlf:saveAndClose')); $saveButtonDropdown->addItem($saveAndCloseButton); $buttonBar->addButton($saveButtonDropdown, ButtonBar::BUTTON_POSITION_LEFT, 3); } // Edit if ($this->CMD === 'edit') { $deleteButton = $buttonBar->makeInputButton()->setName('CMD')->setValue('delete')->setForm('tx_scheduler_form')->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-edit-delete', Icon::SIZE_SMALL))->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_common.xlf:delete')); $buttonBar->addButton($deleteButton, ButtonBar::BUTTON_POSITION_LEFT, 4); } // Shortcut $shortcutButton = $buttonBar->makeShortcutButton()->setModuleName($this->moduleName)->setDisplayName($this->MOD_MENU['function'][$this->MOD_SETTINGS['function']])->setSetVariables(['function']); $buttonBar->addButton($shortcutButton); }
/** * Loads the template source and render the template. * If "layoutName" is set in a PostParseFacet callback, it will render the file with the given layout. * * Additionally amends the rendered template with a module template "frame" * * @param string $actionName If set, the view of the specified action will be rendered instead. Default is the action specified in the Request object * @return string Rendered Template * @api */ public function render($actionName = null) { $actionViewContent = $this->templateView->render($actionName); $this->moduleTemplate->setContent($actionViewContent); return $this->moduleTemplate->renderContent(); }
/** * Get the list * * @param array $pArray * @param array $lines * @param int $c * @return array */ public function renderList($pArray, $lines = [], $c = 0) { if (!is_array($pArray)) { return $lines; } $statusCheckedIcon = $this->moduleTemplate->getIconFactory()->getIcon('status-status-checked', Icon::SIZE_SMALL)->render(); $i = 0; foreach ($pArray as $k => $v) { if (MathUtility::canBeInterpretedAsInteger($k)) { $line = []; $key = $k . '_'; $line['marginLeft'] = $c * 20; $line['class'] = $i++ % 2 === 0 ? 'bgColor4' : 'bgColor6'; $line['pageTitle'] = GeneralUtility::fixed_lgd_cs($pArray[$k], 30); $line['icon'] = $this->moduleTemplate->getIconFactory()->getIconForRecord('pages', BackendUtility::getRecordWSOL('pages', $k), Icon::SIZE_SMALL)->render(); if (!empty($pArray[$key])) { $line['href'] = GeneralUtility::linkThisScript(['id' => (int) $k]); $line['title'] = 'ID: ' . (int) $k; $line['count'] = $pArray[$k . '_']['count']; $line['root_max_val'] = $pArray[$key]['root_max_val'] > 0 ? $statusCheckedIcon : ' '; $line['root_min_val'] = $pArray[$key]['root_min_val'] === 0 ? $statusCheckedIcon : ' '; } else { $line['href'] = ''; $line['title'] = ''; $line['count'] = ''; $line['root_max_val'] = ''; $line['root_min_val'] = ''; } $lines[] = $line; $lines = $this->renderList($pArray[$k . '.'], $lines, $c + 1); } } return $lines; }
/** * Administrative links for a table / record * * @param string $table Table name * @param array $row Record for which administrative links are generated. * @return string HTML link tags. */ public function adminLinks($table, $row) { // Edit link: $editUrl = BackendUtility::getModuleUrl('record_edit', ['edit' => [$table => [$row['uid'] => 'edit']], 'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')]); $adminLink = '<a class="btn btn-default" href="' . htmlspecialchars($editUrl) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:cm.edit', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-open', Icon::SIZE_SMALL)->render() . '</a>'; // Delete link: $adminLink .= '<a class="btn btn-default" href="' . htmlspecialchars(BackendUtility::getLinkToDataHandlerAction('&cmd[' . $table . '][' . $row['uid'] . '][delete]=1')) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:cm.delete', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-edit-delete', Icon::SIZE_SMALL)->render() . '</a>'; if ($table === 'pages') { // If another page module was specified, replace the default Page module with the new one $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule')); $pageModule = BackendUtility::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout'; // Perform some access checks: $a_wl = $GLOBALS['BE_USER']->check('modules', 'web_list'); $a_wp = $GLOBALS['BE_USER']->check('modules', $pageModule); $adminLink .= '<a class="btn btn-default" href="#" onclick="top.loadEditId(' . $row['uid'] . ');top.goToModule(' . GeneralUtility::quoteJSvalue($pageModule) . '); return false;">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-page-open', Icon::SIZE_SMALL)->render() . '</a>'; $adminLink .= '<a class="btn btn-default" href="#" onclick="top.loadEditId(' . $row['uid'] . ');top.goToModule(\'web_list\'); return false;">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-system-list-open', Icon::SIZE_SMALL)->render() . '</a>'; // "View page" icon is added: $adminLink .= '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::viewOnClick($row['uid'], '', BackendUtility::BEgetRootLine($row['uid']))) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-view', Icon::SIZE_SMALL)->render() . '</a>'; } else { if ($row['pid'] == -1) { $getVars = '&ADMCMD_vPrev[' . rawurlencode($table . ':' . $row['t3ver_oid']) . ']=' . $row['uid']; // "View page" icon is added: $adminLink .= '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::viewOnClick($row['_REAL_PID'], '', BackendUtility::BEgetRootLine($row['_REAL_PID']), '', '', $getVars)) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-view', Icon::SIZE_SMALL)->render() . '</a>'; } } return '<div class="btn-group btn-group-sm" role="group">' . $adminLink . '</div>'; }
/** * Create the panel of buttons for submitting the form or otherwise perform * operations. * * @param ModuleTemplate $moduleTemplate */ public function getDocHeaderButtons(ModuleTemplate $moduleTemplate) { $buttonBar = $moduleTemplate->getDocHeaderComponent()->getButtonBar(); $module = $this->getModule(); $backendUser = $this->getBackendUserAuthentication(); $lang = $this->getLanguageService(); // Get users permissions for this page record: $localCalcPerms = $backendUser->calcPerms($this->pageRow); // CSH if ((string) $this->id === '') { $fieldName = 'list_module_noId'; } elseif (!$this->id) { $fieldName = 'list_module_root'; } else { $fieldName = 'list_module'; } $cshButton = $buttonBar->makeHelpButton()->setModuleName('xMOD_csh_corebe')->setFieldName($fieldName); $buttonBar->addButton($cshButton); if (isset($this->id)) { // View Exclude doktypes 254,255 Configuration: // mod.web_list.noViewWithDokTypes = 254,255 if (isset($module->modTSconfig['properties']['noViewWithDokTypes'])) { $noViewDokTypes = GeneralUtility::trimExplode(',', $module->modTSconfig['properties']['noViewWithDokTypes'], true); } else { //default exclusion: doktype 254 (folder), 255 (recycler) $noViewDokTypes = array(PageRepository::DOKTYPE_SYSFOLDER, PageRepository::DOKTYPE_RECYCLER); } // New record on pages that are not locked by editlock if (!$module->modTSconfig['properties']['noCreateRecordsLink'] && $this->editLockPermissions()) { $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue(BackendUtility::getModuleUrl('db_new', ['id' => $this->id])) . ');'; $newRecordButton = $buttonBar->makeLinkButton()->setHref('#')->setOnClick($onClick)->setTitle($lang->getLL('newRecordGeneral', true))->setIcon($this->iconFactory->getIcon('actions-document-new', Icon::SIZE_SMALL)); $buttonBar->addButton($newRecordButton, ButtonBar::BUTTON_POSITION_LEFT, 10); } if (!in_array($this->pageRow['doktype'], $noViewDokTypes)) { $onClick = BackendUtility::viewOnClick($this->id, '', BackendUtility::BEgetRootLine($this->id)); $viewButton = $buttonBar->makeLinkButton()->setHref('#')->setOnClick($onClick)->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage', true))->setIcon($this->iconFactory->getIcon('actions-document-view', Icon::SIZE_SMALL)); $buttonBar->addButton($viewButton, ButtonBar::BUTTON_POSITION_LEFT, 20); } // If edit permissions are set, see // \TYPO3\CMS\Core\Authentication\BackendUserAuthentication if ($localCalcPerms & Permission::PAGE_EDIT && !empty($this->id) && $this->editLockPermissions()) { // Edit $params = '&edit[pages][' . $this->pageRow['uid'] . ']=edit'; $onClick = BackendUtility::editOnClick($params, '', -1); $editButton = $buttonBar->makeLinkButton()->setHref('#')->setOnClick($onClick)->setTitle($lang->getLL('editPage', true))->setIcon($this->iconFactory->getIcon('actions-page-open', Icon::SIZE_SMALL)); $buttonBar->addButton($editButton, ButtonBar::BUTTON_POSITION_LEFT, 20); } // Paste if (($localCalcPerms & Permission::PAGE_NEW || $localCalcPerms & Permission::CONTENT_EDIT) && $this->editLockPermissions()) { $elFromTable = $this->clipObj->elFromTable(''); if (!empty($elFromTable)) { $onClick = 'return ' . $this->clipObj->confirmMsg('pages', $this->pageRow, 'into', $elFromTable); $pasteButton = $buttonBar->makeLinkButton()->setHref($this->clipObj->pasteUrl('', $this->id))->setOnClick($onClick)->setTitle($lang->getLL('clip_paste', true))->setIcon($this->iconFactory->getIcon('actions-document-paste-after', Icon::SIZE_SMALL)); $buttonBar->addButton($pasteButton, ButtonBar::BUTTON_POSITION_LEFT, 40); } } // Cache $clearCacheButton = $buttonBar->makeLinkButton()->setHref($this->listURL() . '&clear_cache=1')->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.clear_cache', true))->setIcon($this->iconFactory->getIcon('actions-system-cache-clear', Icon::SIZE_SMALL)); $buttonBar->addButton($clearCacheButton, ButtonBar::BUTTON_POSITION_RIGHT); if ($this->table && (!isset($module->modTSconfig['properties']['noExportRecordsLinks']) || isset($module->modTSconfig['properties']['noExportRecordsLinks']) && !$module->modTSconfig['properties']['noExportRecordsLinks'])) { // CSV $csvButton = $buttonBar->makeLinkButton()->setHref($this->listURL() . '&csv=1')->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.csv', true))->setIcon($this->iconFactory->getIcon('actions-document-export-csv', Icon::SIZE_SMALL)); $buttonBar->addButton($csvButton, ButtonBar::BUTTON_POSITION_LEFT, 40); // Export if (ExtensionManagementUtility::isLoaded('impexp')) { $url = BackendUtility::getModuleUrl('xMOD_tximpexp', array('tx_impexp[action]' => 'export')); $exportButton = $buttonBar->makeLinkButton()->setHref($url . '&tx_impexp[list][]=' . rawurlencode($this->table . ':' . $this->id))->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:rm.export', true))->setIcon($this->iconFactory->getIcon('actions-document-export-t3d', Icon::SIZE_SMALL)); $buttonBar->addButton($exportButton, ButtonBar::BUTTON_POSITION_LEFT, 40); } } // Reload $reloadButton = $buttonBar->makeLinkButton()->setHref($this->listURL())->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.reload', true))->setIcon($this->iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL)); $buttonBar->addButton($reloadButton, ButtonBar::BUTTON_POSITION_RIGHT); // Shortcut if ($backendUser->mayMakeShortcut()) { $shortCutButton = $buttonBar->makeShortcutButton()->setModuleName('web_list')->setGetVariables(['id', 'M', 'imagemode', 'pointer', 'table', 'search_field', 'search_levels', 'showLimit', 'sortField', 'sortRev'])->setSetVariables(array_keys($this->MOD_MENU)); $buttonBar->addButton($shortCutButton, ButtonBar::BUTTON_POSITION_RIGHT); } // Back if ($this->returnUrl) { $href = htmlspecialchars(GeneralUtility::linkThisUrl($this->returnUrl, array('id' => $this->id))); $buttons['back'] = '<a href="' . $href . '" class="typo3-goBack" title="' . $lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.goBack', true) . '">' . $this->iconFactory->getIcon('actions-view-go-back', Icon::SIZE_SMALL) . '</a>'; } } }
/** * Make the LanguageMenu * * @return void */ protected function makeLanguageMenu() { if (count($this->MOD_MENU['language']) > 1) { $lang = $this->getLanguageService(); $languageMenu = $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry()->makeMenu(); $languageMenu->setIdentifier('languageMenu'); $languageMenu->setLabel($lang->sL('LLL:EXT:lang/locallang_general.xlf:LGL.language', true)); foreach ($this->MOD_MENU['language'] as $key => $language) { $menuItem = $languageMenu->makeMenuItem()->setTitle($language)->setHref(BackendUtility::getModuleUrl($this->moduleName) . '&id=' . $this->id . '&SET[language]=' . $key); if ((int) $this->current_sys_language === $key) { $menuItem->setActive(true); } $languageMenu->addMenuItem($menuItem); } $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry()->addMenu($languageMenu); } }
/** * No template * * @param int $newStandardTemplate * @return string */ public function noTemplate($newStandardTemplate = 0) { // Defined global here! /** @var ExtendedTemplateService $tmpl */ $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class); $GLOBALS['tmpl'] = $tmpl; // Do not log time-performance information $tmpl->tt_track = false; $tmpl->init(); $lang = $this->getLanguageService(); $title = $lang->getLL('noTemplate'); $message = '<p>' . $lang->getLL('noTemplateDescription') . '<br />' . $lang->getLL('createTemplateToEditConfiguration') . '</p>'; $view = GeneralUtility::makeInstance(StandaloneView::class); $view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:tstemplate/Resources/Private/Templates/InfoBox.html')); $view->assignMultiple(array('title' => $title, 'message' => $message, 'state' => InfoboxViewHelper::STATE_INFO)); $theOutput = $view->render(); // New standard? if ($newStandardTemplate) { // Hook to change output, implemented for statictemplates if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][TypoScriptTemplateModuleController::class]['newStandardTemplateView'])) { $selector = ''; $staticsText = ''; $reference = array('selectorHtml' => &$selector, 'staticsText' => &$staticsText); GeneralUtility::callUserFunction($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][TypoScriptTemplateModuleController::class]['newStandardTemplateView'], $reference, $this); $selector = $reference['selectorHtml']; $staticsText = $reference['staticsText']; } else { $selector = '<input type="hidden" name="createStandard" value="" />'; $staticsText = ''; } // Extension? $theOutput .= $this->moduleTemplate->section($lang->getLL('newWebsite') . $staticsText, '<p>' . $lang->getLL('newWebsiteDescription') . '</p>' . $selector . '<input class="btn btn-primary" type="submit" name="newWebsite" value="' . $lang->getLL('newWebsiteAction') . '" />', 0, 1); } // Extension? $theOutput .= $this->moduleTemplate->section($lang->getLL('extTemplate'), '<p>' . $lang->getLL('extTemplateDescription') . '</p>' . '<input class="btn btn-default" type="submit" name="createExtension" value="' . $lang->getLL('extTemplateAction') . '" />', 0, 1); // Go to first appearing... $first = $tmpl->ext_prevPageWithTemplate($this->id, $this->perms_clause); if ($first) { $urlParameters = array('id' => $first['uid']); $aHref = BackendUtility::getModuleUrl('web_ts', $urlParameters); $theOutput .= $this->moduleTemplate->section($lang->getLL('goToClosest'), sprintf('<p>' . $lang->getLL('goToClosestDescription') . '</p>%s' . $lang->getLL('goToClosestAction') . '%s', htmlspecialchars($first['title']), $first['uid'], '<a class="btn btn-default" href="' . htmlspecialchars($aHref) . '">', '</a>'), 0, 1); } return $theOutput; }
/** * Create the panel of buttons for submitting the form or otherwise perform operations. * * @return array all available buttons as an associated array */ protected function getButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); if ($this->getBackendUser()->mayMakeShortcut()) { $shortcutButton = $buttonBar->makeShortcutButton()->setGetVariables(['tx_impexp'])->setDisplayName($this->shortcutName)->setModuleName($this->moduleName); $buttonBar->addButton($shortcutButton); } // Input data grabbed: $inData = GeneralUtility::_GP('tx_impexp'); if ((string) $inData['action'] == 'import') { if ($this->id && is_array($this->pageinfo) || $this->getBackendUser()->user['admin'] && !$this->id) { if (is_array($this->pageinfo) && $this->pageinfo['uid']) { // View $onClick = BackendUtility::viewOnClick($this->pageinfo['uid'], '', BackendUtility::BEgetRootLine($this->pageinfo['uid'])); $viewButton = $buttonBar->makeLinkButton()->setTitle($this->lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage'))->setHref('#')->setIcon($this->iconFactory->getIcon('actions-document-view', Icon::SIZE_SMALL))->setOnClick($onClick); $buttonBar->addButton($viewButton); } } } }
/** * Import part of module * * @param array $inData Content of POST VAR tx_impexp[].. * @throws \BadFunctionCallException * @throws \InvalidArgumentException * @throws \RuntimeException * @return void Setting content in $this->content */ public function importData($inData) { $access = is_array($this->pageinfo) ? 1 : 0; $beUser = $this->getBackendUser(); if ($this->id && $access || $beUser->user['admin'] && !$this->id) { if ($beUser->user['admin'] && !$this->id) { $this->pageinfo = array('title' => '[root-level]', 'uid' => 0, 'pid' => 0); } if ($inData['new_import']) { unset($inData['import_mode']); } /** @var $import \TYPO3\CMS\Impexp\ImportExport */ $import = GeneralUtility::makeInstance(\TYPO3\CMS\Impexp\ImportExport::class); $import->init(0, 'import'); $import->update = $inData['do_update']; $import->import_mode = $inData['import_mode']; $import->enableLogging = $inData['enableLogging']; $import->global_ignore_pid = $inData['global_ignore_pid']; $import->force_all_UIDS = $inData['force_all_UIDS']; $import->showDiff = !$inData['notShowDiff']; $import->allowPHPScripts = $inData['allowPHPScripts']; $import->softrefInputValues = $inData['softrefInputValues']; // OUTPUT creation: $menuItems = array(); // Make input selector: // must have trailing slash. $path = $this->getDefaultImportExportFolder(); $exportFiles = $this->getExportFiles(); $this->shortcutName .= ' (' . $this->pageinfo['title'] . ')'; // Configuration $row = array(); $selectOptions = array(''); foreach ($exportFiles as $file) { $selectOptions[$file->getCombinedIdentifier()] = $file->getPublicUrl(); } $row[] = ' <tr> <th colspan="2">' . $this->lang->getLL('importdata_selectFileToImport', true) . '</th> </tr>'; $noCompressorAvailable = !$import->compress ? '<br /><span class="text-danger">' . $this->lang->getLL('importdata_noteNoDecompressorAvailable', true) . '</span>' : ''; $row[] = ' <tr> <td valign="top"> ' . $this->lang->getLL('importdata_file', true) . '' . BackendUtility::cshItem('xMOD_tx_impexp', 'importFile') . ' </td> <td> ' . $this->renderSelectBox('tx_impexp[file]', $inData['file'], $selectOptions) . '<br />' . sprintf($this->lang->getLL('importdata_fromPathS', true), $path ? $path->getCombinedIdentifier() : $this->lang->getLL('importdata_no_accessible_file_mount', true)) . $noCompressorAvailable . ' </td> </tr>'; $row[] = ' <tr> <th colspan="2"> ' . $this->lang->getLL('importdata_importOptions', true) . ' </th> </tr>'; $row[] = ' <tr> <td valign="top"> ' . $this->lang->getLL('importdata_update', true) . BackendUtility::cshItem('xMOD_tx_impexp', 'update') . ' </td> <td> <input type="checkbox" name="tx_impexp[do_update]" id="checkDo_update" value="1"' . ($inData['do_update'] ? ' checked="checked"' : '') . ' /> <label for="checkDo_update">' . $this->lang->getLL('importdata_updateRecords', true) . '</label> <br/> <em>(' . $this->lang->getLL('importdata_thisOptionRequiresThat', true) . ')</em>' . ($inData['do_update'] ? ' <hr/> <input type="checkbox" name="tx_impexp[global_ignore_pid]" id="checkGlobal_ignore_pid" value="1"' . ($inData['global_ignore_pid'] ? ' checked="checked"' : '') . ' /> <label for="checkGlobal_ignore_pid">' . $this->lang->getLL('importdata_ignorePidDifferencesGlobally', true) . '</label><br/> <em>(' . $this->lang->getLL('importdata_ifYouSetThis', true) . ')</em> ' : '') . ' </td> </tr>'; $allowPhpScripts = $beUser->isAdmin() ? ' <input type="checkbox" name="tx_impexp[allowPHPScripts]" id="checkAllowPHPScripts" value="1"' . ($inData['allowPHPScripts'] ? ' checked="checked"' : '') . ' /> <label for="checkAllowPHPScripts">' . $this->lang->getLL('importdata_allowToWriteBanned', true) . '</label><br/>' : ''; $doUpdate = !$inData['do_update'] && $beUser->isAdmin() ? ' <br/> <input type="checkbox" name="tx_impexp[force_all_UIDS]" id="checkForce_all_UIDS" value="1"' . ($inData['force_all_UIDS'] ? ' checked="checked"' : '') . ' /> <label for="checkForce_all_UIDS"><span class="text-danger">' . $this->lang->getLL('importdata_force_all_UIDS', true) . '</span></label><br/> <em>(' . $this->lang->getLL('importdata_force_all_UIDS_descr', true) . ')</em>' : ''; $row[] = '<tr> <td valign="top"> ' . $this->lang->getLL('importdata_options', true) . BackendUtility::cshItem('xMOD_tx_impexp', 'options') . ' </td> <td> <input type="checkbox" name="tx_impexp[notShowDiff]" id="checkNotShowDiff" value="1"' . ($inData['notShowDiff'] ? ' checked="checked"' : '') . ' /> <label for="checkNotShowDiff">' . $this->lang->getLL('importdata_doNotShowDifferences', true) . '</label><br/> <em>(' . $this->lang->getLL('importdata_greenValuesAreFrom', true) . ')</em> <br/><br/> ' . $allowPhpScripts . $doUpdate . ' </td> </tr>'; $newImport = !$inData['import_file'] ? '<input class="btn btn-default" type="submit" value="' . $this->lang->getLL('importdata_preview', true) . '" />' . ($inData['file'] ? ' - <input type="hidden" name="not-set" value="1" id="t3js-submit-field" /><input class="btn btn-default t3js-confirm-trigger" type="button" value="' . ($inData['do_update'] ? $this->lang->getLL('importdata_update_299e', true) : $this->lang->getLL('importdata_import', true)) . '" name="tx_impexp[import_file]" data-title="' . $this->lang->getLL('pleaseConfirm', true) . '" data-message="' . $this->lang->getLL('importdata_areYouSure', true) . '" />' : '') : '<input class="btn btn-default" type="submit" name="tx_impexp[new_import]" value="' . $this->lang->getLL('importdata_newImport', true) . '" />'; $row[] = '<tr> <td valign="top"> ' . $this->lang->getLL('importdata_action', true) . BackendUtility::cshItem('xMOD_tx_impexp', 'action') . ' </td> <td> ' . $newImport . ' <input type="hidden" name="tx_impexp[action]" value="import" /> </td> </tr>'; $row[] = '<tr> <td valign="top"> ' . $this->lang->getLL('importdata_enableLogging', true) . BackendUtility::cshItem('xMOD_tx_impexp', 'enableLogging') . ' </td> <td> <input type="checkbox" name="tx_impexp[enableLogging]" id="checkEnableLogging" value="1"' . ($inData['enableLogging'] ? ' checked="checked"' : '') . ' /> <label for="checkEnableLogging">' . $this->lang->getLL('importdata_writeIndividualDbActions', true) . '</label><br/> <em>(' . $this->lang->getLL('importdata_thisIsDisabledBy', true) . ')</em> </td> </tr>'; $menuItems[] = array('label' => $this->lang->getLL('importdata_import', true), 'content' => ' <table border="0" cellpadding="1" cellspacing="1"> ' . implode(' ', $row) . ' </table> '); // Upload file: $tempFolder = $this->getDefaultImportExportFolder(); if ($tempFolder) { $row = array(); $row[] = ' <tr> <th colspan="2">' . $this->lang->getLL('importdata_uploadFileFromLocal', true) . '</th> </tr>'; $row[] = ' <tr> <td valign="top"> ' . $this->lang->getLL('importdata_browse', true) . BackendUtility::cshItem('xMOD_tx_impexp', 'upload') . ' </td> <td> <input type="file" name="upload_1" size="40" /> <input type="hidden" name="file[upload][1][target]" value="' . htmlspecialchars($tempFolder->getCombinedIdentifier()) . '" /> <input type="hidden" name="file[upload][1][data]" value="1" /> <br /> <input class="btn btn-default" type="submit" name="_upload" value="' . $this->lang->sL('LLL:EXT:lang/locallang_core.xlf:file_upload.php.submit', true) . '" /> <input type="checkbox" name="overwriteExistingFiles" id="checkOverwriteExistingFiles" value="1" checked="checked" /> <label for="checkOverwriteExistingFiles">' . $this->lang->sL('LLL:EXT:lang/locallang_misc.xlf:overwriteExistingFiles', true) . '</label> </td> </tr>'; if (GeneralUtility::_POST('_upload')) { $noFileUploaded = $this->fileProcessor->internalUploadMap[1] ? $this->lang->getLL('importdata_success', true) . ' ' . $this->uploadedFiles[0]->getName() : '<span class="text-danger">' . $this->lang->getLL('importdata_failureNoFileUploaded', true) . '</span>'; $row[] = '<tr class="bgColor4"> <td>' . $this->lang->getLL('importdata_uploadStatus', true) . '</td> <td>' . $noFileUploaded . '</td> </tr>'; } $menuItems[] = array('label' => $this->lang->getLL('importdata_upload'), 'content' => ' <table border="0" cellpadding="1" cellspacing="1"> ' . implode(' ', $row) . ' </table> '); } // Perform import or preview depending: $overviewContent = ''; $extensionInstallationMessage = ''; $inFile = $this->getFile($inData['file']); if ($inFile !== null && $inFile->exists()) { $trow = array(); if ($import->loadFile($inFile->getForLocalProcessing(false), 1)) { // Check extension dependencies: $extKeysToInstall = array(); if (is_array($import->dat['header']['extensionDependencies'])) { foreach ($import->dat['header']['extensionDependencies'] as $extKey) { if (!\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded($extKey)) { $extKeysToInstall[] = $extKey; } } } if (!empty($extKeysToInstall)) { $extensionInstallationMessage = 'Before you can install this T3D file you need to install the extensions "' . implode('", "', $extKeysToInstall) . '".'; } if ($inData['import_file']) { if (empty($extKeysToInstall)) { $import->importData($this->id); BackendUtility::setUpdateSignal('updatePageTree'); } } $import->display_import_pid_record = $this->pageinfo; $overviewContent = $import->displayContentOverview(); } // Meta data output: $trow[] = '<tr class="bgColor5"> <td colspan="2"><strong>' . $this->lang->getLL('importdata_metaData', true) . '</strong></td> </tr>'; $trow[] = '<tr class="bgColor4"> <td><strong>' . $this->lang->getLL('importdata_title', true) . '</strong></td> <td width="95%">' . nl2br(htmlspecialchars($import->dat['header']['meta']['title'])) . '</td> </tr>'; $trow[] = '<tr class="bgColor4"> <td><strong>' . $this->lang->getLL('importdata_description', true) . '</strong></td> <td width="95%">' . nl2br(htmlspecialchars($import->dat['header']['meta']['description'])) . '</td> </tr>'; $trow[] = '<tr class="bgColor4"> <td><strong>' . $this->lang->getLL('importdata_notes', true) . '</strong></td> <td width="95%">' . nl2br(htmlspecialchars($import->dat['header']['meta']['notes'])) . '</td> </tr>'; $trow[] = '<tr class="bgColor4"> <td><strong>' . $this->lang->getLL('importdata_packager', true) . '</strong></td> <td width="95%">' . nl2br(htmlspecialchars($import->dat['header']['meta']['packager_name'] . ' (' . $import->dat['header']['meta']['packager_username'] . ')')) . '<br/> ' . $this->lang->getLL('importdata_email', true) . ' ' . $import->dat['header']['meta']['packager_email'] . '</td> </tr>'; // Thumbnail icon: if (is_array($import->dat['header']['thumbnail'])) { $pI = pathinfo($import->dat['header']['thumbnail']['filename']); if (GeneralUtility::inList('gif,jpg,png,jpeg', strtolower($pI['extension']))) { // Construct filename and write it: $fileName = PATH_site . 'typo3temp/importthumb.' . $pI['extension']; GeneralUtility::writeFile($fileName, $import->dat['header']['thumbnail']['content']); // Check that the image really is an image and not a malicious PHP script... if (getimagesize($fileName)) { // Create icon tag: $iconTag = '<img src="../' . PathUtility::stripPathSitePrefix($fileName) . '" ' . $import->dat['header']['thumbnail']['imgInfo'][3] . ' vspace="5" style="border: solid black 1px;" alt="" />'; $trow[] = '<tr class="bgColor4"> <td><strong>' . $this->lang->getLL('importdata_icon', true) . '</strong></td> <td>' . $iconTag . '</td> </tr>'; } else { GeneralUtility::unlink_tempfile($fileName); } } } $menuItems[] = array('label' => $this->lang->getLL('importdata_metaData_1387'), 'content' => ' <table border="0" cellpadding="1" cellspacing="1"> ' . implode(' ', $trow) . ' </table> '); } // Print errors that might be: $errors = $import->printErrorLog(); $menuItems[] = array('label' => $this->lang->getLL('importdata_messages'), 'content' => $errors, 'stateIcon' => $errors ? 2 : 0); // Output tabs: $content = $this->moduleTemplate->getDynamicTabMenu($menuItems, 'tx_impexp_import', 1, false, true, false); if ($extensionInstallationMessage) { $content = '<div style="border: 1px black solid; margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;">' . $this->moduleTemplate->icons(1) . htmlspecialchars($extensionInstallationMessage) . '</div>' . $content; } $this->content .= $this->moduleTemplate->section('', $content, 0, 1); // Print overview: if ($overviewContent) { $this->content .= $this->moduleTemplate->section($inData['import_file'] ? $this->lang->getLL('importdata_structureHasBeenImported', true) : $this->lang->getLL('filterpage_structureToBeImported', true), $overviewContent, 0, 1); } } }