/** * Parse, and return conf - array * * @param string $script * @param int $recursiveLevel * @return array TypoScript configuration array */ protected function scriptParser($script = '', $recursiveLevel) { $script = $this->parser->checkIncludeLines($script); // get constants $this->parser->parse(implode(PHP_EOL, $GLOBALS['TSFE']->tmpl->constants), $this->matchCondition); // recursive substitution of constants for ($i = 0; $i < $recursiveLevel; $i++) { $oldScript = $script; $script = preg_replace_callback('/\\{\\$(.[^}]*)\\}/', array($this, 'substituteConstantsCallBack'), $script); if ($oldScript == $script) { break; } } foreach ($GLOBALS['TSFE']->tmpl->setup as $tsObjectKey => $tsObjectValue) { if ($tsObjectKey !== intval($tsObjectKey, 10)) { $this->parser->setup[$tsObjectKey] = $tsObjectValue; } } $this->parser->parse($script, $this->matchCondition); return $this->parser->setup; }
/** * Searching TypoScript code text (for constants and config (Setup)) * for include instructions and does the inclusion of external TypoScript files * if needed. * * @return void * @see \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser, generateConfig() */ public function processIncludes() { if ($this->processIncludesHasBeenRun) { return; } $paths = $this->templateIncludePaths; $files = array(); foreach ($this->constants as &$value) { $includeData = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($value, 1, TRUE, array_shift($paths)); $files = array_merge($files, $includeData['files']); $value = $includeData['typoscript']; } unset($value); $paths = $this->templateIncludePaths; foreach ($this->config as &$value) { $includeData = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($value, 1, TRUE, array_shift($paths)); $files = array_merge($files, $includeData['files']); $value = $includeData['typoscript']; } unset($value); if (!empty($files)) { $files = array_unique($files); foreach ($files as $file) { $this->rowSum[] = array($file, filemtime($file)); } } $this->processIncludesHasBeenRun = TRUE; }
/** * Process template row after loading * * @param array $tplRow Template row * @return array Preprocessed template row */ public function processTemplateRowAfterLoading(array $tplRow) { if ($this->pObj->MOD_SETTINGS['includeTypoScriptFileContent']) { // Let the recursion detection counter start at 91, so that only 10 recursive calls will be resolved // Otherwise the editor will be bloated with way to many lines making it hard the break the cyclic recursion. $tplRow['config'] = TypoScriptParser::checkIncludeLines($tplRow['config'], 91); $tplRow['constants'] = TypoScriptParser::checkIncludeLines($tplRow['constants'], 91); } return $tplRow; }
/** * Searching TypoScript code text (for constants and config (Setup)) * for include instructions and does the inclusion of external TypoScript files * if needed. * * @return void * @see t3lib_TSparser, generateConfig() */ public function processIncludes() { $files = array(); foreach ($this->constants as &$value) { $includeData = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($value, 1, TRUE); $files = array_merge($files, $includeData['files']); $value = $includeData['typoscript']; } unset($value); foreach ($this->config as &$value) { $includeData = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($value, 1, TRUE); $files = array_merge($files, $includeData['files']); $value = $includeData['typoscript']; } unset($value); if (count($files)) { $files = array_unique($files); foreach ($files as $file) { $this->rowSum[] = array($file, filemtime($file)); } } }
/** * @param $strategy * @return array */ protected function getStrategyConfig($strategy) { if ($this->strategyConfig[$strategy['uid']] === NULL) { $parseObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\TypoScript\\Parser\\TypoScriptParser'); $config = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($strategy['config']); $parseObj->parse($config); $config = $parseObj->setup; $this->strategyConfig[$strategy['uid']] = $config; } return $this->strategyConfig[$strategy['uid']]; }
/** * Main * * @return string * @todo Define visibility */ public function main() { // Initializes the module. Done in this function because we may need to re-initialize if data is submitted! // Checking for more than one template an if, set a menu... $manyTemplatesMenu = $this->pObj->templateMenu(); $template_uid = 0; if ($manyTemplatesMenu) { $template_uid = $this->pObj->MOD_SETTINGS['templatesOnPage']; } // BUGBUG: Should we check if the uset may at all read and write template-records??? $existTemplate = $this->initialize_editor($this->pObj->id, $template_uid); // initialize if ($existTemplate) { $theOutput .= $this->pObj->doc->section($GLOBALS['LANG']->getLL('currentTemplate', TRUE), \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconForRecord('sys_template', $GLOBALS['tplRow']) . '<strong>' . $this->pObj->linkWrapTemplateTitle($GLOBALS['tplRow']['title']) . '</strong>' . htmlspecialchars(trim($GLOBALS['tplRow']['sitetitle']) ? ' (' . $GLOBALS['tplRow']['sitetitle'] . ')' : '')); } if ($manyTemplatesMenu) { $theOutput .= $this->pObj->doc->section('', $manyTemplatesMenu); } $GLOBALS['tmpl']->clearList_const_temp = array_flip($GLOBALS['tmpl']->clearList_const); $GLOBALS['tmpl']->clearList_setup_temp = array_flip($GLOBALS['tmpl']->clearList_setup); $pointer = count($GLOBALS['tmpl']->hierarchyInfo); $GLOBALS['tmpl']->hierarchyInfoArr = $GLOBALS['tmpl']->ext_process_hierarchyInfo(array(), $pointer); $GLOBALS['tmpl']->processIncludes(); $hierarArr = array(); $head = '<tr class="t3-row-header">'; $head .= '<td>' . $GLOBALS['LANG']->getLL('title', TRUE) . '</td>'; $head .= '<td>' . $GLOBALS['LANG']->getLL('rootlevel', TRUE) . '</td>'; $head .= '<td>' . $GLOBALS['LANG']->getLL('clearSetup', TRUE) . '</td>'; $head .= '<td>' . $GLOBALS['LANG']->getLL('clearConstants', TRUE) . '</td>'; $head .= '<td>' . $GLOBALS['LANG']->getLL('pid', TRUE) . '</td>'; $head .= '<td>' . $GLOBALS['LANG']->getLL('rootline', TRUE) . '</td>'; $head .= '<td>' . $GLOBALS['LANG']->getLL('nextLevel', TRUE) . '</td>'; $head .= '</tr>'; $hierar = implode(array_reverse($GLOBALS['tmpl']->ext_getTemplateHierarchyArr($GLOBALS['tmpl']->hierarchyInfoArr, '', array(), 1)), ''); $hierar = '<table id="ts-analyzer" cellpadding="0" cellspacing="0">' . $head . $hierar . '</table>'; $theOutput .= $this->pObj->doc->spacer(5); $theOutput .= $this->pObj->doc->section($GLOBALS['LANG']->getLL('templateHierarchy', TRUE), $hierar, 0, 1); $urlParameters = array('id' => $GLOBALS['SOBE']->id, 'template' => 'all'); $aHref = \TYPO3\CMS\Backend\Utility\BackendUtility::getModuleUrl('web_ts', $urlParameters); $completeLink = '<p><a href="' . htmlspecialchars($aHref) . '">' . $GLOBALS['LANG']->getLL('viewCompleteTS', TRUE) . '</a></p>'; $theOutput .= $this->pObj->doc->spacer(5); $theOutput .= $this->pObj->doc->section($GLOBALS['LANG']->getLL('completeTS', TRUE), $completeLink, 0, 1); $theOutput .= $this->pObj->doc->spacer(15); // Output options $theOutput .= $this->pObj->doc->section($GLOBALS['LANG']->getLL('displayOptions', TRUE), '', FALSE, TRUE); $addParams = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') ? '&template=' . \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') : ''; $theOutput .= '<div class="tst-analyzer-options">' . \TYPO3\CMS\Backend\Utility\BackendUtility::getFuncCheck($this->pObj->id, 'SET[ts_analyzer_checkLinenum]', $this->pObj->MOD_SETTINGS['ts_analyzer_checkLinenum'], '', $addParams, 'id="checkTs_analyzer_checkLinenum"') . '<label for="checkTs_analyzer_checkLinenum">' . $GLOBALS['LANG']->getLL('lineNumbers', TRUE) . '</label> ' . \TYPO3\CMS\Backend\Utility\BackendUtility::getFuncCheck($this->pObj->id, 'SET[ts_analyzer_checkSyntax]', $this->pObj->MOD_SETTINGS['ts_analyzer_checkSyntax'], '', $addParams, 'id="checkTs_analyzer_checkSyntax"') . '<label for="checkTs_analyzer_checkSyntax">' . $GLOBALS['LANG']->getLL('syntaxHighlight', TRUE) . '</label> ' . (!$this->pObj->MOD_SETTINGS['ts_analyzer_checkSyntax'] ? \TYPO3\CMS\Backend\Utility\BackendUtility::getFuncCheck($this->pObj->id, 'SET[ts_analyzer_checkComments]', $this->pObj->MOD_SETTINGS['ts_analyzer_checkComments'], '', $addParams, 'id="checkTs_analyzer_checkComments"') . '<label for="checkTs_analyzer_checkComments">' . $GLOBALS['LANG']->getLL('comments', TRUE) . '</label> ' . \TYPO3\CMS\Backend\Utility\BackendUtility::getFuncCheck($this->pObj->id, 'SET[ts_analyzer_checkCrop]', $this->pObj->MOD_SETTINGS['ts_analyzer_checkCrop'], '', $addParams, 'id="checkTs_analyzer_checkCrop"') . '<label for="checkTs_analyzer_checkCrop">' . $GLOBALS['LANG']->getLL('cropLines', TRUE) . '</label> ' : '') . '</div>'; $theOutput .= $this->pObj->doc->spacer(25); // Output Constants if (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template')) { $theOutput .= $this->pObj->doc->section($GLOBALS['LANG']->getLL('constants', TRUE), '', 0, 1); $theOutput .= $this->pObj->doc->sectionEnd(); $theOutput .= ' <table class="ts-typoscript" border="0" cellpadding="1" cellspacing="0"> '; // Don't know why -2 and not 0... :-) But works. $GLOBALS['tmpl']->ext_lineNumberOffset = -2; $GLOBALS['tmpl']->ext_lineNumberOffset_mode = 'const'; $GLOBALS['tmpl']->ext_lineNumberOffset += count(explode(LF, \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines('' . $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants']))) + 1; reset($GLOBALS['tmpl']->clearList_const); foreach ($GLOBALS['tmpl']->constants as $key => $val) { $cVal = current($GLOBALS['tmpl']->clearList_const); if ($cVal == \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') || \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') == 'all') { $theOutput .= ' <tr> </td><td class="bgColor2"><strong>' . htmlspecialchars($GLOBALS['tmpl']->templateTitles[$cVal]) . '</strong></td></tr> <tr> <td class="bgColor2"><table border="0" cellpadding="0" cellspacing="0" class="bgColor0" width="100%"><tr><td nowrap="nowrap">' . $GLOBALS['tmpl']->ext_outputTS(array($val), $this->pObj->MOD_SETTINGS['ts_analyzer_checkLinenum'], $this->pObj->MOD_SETTINGS['ts_analyzer_checkComments'], $this->pObj->MOD_SETTINGS['ts_analyzer_checkCrop'], $this->pObj->MOD_SETTINGS['ts_analyzer_checkSyntax'], 0) . '</td></tr></table> </td> </tr> '; if (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') != 'all') { break; } } $GLOBALS['tmpl']->ext_lineNumberOffset += count(explode(LF, $val)) + 1; next($GLOBALS['tmpl']->clearList_const); } $theOutput .= ' </table> '; } // Output setup if (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template')) { $theOutput .= $this->pObj->doc->spacer(15); $theOutput .= $this->pObj->doc->section($GLOBALS['LANG']->getLL('setup', TRUE), '', 0, 1); $theOutput .= $this->pObj->doc->sectionEnd(); $theOutput .= ' <table class="ts-typoscript" border="0" cellpadding="1" cellspacing="0"> '; $GLOBALS['tmpl']->ext_lineNumberOffset = 0; $GLOBALS['tmpl']->ext_lineNumberOffset_mode = 'setup'; $GLOBALS['tmpl']->ext_lineNumberOffset += count(explode(LF, \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines('' . $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup']))) + 1; reset($GLOBALS['tmpl']->clearList_setup); foreach ($GLOBALS['tmpl']->config as $key => $val) { if (current($GLOBALS['tmpl']->clearList_setup) == \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') || \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') == 'all') { $theOutput .= ' <tr> <td class="bgColor2"><strong>' . htmlspecialchars($GLOBALS['tmpl']->templateTitles[current($GLOBALS['tmpl']->clearList_setup)]) . '</strong></td></tr> <tr> <td class="bgColor2"><table border="0" cellpadding="0" cellspacing="0" class="bgColor0" width="100%"><tr><td nowrap="nowrap">' . $GLOBALS['tmpl']->ext_outputTS(array($val), $this->pObj->MOD_SETTINGS['ts_analyzer_checkLinenum'], $this->pObj->MOD_SETTINGS['ts_analyzer_checkComments'], $this->pObj->MOD_SETTINGS['ts_analyzer_checkCrop'], $this->pObj->MOD_SETTINGS['ts_analyzer_checkSyntax'], 0) . '</td></tr></table> </td> </tr> '; if (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('template') != 'all') { break; } } $GLOBALS['tmpl']->ext_lineNumberOffset += count(explode(LF, $val)) + 1; next($GLOBALS['tmpl']->clearList_setup); } $theOutput .= ' </table> '; } return $theOutput; }
/** * @static * @throws Exception if file not found * @param string $tsSetupFilePath path to typoscript file * @return array ts-Config */ public static function loadTypoScriptFromFile($tsSetupFilePath) { if (!file_exists($tsSetupFilePath)) { throw new Exception('No Typoscript file found at path ' . $tsSetupFilePath . ' 1316733309'); } $rawTsConfig = file_get_contents($tsSetupFilePath); $tsParser = GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\TypoScript\\Parser\\TypoScriptParser'); /** @var $tsParser \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser */ $tsLines = explode(LF, $rawTsConfig); foreach ($tsLines as &$value) { $includeData = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($value, 1, true); $value = $includeData['typoscript']; } $rawTsConfig = implode(LF, $tsLines); $tsParser->parse($rawTsConfig); $tsArray = $tsParser->setup; return $tsArray; }