2 /***************************************************************
5 * (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 * Libraries for pagegen.php
29 * The script "pagegen.php" is included by "index_ts.php" when a page is not cached but needs to be rendered.
31 * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
34 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
56 * Class for starting TypoScript page generation
58 * The class is not instantiated as an objects but called directly with the "::" operator.
59 * eg: TSpagegen::pagegenInit()
61 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
68 * Setting some vars in TSFE, primarily based on TypoScript config settings.
72 public static function pagegenInit() {
73 if ($GLOBALS['TSFE']->page
['content_from_pid']>0) {
74 $temp_copy_TSFE = clone($GLOBALS['TSFE']); // make REAL copy of TSFE object - not reference!
75 $temp_copy_TSFE->id
= $GLOBALS['TSFE']->page
['content_from_pid']; // Set ->id to the content_from_pid value - we are going to evaluate this pid as was it a given id for a page-display!
76 $temp_copy_TSFE->MP
= '';
77 $temp_copy_TSFE->getPageAndRootlineWithDomain($GLOBALS['TSFE']->config
['config']['content_from_pid_allowOutsideDomain']?
0:$GLOBALS['TSFE']->domainStartPage
);
78 $GLOBALS['TSFE']->contentPid
= intval($temp_copy_TSFE->id
);
79 unset($temp_copy_TSFE);
81 if ($GLOBALS['TSFE']->config
['config']['MP_defaults']) {
82 $temp_parts = t3lib_div
::trimExplode('|', $GLOBALS['TSFE']->config
['config']['MP_defaults'], 1);
83 foreach ($temp_parts as $temp_p) {
84 list($temp_idP, $temp_MPp) = explode(':', $temp_p, 2);
85 $temp_ids=t3lib_div
::intExplode(',', $temp_idP);
86 foreach ($temp_ids as $temp_id) {
87 $GLOBALS['TSFE']->MP_defaults
[$temp_id]=$temp_MPp;
93 $GLOBALS['TSFE']->indexedDocTitle
= $GLOBALS['TSFE']->page
['title'];
94 $GLOBALS['TSFE']->debug
= ''.$GLOBALS['TSFE']->config
['config']['debug'];
97 if (isset($GLOBALS['TSFE']->config
['config']['baseURL'])) {
98 $GLOBALS['TSFE']->baseUrl
= $GLOBALS['TSFE']->config
['config']['baseURL'];
99 $GLOBALS['TSFE']->anchorPrefix
= substr(t3lib_div
::getIndpEnv('TYPO3_REQUEST_URL'), strlen(t3lib_div
::getIndpEnv('TYPO3_SITE_URL')));
102 // Internal and External target defaults
103 $GLOBALS['TSFE']->intTarget
= ''.$GLOBALS['TSFE']->config
['config']['intTarget'];
104 $GLOBALS['TSFE']->extTarget
= ''.$GLOBALS['TSFE']->config
['config']['extTarget'];
105 $GLOBALS['TSFE']->fileTarget
= ''.$GLOBALS['TSFE']->config
['config']['fileTarget'];
106 if ($GLOBALS['TSFE']->config
['config']['spamProtectEmailAddresses'] === 'ascii') {
107 $GLOBALS['TSFE']->spamProtectEmailAddresses
= 'ascii';
109 $GLOBALS['TSFE']->spamProtectEmailAddresses
= t3lib_utility_Math
::forceIntegerInRange($GLOBALS['TSFE']->config
['config']['spamProtectEmailAddresses'], -10, 10, 0);
112 $GLOBALS['TSFE']->absRefPrefix
= ($GLOBALS['TSFE']->config
['config']['absRefPrefix'] ?
trim($GLOBALS['TSFE']->config
['config']['absRefPrefix']) : '');
114 if ($GLOBALS['TSFE']->type
&& $GLOBALS['TSFE']->config
['config']['frameReloadIfNotInFrameset']) {
115 $tdlLD = $GLOBALS['TSFE']->tmpl
->linkData($GLOBALS['TSFE']->page
, '_top', $GLOBALS['TSFE']->no_cache
, '');
116 $GLOBALS['TSFE']->JSCode
= 'if(!parent.'.trim($GLOBALS['TSFE']->sPre
).' && !parent.view_frame) top.location.href="'.$GLOBALS['TSFE']->baseUrlWrap($tdlLD['totalURL']).'"';
118 $GLOBALS['TSFE']->compensateFieldWidth
= ''.$GLOBALS['TSFE']->config
['config']['compensateFieldWidth'];
119 $GLOBALS['TSFE']->lockFilePath
= ''.$GLOBALS['TSFE']->config
['config']['lockFilePath'];
120 $GLOBALS['TSFE']->lockFilePath
= $GLOBALS['TSFE']->lockFilePath ?
$GLOBALS['TSFE']->lockFilePath
: $GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'];
121 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noScaleUp'] = isset($GLOBALS['TSFE']->config
['config']['noScaleUp']) ?
''.$GLOBALS['TSFE']->config
['config']['noScaleUp'] : $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noScaleUp'];
122 $GLOBALS['TSFE']->TYPO3_CONF_VARS
['GFX']['im_noScaleUp'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noScaleUp'];
124 $GLOBALS['TSFE']->ATagParams
= trim($GLOBALS['TSFE']->config
['config']['ATagParams']) ?
' '.trim($GLOBALS['TSFE']->config
['config']['ATagParams']) : '';
125 if ($GLOBALS['TSFE']->config
['config']['setJS_mouseOver']) $GLOBALS['TSFE']->setJS('mouseOver');
126 if ($GLOBALS['TSFE']->config
['config']['setJS_openPic']) $GLOBALS['TSFE']->setJS('openPic');
128 $GLOBALS['TSFE']->sWordRegEx
='';
129 $GLOBALS['TSFE']->sWordList
= t3lib_div
::_GP('sword_list');
130 if (is_array($GLOBALS['TSFE']->sWordList
)) {
131 $space = (!empty($GLOBALS['TSFE']->config
['config']['sword_standAlone'])) ?
'[[:space:]]' : '';
133 foreach ($GLOBALS['TSFE']->sWordList
as $val) {
134 if (strlen(trim($val)) > 0) {
135 $GLOBALS['TSFE']->sWordRegEx
.= $space.quotemeta($val).$space.'|';
138 $GLOBALS['TSFE']->sWordRegEx
= preg_replace('/\|$/', '', $GLOBALS['TSFE']->sWordRegEx
);
142 $GLOBALS['TSFE']->calculateLinkVars();
144 // dtdAllowsFrames indicates whether to use the target attribute in links
145 $GLOBALS['TSFE']->dtdAllowsFrames
= FALSE;
146 if ($GLOBALS['TSFE']->config
['config']['doctype']) {
148 (string) $GLOBALS['TSFE']->config
['config']['doctype'],
149 array('xhtml_frames', 'html5')
151 $GLOBALS['TSFE']->dtdAllowsFrames
= TRUE;
154 $GLOBALS['TSFE']->dtdAllowsFrames
= TRUE;
157 // Setting XHTML-doctype from doctype
158 if (!$GLOBALS['TSFE']->config
['config']['xhtmlDoctype']) {
159 $GLOBALS['TSFE']->config
['config']['xhtmlDoctype'] = $GLOBALS['TSFE']->config
['config']['doctype'];
162 if ($GLOBALS['TSFE']->config
['config']['xhtmlDoctype']) {
163 $GLOBALS['TSFE']->xhtmlDoctype
= $GLOBALS['TSFE']->config
['config']['xhtmlDoctype'];
165 // Checking XHTML-docytpe
166 switch((string)$GLOBALS['TSFE']->config
['config']['xhtmlDoctype']) {
170 $GLOBALS['TSFE']->xhtmlVersion
= 100;
173 $GLOBALS['TSFE']->xhtmlVersion
= 105;
176 case 'xhtml+rdfa_10':
177 $GLOBALS['TSFE']->xhtmlVersion
= 110;
180 $GLOBALS['TSFE']->xhtmlVersion
= 200;
183 $GLOBALS['TSFE']->getPageRenderer()->setRenderXhtml(FALSE);
184 $GLOBALS['TSFE']->xhtmlDoctype
= '';
185 $GLOBALS['TSFE']->xhtmlVersion
= 0;
188 $GLOBALS['TSFE']->getPageRenderer()->setRenderXhtml(FALSE);
193 * Returns an array with files to include. These files are the ones set up in TypoScript config.
195 * @return array Files to include. Paths are relative to PATH_site.
197 public static function getIncFiles() {
198 $incFilesArray = array();
199 // Get files from config.includeLibrary
200 $includeLibrary = trim(''.$GLOBALS['TSFE']->config
['config']['includeLibrary']);
201 if ($includeLibrary) {
202 $incFile=$GLOBALS['TSFE']->tmpl
->getFileName($includeLibrary);
204 $incFilesArray[] = $incFile;
208 if (is_array($GLOBALS['TSFE']->pSetup
['includeLibs.'])) {
209 $incLibs = $GLOBALS['TSFE']->pSetup
['includeLibs.'];
213 if (is_array($GLOBALS['TSFE']->tmpl
->setup
['includeLibs.'])) {
214 // toplevel 'includeLibs' is added to the PAGE.includeLibs. In that way, PAGE-libs get first priority, because if the key already exist, it's not altered. (Due to investigation by me)
215 $incLibs +
= $GLOBALS['TSFE']->tmpl
->setup
['includeLibs.'];
217 if (count($incLibs)) {
218 foreach ($incLibs as $theLib) {
219 if (!is_array($theLib) && $incFile=$GLOBALS['TSFE']->tmpl
->getFileName($theLib)) {
220 $incFilesArray[] = $incFile;
224 return $incFilesArray;
228 * Processing JavaScript handlers
230 * @return array Array with a) a JavaScript section with event handlers and variables set and b) an array with attributes for the body tag.
232 public static function JSeventFunctions() {
233 $functions = array();
234 $setEvents = array();
237 foreach ($GLOBALS['TSFE']->JSeventFuncCalls
as $event => $handlers) {
238 if (count($handlers)) {
239 $functions[] = ' function T3_'.$event.'Wrapper(e) { '.implode(' ', $handlers).' }';
240 $setEvents[] = ' document.'.$event.'=T3_'.$event.'Wrapper;';
241 if ($event == 'onload') {
242 $setBody[]='onload="T3_onloadWrapper();"'; // dubiuos double setting breaks on some browser - do we need it?
247 return array(count($functions)?
implode(LF
, $functions) . LF
. implode(LF
, $setEvents) : '', $setBody);
251 * Rendering the page content
255 public static function renderContent() {
257 $GLOBALS['TT']->incStackPointer();
258 $GLOBALS['TT']->push($GLOBALS['TSFE']->sPre
, 'PAGE');
259 $pageContent = $GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
);
261 if ($GLOBALS['TSFE']->pSetup
['wrap']) {$pageContent = $GLOBALS['TSFE']->cObj
->wrap($pageContent, $GLOBALS['TSFE']->pSetup
['wrap']);}
262 if ($GLOBALS['TSFE']->pSetup
['stdWrap.']) {$pageContent = $GLOBALS['TSFE']->cObj
->stdWrap($pageContent, $GLOBALS['TSFE']->pSetup
['stdWrap.']);}
264 // PAGE HEADER (after content - maybe JS is inserted!
266 // if 'disableAllHeaderCode' is set, all the header-code is discarded!
267 if ($GLOBALS['TSFE']->config
['config']['disableAllHeaderCode']) {
268 $GLOBALS['TSFE']->content
= $pageContent;
270 self
::renderContentWithHeader($pageContent);
272 $GLOBALS['TT']->pull($GLOBALS['TT']->LR?
$GLOBALS['TSFE']->content
:'');
273 $GLOBALS['TT']->decStackPointer();
277 * Rendering normal HTML-page with header by wrapping the generated content ($pageContent) in body-tags and setting the header accordingly.
279 * @param string The page content which TypoScript objects has generated
282 public static function renderContentWithHeader($pageContent) {
283 // get instance of t3lib_PageRenderer
284 /** @var $pageRenderer t3lib_PageRenderer */
285 $pageRenderer = $GLOBALS['TSFE']->getPageRenderer();
287 $pageRenderer->backPath
= TYPO3_mainDir
;
289 if ($GLOBALS['TSFE']->config
['config']['moveJsFromHeaderToFooter']) {
290 $pageRenderer->enableMoveJsFromHeaderToFooter();
293 if ($GLOBALS['TSFE']->config
['config']['pageRendererTemplateFile']) {
294 $file = $GLOBALS['TSFE']->tmpl
->getFileName($GLOBALS['TSFE']->config
['config']['pageRendererTemplateFile']);
296 $pageRenderer->setTemplateFile($file);
300 $headerComment = $GLOBALS['TSFE']->config
['config']['headerComment'];
301 if (trim($headerComment)) {
302 $pageRenderer->addInlineComment(TAB
. str_replace(LF
, LF
. TAB
, trim($headerComment)) . LF
);
306 $theCharset = $GLOBALS['TSFE']->metaCharset
;
308 // Reset the content variables:
309 $GLOBALS['TSFE']->content
= '';
310 $htmlTagAttributes = array ();
311 $htmlLang = $GLOBALS['TSFE']->config
['config']['htmlTag_langKey'] ?
$GLOBALS['TSFE']->config
['config']['htmlTag_langKey'] : 'en';
313 // Set content direction: (More info: http://www.tau.ac.il/~danon/Hebrew/HTML_and_Hebrew.html)
314 if ($GLOBALS['TSFE']->config
['config']['htmlTag_dir']) {
315 $htmlTagAttributes['dir'] = htmlspecialchars($GLOBALS['TSFE']->config
['config']['htmlTag_dir']);
318 // Setting document type:
319 $docTypeParts = array ();
321 // Part 1: XML prologue
322 switch ((string) $GLOBALS['TSFE']->config
['config']['xmlprologue']) {
324 $xmlDocument = FALSE;
325 $GLOBALS['TSFE']->config
['config']['xhtml_cleaning'] = 'none';
328 $docTypeParts[] = '<?xml version="1.0" encoding="' . $theCharset . '"?>';
331 $docTypeParts[] = '<?xml version="1.1" encoding="' . $theCharset . '"?>';
334 if ($GLOBALS['TSFE']->xhtmlVersion
)
335 $docTypeParts[] = '<?xml version="1.0" encoding="' . $theCharset . '"?>';
338 $docTypeParts[] = $GLOBALS['TSFE']->config
['config']['xmlprologue'];
341 $doctype = $GLOBALS['TSFE']->config
['config']['doctype'];
345 $docTypeParts[] = '<!DOCTYPE html
346 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
347 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
349 case 'xhtml_strict' :
350 $docTypeParts[] = '<!DOCTYPE html
351 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
352 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
354 case 'xhtml_frames' :
355 $docTypeParts[] = '<!DOCTYPE html
356 PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
357 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">';
360 $docTypeParts[] = '<!DOCTYPE html
361 PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
362 "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">';
365 $docTypeParts[] = '<!DOCTYPE html
366 PUBLIC "-//W3C//DTD XHTML 1.1//EN"
367 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
370 $docTypeParts[] = '<!DOCTYPE html
371 PUBLIC "-//W3C//DTD XHTML 2.0//EN"
372 "http://www.w3.org/TR/xhtml2/DTD/xhtml2.dtd">';
374 case 'xhtml+rdfa_10' :
375 $docTypeParts[] = '<!DOCTYPE html
376 PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
377 "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">';
380 $docTypeParts[] = '<!DOCTYPE html>';
382 $pageRenderer->setMetaCharsetTag('<meta charset="|" />');
384 $pageRenderer->setMetaCharsetTag('<meta charset="|">');
390 $docTypeParts[] = $doctype;
393 $docTypeParts[] = '<!DOCTYPE html
394 PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
397 if ($GLOBALS['TSFE']->xhtmlVersion
) {
398 $htmlTagAttributes['xml:lang'] = $htmlLang;
400 if ($GLOBALS['TSFE']->xhtmlVersion
< 110 ||
$doctype === 'html5') {
401 $htmlTagAttributes['lang'] = $htmlLang;
404 if ($GLOBALS['TSFE']->xhtmlVersion ||
($doctype === 'html5' && $xmlDocument)) {
405 $htmlTagAttributes['xmlns'] = 'http://www.w3.org/1999/xhtml'; // We add this to HTML5 to achieve a slightly better backwards compatibility
406 if (is_array($GLOBALS['TSFE']->config
['config']['namespaces.'])) {
407 foreach ($GLOBALS['TSFE']->config
['config']['namespaces.'] as $prefix => $uri) {
408 $htmlTagAttributes['xmlns:' . htmlspecialchars($prefix)] = $uri; // $uri gets htmlspecialchared later
413 // Swap XML and doctype order around (for MSIE / Opera standards compliance)
414 if ($GLOBALS['TSFE']->config
['config']['doctypeSwitch']) {
415 $docTypeParts = array_reverse($docTypeParts);
418 // Adding doctype parts:
419 if (count($docTypeParts)) {
420 $pageRenderer->setXmlPrologAndDocType(implode(LF
, $docTypeParts));
423 // Begin header section:
424 if (strcmp($GLOBALS['TSFE']->config
['config']['htmlTag_setParams'], 'none')) {
425 $_attr = $GLOBALS['TSFE']->config
['config']['htmlTag_setParams'] ?
$GLOBALS['TSFE']->config
['config']['htmlTag_setParams'] : t3lib_div
::implodeAttributes($htmlTagAttributes);
430 $htmlTag = '<html' . ($_attr ?
' ' . $_attr : '') . '>';
431 if (isset($GLOBALS['TSFE']->config
['config']['htmlTag_stdWrap.'])) {
432 $htmlTag = $GLOBALS['TSFE']->cObj
->stdWrap(
434 $GLOBALS['TSFE']->config
['config']['htmlTag_stdWrap.']
437 $pageRenderer->setHtmlTag($htmlTag);
440 $headTag = $GLOBALS['TSFE']->pSetup
['headTag'] ?
$GLOBALS['TSFE']->pSetup
['headTag'] : '<head>';
441 $pageRenderer->setHeadTag($headTag);
443 // Setting charset meta tag:
444 $pageRenderer->setCharSet($theCharset);
446 $pageRenderer->addInlineComment(' This website is powered by TYPO3 - inspiring people to share!
447 TYPO3 is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU/GPL.
448 TYPO3 is copyright ' . TYPO3_copyright_year
. ' of Kasper Skaarhoj. Extensions are copyright of their respective owners.
449 Information and contribution at ' . TYPO3_URL_ORG
. '
452 if ($GLOBALS['TSFE']->baseUrl
) {
453 $pageRenderer->setBaseUrl($GLOBALS['TSFE']->baseUrl
);
456 if ($GLOBALS['TSFE']->pSetup
['shortcutIcon']) {
457 $favIcon = $GLOBALS['TSFE']->tmpl
->getFileName($GLOBALS['TSFE']->pSetup
['shortcutIcon']);
459 if (function_exists('finfo_open')) {
460 if (($finfo = @finfo_open
(FILEINFO_MIME
))) {
461 $iconMimeType = ' type="' . finfo_file($finfo, PATH_site
. $favIcon) . '"';
463 $pageRenderer->setIconMimeType($iconMimeType);
466 $pageRenderer->setFavIcon(t3lib_div
::getIndpEnv('TYPO3_SITE_URL') . $favIcon);
470 // Including CSS files
471 if (is_array($GLOBALS['TSFE']->tmpl
->setup
['plugin.'])) {
472 $temp_styleLines = array ();
473 foreach ($GLOBALS['TSFE']->tmpl
->setup
['plugin.'] as $key => $iCSScode) {
474 if (is_array($iCSScode)) {
475 if ($iCSScode['_CSS_DEFAULT_STYLE'] && empty($GLOBALS['TSFE']->config
['config']['removeDefaultCss'])) {
476 $temp_styleLines[] = '/* default styles for extension "' . substr($key, 0, - 1) . '" */' . LF
. $iCSScode['_CSS_DEFAULT_STYLE'];
478 if ($iCSScode['_CSS_PAGE_STYLE']) {
479 $temp_styleLines[] = '/* specific page styles for extension "' . substr($key, 0, - 1) . '" */' .
480 LF
. implode(LF
, $iCSScode['_CSS_PAGE_STYLE']);
484 if (count($temp_styleLines)) {
485 if ($GLOBALS['TSFE']->config
['config']['inlineStyle2TempFile']) {
486 $pageRenderer->addCssFile(self
::inline2TempFile(implode(LF
, $temp_styleLines), 'css'));
488 $pageRenderer->addCssInlineBlock('TSFEinlineStyle', implode(LF
, $temp_styleLines));
493 if ($GLOBALS['TSFE']->pSetup
['stylesheet']) {
494 $ss = $GLOBALS['TSFE']->tmpl
->getFileName($GLOBALS['TSFE']->pSetup
['stylesheet']);
496 $pageRenderer->addCssFile($ss);
500 /**********************************************************************/
502 /* config.includeCSS {
505 /**********************************************************************/
507 if (is_array($GLOBALS['TSFE']->pSetup
['includeCSS.'])) {
508 foreach ($GLOBALS['TSFE']->pSetup
['includeCSS.'] as $key => $CSSfile) {
509 if (!is_array($CSSfile)) {
510 $ss = $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['external'] ?
$CSSfile : $GLOBALS['TSFE']->tmpl
->getFileName($CSSfile);
511 if (isset($GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['if.'])
512 && !$GLOBALS['TSFE']->cObj
->checkIf($GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['if.'])) {
516 if ($GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['import']) {
517 if (! $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['external'] && substr($ss, 0, 1) != '/') { // To fix MSIE 6 that cannot handle these as relative paths (according to Ben v Ende)
518 $ss = t3lib_div
::dirname(t3lib_div
::getIndpEnv('SCRIPT_NAME')) . '/' . $ss;
520 $pageRenderer->addCssInlineBlock(
522 '@import url("' . htmlspecialchars($ss) . '") ' . htmlspecialchars($GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['media']) . ';',
523 empty($GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['disableCompression']),
524 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['forceOnTop'] ?
TRUE : FALSE,
528 $pageRenderer->addCssFile(
530 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['alternate'] ?
'alternate stylesheet' : 'stylesheet',
531 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['media'] ?
$GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['media'] : 'all',
532 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['title'] ?
$GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['title'] : '',
533 empty($GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['disableCompression']),
534 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['forceOnTop'] ?
TRUE : FALSE,
535 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['allWrap'],
536 $GLOBALS['TSFE']->pSetup
['includeCSS.'][$key . '.']['excludeFromConcatenation'] ?
TRUE : FALSE
546 if ($GLOBALS['TSFE']->pSetup
['insertClassesFromRTE']) {
547 $pageTSConfig = $GLOBALS['TSFE']->getPagesTSconfig();
548 $RTEclasses = $pageTSConfig['RTE.']['classes.'];
549 if (is_array($RTEclasses)) {
550 foreach ($RTEclasses as $RTEclassName => $RTEvalueArray) {
551 if ($RTEvalueArray['value']) {
553 .' . substr($RTEclassName, 0, - 1) . ' {' . $RTEvalueArray['value'] . '}';
558 if ($GLOBALS['TSFE']->pSetup
['insertClassesFromRTE.']['add_mainStyleOverrideDefs'] && is_array($pageTSConfig['RTE.']['default.']['mainStyleOverride_add.'])) {
559 $mSOa_tList = t3lib_div
::trimExplode(',', strtoupper($GLOBALS['TSFE']->pSetup
['insertClassesFromRTE.']['add_mainStyleOverrideDefs']), 1);
560 foreach ($pageTSConfig['RTE.']['default.']['mainStyleOverride_add.'] as $mSOa_key => $mSOa_value) {
561 if (! is_array($mSOa_value) && (in_array('*', $mSOa_tList) ||
in_array($mSOa_key, $mSOa_tList))) {
563 ' . $mSOa_key . ' {' . $mSOa_value . '}';
569 // Setting body tag margins in CSS:
570 if (isset($GLOBALS['TSFE']->pSetup
['bodyTagMargins']) && $GLOBALS['TSFE']->pSetup
['bodyTagMargins.']['useCSS']) {
571 $margins = intval($GLOBALS['TSFE']->pSetup
['bodyTagMargins']);
573 BODY {margin: ' . $margins . 'px ' . $margins . 'px ' . $margins . 'px ' . $margins . 'px;}';
576 if ($GLOBALS['TSFE']->pSetup
['adminPanelStyles']) {
579 /* Default styles for the Admin Panel */
580 TABLE.typo3-adminPanel { border: 1px solid black; background-color: #F6F2E6; }
581 TABLE.typo3-adminPanel TR.typo3-adminPanel-hRow TD { background-color: #9BA1A8; }
582 TABLE.typo3-adminPanel TR.typo3-adminPanel-itemHRow TD { background-color: #ABBBB4; }
583 TABLE.typo3-adminPanel TABLE, TABLE.typo3-adminPanel TD { border: 0px; }
584 TABLE.typo3-adminPanel TD FONT { font-family: verdana; font-size: 10px; color: black; }
585 TABLE.typo3-adminPanel TD A FONT { font-family: verdana; font-size: 10px; color: black; }
586 TABLE.typo3-editPanel { border: 1px solid black; background-color: #F6F2E6; }
587 TABLE.typo3-editPanel TD { border: 0px; }
590 // CSS_inlineStyle from TS
591 $style .= trim($GLOBALS['TSFE']->pSetup
['CSS_inlineStyle']);
592 $style .= $GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
['cssInline.'], 'cssInline.');
595 if ($GLOBALS['TSFE']->config
['config']['inlineStyle2TempFile']) {
596 $pageRenderer->addCssFile(self
::inline2TempFile($style, 'css'));
598 $pageRenderer->addCssInlineBlock('additionalTSFEInlineStyle', $style);
602 // Javascript Libraries
603 if (is_array($GLOBALS['TSFE']->pSetup
['javascriptLibs.'])) {
604 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['SVG']) {
605 $pageRenderer->loadSvg();
606 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['SVG.']['debug']) {
607 $pageRenderer->enableSvgDebug();
609 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['SVG.']['forceFlash']) {
610 $pageRenderer->svgForceFlash();
614 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['Prototype']) {
615 $pageRenderer->loadPrototype();
617 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['Scriptaculous']) {
618 $modules = $GLOBALS['TSFE']->pSetup
['javascriptLibs.']['Scriptaculous.']['modules'] ?
$GLOBALS['TSFE']->pSetup
['javascriptLibs.']['Scriptaculous.']['modules'] : '';
619 $pageRenderer->loadScriptaculous($modules);
621 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtCore']) {
622 $pageRenderer->loadExtCore();
623 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtCore.']['debug']) {
624 $pageRenderer->enableExtCoreDebug();
627 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs']) {
628 $css = $GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs.']['css'] ?
TRUE : FALSE;
629 $theme = $GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs.']['theme'] ?
TRUE : FALSE;
630 $adapter = $GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs.']['adapter'] ?
$GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs.']['adapter'] : '';
631 $pageRenderer->loadExtJs($css, $theme, $adapter);
632 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs.']['debug']) {
633 $pageRenderer->enableExtJsDebug();
635 if ($GLOBALS['TSFE']->pSetup
['javascriptLibs.']['ExtJs.']['quickTips']) {
636 $pageRenderer->enableExtJSQuickTips();
641 // JavaScript library files
642 if (is_array($GLOBALS['TSFE']->pSetup
['includeJSlibs.'])) {
643 foreach ($GLOBALS['TSFE']->pSetup
['includeJSlibs.'] as $key => $JSfile) {
644 if (!is_array($JSfile)) {
645 if (isset($GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['if.'])
646 && !$GLOBALS['TSFE']->cObj
->checkIf($GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['if.'])) {
649 $ss = $GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['external'] ?
$JSfile : $GLOBALS['TSFE']->tmpl
->getFileName($JSfile);
651 $type = $GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['type'];
653 $type = 'text/javascript';
655 $pageRenderer->addJsLibrary(
659 empty($GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['disableCompression']),
660 $GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['forceOnTop'] ?
TRUE : FALSE,
661 $GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['allWrap'],
662 $GLOBALS['TSFE']->pSetup
['includeJSlibs.'][$key . '.']['excludeFromConcatenation'] ?
TRUE : FALSE
669 if (is_array($GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'])) {
670 foreach ($GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'] as $key => $JSfile) {
671 if (!is_array($JSfile)) {
672 if (isset($GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['if.'])
673 && !$GLOBALS['TSFE']->cObj
->checkIf($GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['if.'])) {
676 $ss = $GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['external'] ?
$JSfile : $GLOBALS['TSFE']->tmpl
->getFileName($JSfile);
678 $type = $GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['type'];
680 $type = 'text/javascript';
682 $pageRenderer->addJsFooterLibrary(
686 empty($GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['disableCompression']),
687 $GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['forceOnTop'] ?
TRUE : FALSE,
688 $GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['allWrap'],
689 $GLOBALS['TSFE']->pSetup
['includeJSFooterlibs.'][$key . '.']['excludeFromConcatenation'] ?
TRUE : FALSE
697 if (is_array($GLOBALS['TSFE']->pSetup
['includeJS.'])) {
698 foreach ($GLOBALS['TSFE']->pSetup
['includeJS.'] as $key => $JSfile) {
699 if (!is_array($JSfile)) {
700 if (isset($GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['if.'])
701 && !$GLOBALS['TSFE']->cObj
->checkIf($GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['if.'])) {
704 $ss = $GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['external'] ?
$JSfile : $GLOBALS['TSFE']->tmpl
->getFileName($JSfile);
706 $type = $GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['type'];
708 $type = 'text/javascript';
710 $pageRenderer->addJsFile(
713 empty($GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['disableCompression']),
714 $GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['forceOnTop'] ?
TRUE : FALSE,
715 $GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['allWrap'],
716 $GLOBALS['TSFE']->pSetup
['includeJS.'][$key . '.']['excludeFromConcatenation'] ?
TRUE : FALSE
723 if (is_array($GLOBALS['TSFE']->pSetup
['includeJSFooter.'])) {
724 foreach ($GLOBALS['TSFE']->pSetup
['includeJSFooter.'] as $key => $JSfile) {
725 if (!is_array($JSfile)) {
726 if (isset($GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['if.'])
727 && !$GLOBALS['TSFE']->cObj
->checkIf($GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['if.'])) {
730 $ss = $GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['external'] ?
$JSfile : $GLOBALS['TSFE']->tmpl
->getFileName($JSfile);
732 $type = $GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['type'];
734 $type = 'text/javascript';
736 $pageRenderer->addJsFooterFile(
739 empty($GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['disableCompression']),
740 $GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['forceOnTop'] ?
TRUE : FALSE,
741 $GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['allWrap'],
742 $GLOBALS['TSFE']->pSetup
['includeJSFooter.'][$key . '.']['excludeFromConcatenation'] ?
TRUE : FALSE
750 if (is_array($GLOBALS['TSFE']->pSetup
['headerData.'])) {
751 $pageRenderer->addHeaderData($GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
['headerData.'], 'headerData.'));
755 if (is_array($GLOBALS['TSFE']->pSetup
['footerData.'])) {
756 $pageRenderer->addFooterData($GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
['footerData.'], 'footerData.'));
760 $titleTagContent = $GLOBALS['TSFE']->tmpl
->printTitle($GLOBALS['TSFE']->altPageTitle ?
$GLOBALS['TSFE']->altPageTitle
: $GLOBALS['TSFE']->page
['title'], $GLOBALS['TSFE']->config
['config']['noPageTitle'], $GLOBALS['TSFE']->config
['config']['pageTitleFirst']);
761 if ($GLOBALS['TSFE']->config
['config']['titleTagFunction']) {
762 $titleTagContent = $GLOBALS['TSFE']->cObj
->callUserFunction($GLOBALS['TSFE']->config
['config']['titleTagFunction'], array (), $titleTagContent);
765 if (strlen($titleTagContent) && intval($GLOBALS['TSFE']->config
['config']['noPageTitle']) !== 2) {
766 $pageRenderer->setTitle($titleTagContent);
769 // add ending slash only to documents rendered as xhtml
770 $endingSlash = $GLOBALS['TSFE']->xhtmlVersion ?
' /' : '';
772 $pageRenderer->addMetaTag('<meta name="generator" content="TYPO3 ' . TYPO3_branch
. ' CMS"' . $endingSlash . '>');
774 $conf = $GLOBALS['TSFE']->pSetup
['meta.'];
775 if (is_array($conf)) {
776 foreach ($conf as $theKey => $theValue) {
777 if (! strstr($theKey, '.') ||
! isset($conf[substr($theKey, 0, - 1)])) { // Only if 1) the property is set but not the value itself, 2) the value and/or any property
778 if (strstr($theKey, '.')) {
779 $theKey = substr($theKey, 0, - 1);
781 $val = $GLOBALS['TSFE']->cObj
->stdWrap($conf[$theKey], $conf[$theKey . '.']);
785 if (strtolower($key) === 'refresh' ||
!empty($conf[$theKey . '.']['httpEquivalent'])) {
788 $pageRenderer->addMetaTag('<meta ' . $a . '="' . $key . '" content="' . htmlspecialchars(trim($val)) . '"' . $endingSlash . '>');
794 unset($GLOBALS['TSFE']->additionalHeaderData
['JSCode']);
795 unset($GLOBALS['TSFE']->additionalHeaderData
['JSImgCode']);
797 if (is_array($GLOBALS['TSFE']->config
['INTincScript'])) {
798 // Storing the JSCode and JSImgCode vars...
799 $GLOBALS['TSFE']->additionalHeaderData
['JSCode'] = $GLOBALS['TSFE']->JSCode
;
800 $GLOBALS['TSFE']->additionalHeaderData
['JSImgCode'] = $GLOBALS['TSFE']->JSImgCode
;
801 $GLOBALS['TSFE']->config
['INTincScript_ext']['divKey'] = $GLOBALS['TSFE']->uniqueHash();
802 $GLOBALS['TSFE']->config
['INTincScript_ext']['additionalHeaderData'] = $GLOBALS['TSFE']->additionalHeaderData
; // Storing the header-data array
803 $GLOBALS['TSFE']->config
['INTincScript_ext']['additionalJavaScript'] = $GLOBALS['TSFE']->additionalJavaScript
; // Storing the JS-data array
804 $GLOBALS['TSFE']->config
['INTincScript_ext']['additionalCSS'] = $GLOBALS['TSFE']->additionalCSS
; // Storing the Style-data array
807 $GLOBALS['TSFE']->additionalHeaderData
= array ('<!--HD_' . $GLOBALS['TSFE']->config
['INTincScript_ext']['divKey'] . '-->'); // Clearing the array
808 $GLOBALS['TSFE']->divSection
.= '<!--TDS_' . $GLOBALS['TSFE']->config
['INTincScript_ext']['divKey'] . '-->';
810 $GLOBALS['TSFE']->INTincScript_loadJSCode();
812 $JSef = self
::JSeventFunctions();
814 // Adding default Java Script:
816 var browserName = navigator.appName;
817 var browserVer = parseInt(navigator.appVersion);
819 var msie4 = (browserName == "Microsoft Internet Explorer" && browserVer >= 4);
820 if ((browserName == "Netscape" && browserVer >= 3) || msie4 || browserName=="Konqueror" || browserName=="Opera") {version = "n3";} else {version = "n2";}
822 function blurLink(theObject) { //
823 if (msie4) {theObject.blur();}
827 if ($GLOBALS['TSFE']->spamProtectEmailAddresses
&& $GLOBALS['TSFE']->spamProtectEmailAddresses
!== 'ascii') {
829 // decrypt helper function
830 function decryptCharcode(n,start,end,offset) {
832 if (offset > 0 && n > end) {
833 n = start + (n - end - 1);
834 } else if (offset < 0 && n < start) {
835 n = end - (start - n - 1);
837 return String.fromCharCode(n);
840 function decryptString(enc,offset) {
842 var len = enc.length;
843 for(var i=0; i < len; i++) {
844 var n = enc.charCodeAt(i);
845 if (n >= 0x2B && n <= 0x3A) {
846 dec += decryptCharcode(n,0x2B,0x3A,offset); // 0-9 . , - + / :
847 } else if (n >= 0x40 && n <= 0x5A) {
848 dec += decryptCharcode(n,0x40,0x5A,offset); // A-Z @
849 } else if (n >= 0x61 && n <= 0x7A) {
850 dec += decryptCharcode(n,0x61,0x7A,offset); // a-z
852 dec += enc.charAt(i);
857 // decrypt spam-protected emails
858 function linkTo_UnCryptMailto(s) {
859 location.href = decryptString(s,' . ($GLOBALS['TSFE']->spamProtectEmailAddresses
* - 1) . ');
868 if (is_array($GLOBALS['TSFE']->inlineJS
)) {
869 foreach ($GLOBALS['TSFE']->inlineJS
as $key => $val) {
870 if (! is_array($val)) {
871 $inlineJS .= LF
. $val . LF
;
876 // defined in TS with page.inlineJS
877 // Javascript inline code
878 $inline = $GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
['jsInline.'], 'jsInline.');
880 $inlineJS .= LF
. $inline . LF
;
883 // Javascript inline code for Footer
884 $inlineFooterJs = $GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
['jsFooterInline.'], 'jsFooterInline.');
887 if ($GLOBALS['TSFE']->config
['config']['compressJs']) {
888 $pageRenderer->enableCompressJavascript();
889 $minifyErrorScript = $minifyErrorInline = '';
890 $scriptJsCode = t3lib_div
::minifyJavaScript($scriptJsCode, $minifyErrorScript);
891 if ($minifyErrorScript) {
892 $GLOBALS['TT']->setTSlogMessage($minifyErrorScript, 3);
895 $inlineJS = t3lib_div
::minifyJavaScript($inlineJS, $minifyErrorInline);
896 if ($minifyErrorInline) {
897 $GLOBALS['TT']->setTSlogMessage($minifyErrorInline, 3);
900 if ($inlineFooterJs) {
901 $inlineFooterJs = t3lib_div
::minifyJavaScript($inlineFooterJs, $minifyErrorInline);
902 if ($minifyErrorInline) {
903 $GLOBALS['TT']->setTSlogMessage($minifyErrorInline, 3);
909 if (! $GLOBALS['TSFE']->config
['config']['removeDefaultJS']) {
910 // inlude default and inlineJS
912 $pageRenderer->addJsInlineCode('_scriptCode', $scriptJsCode, $GLOBALS['TSFE']->config
['config']['compressJs']);
915 $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $GLOBALS['TSFE']->config
['config']['compressJs']);
917 if ($inlineFooterJs) {
918 $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $GLOBALS['TSFE']->config
['config']['compressJs']);
920 } elseif ($GLOBALS['TSFE']->config
['config']['removeDefaultJS'] === 'external') {
922 * This keeps inlineJS from *_INT Objects from being moved to external files.
923 * At this point in frontend rendering *_INT Objects only have placeholders instead
924 * of actual content so moving these placeholders to external files would
925 * a) break the JS file (syntax errors due to the placeholders)
926 * b) the needed JS would never get included to the page
927 * Therefore inlineJS from *_INT Objects must not be moved to external files but
931 self
::stripIntObjectPlaceholder($inlineJS, $inlineJSint);
933 $pageRenderer->addJsInlineCode('TS_inlineJSint', $inlineJSint, $GLOBALS['TSFE']->config
['config']['compressJs']);
935 $pageRenderer->addJsFile(self
::inline2TempFile($scriptJsCode . $inlineJS, 'js'), 'text/javascript', $GLOBALS['TSFE']->config
['config']['compressJs']);
937 if ($inlineFooterJs) {
938 $inlineFooterJSint = '';
939 self
::stripIntObjectPlaceholder($inlineFooterJs, $inlineFooterJSint);
940 if ($inlineFooterJSint) {
941 $pageRenderer->addJsFooterInlineCode('TS_inlineFooterJSint', $inlineFooterJSint, $GLOBALS['TSFE']->config
['config']['compressJs']);
943 $pageRenderer->addJsFooterFile(self
::inline2TempFile($inlineFooterJs, 'js'), 'text/javascript', $GLOBALS['TSFE']->config
['config']['compressJs']);
946 // include only inlineJS
948 $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $GLOBALS['TSFE']->config
['config']['compressJs']);
950 if ($inlineFooterJs) {
951 $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $GLOBALS['TSFE']->config
['config']['compressJs']);
955 // ExtJS specific code
956 if (is_array($GLOBALS['TSFE']->pSetup
['inlineLanguageLabel.'])) {
957 $pageRenderer->addInlineLanguageLabelArray($GLOBALS['TSFE']->pSetup
['inlineLanguageLabel.']);
960 if (is_array($GLOBALS['TSFE']->pSetup
['inlineSettings.'])) {
961 $pageRenderer->addInlineSettingArray('TS', $GLOBALS['TSFE']->pSetup
['inlineSettings.']);
964 if (is_array($GLOBALS['TSFE']->pSetup
['extOnReady.'])) {
965 $pageRenderer->addExtOnReadyCode($GLOBALS['TSFE']->cObj
->cObjGet($GLOBALS['TSFE']->pSetup
['extOnReady.'], 'extOnReady.'));
968 // compression and concatenate settings
969 if ($GLOBALS['TSFE']->config
['config']['compressCss']) {
970 $pageRenderer->enableCompressCss();
972 if ($GLOBALS['TSFE']->config
['config']['compressJs']) {
973 $pageRenderer->enableCompressJavascript();
975 if ($GLOBALS['TSFE']->config
['config']['concatenateCss']) {
976 $pageRenderer->enableConcatenateCss();
978 if ($GLOBALS['TSFE']->config
['config']['concatenateJs']) {
979 $pageRenderer->enableConcatenateJavascript();
981 // backward compatibility for old configuration
982 if ($GLOBALS['TSFE']->config
['config']['concatenateJsAndCss']) {
983 $pageRenderer->enableConcatenateFiles();
986 // add header data block
987 if ($GLOBALS['TSFE']->additionalHeaderData
) {
988 $pageRenderer->addHeaderData(implode(LF
, $GLOBALS['TSFE']->additionalHeaderData
));
991 // add footer data block
992 if ($GLOBALS['TSFE']->additionalFooterData
) {
993 $pageRenderer->addFooterData(implode(LF
, $GLOBALS['TSFE']->additionalFooterData
));
996 // Header complete, now add content
999 if ($GLOBALS['TSFE']->pSetup
['frameSet.']) {
1000 $fs = t3lib_div
::makeInstance('tslib_frameset');
1001 $pageRenderer->addBodyContent($fs->make($GLOBALS['TSFE']->pSetup
['frameSet.']));
1002 $pageRenderer->addBodyContent(LF
. '<noframes>' . LF
);
1006 $defBT = $GLOBALS['TSFE']->pSetup
['bodyTagCObject'] ?
$GLOBALS['TSFE']->cObj
->cObjGetSingle($GLOBALS['TSFE']->pSetup
['bodyTagCObject'], $GLOBALS['TSFE']->pSetup
['bodyTagCObject.'], 'bodyTagCObject') : '';
1008 $defBT = $GLOBALS['TSFE']->defaultBodyTag
;
1009 $bodyTag = $GLOBALS['TSFE']->pSetup
['bodyTag'] ?
$GLOBALS['TSFE']->pSetup
['bodyTag'] : $defBT;
1010 if ($bgImg = $GLOBALS['TSFE']->cObj
->getImgResource($GLOBALS['TSFE']->pSetup
['bgImg'], $GLOBALS['TSFE']->pSetup
['bgImg.'])) {
1011 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' background="' . $GLOBALS["TSFE"]->absRefPrefix
. $bgImg[3] . '">';
1014 if (isset($GLOBALS['TSFE']->pSetup
['bodyTagMargins'])) {
1015 $margins = intval($GLOBALS['TSFE']->pSetup
['bodyTagMargins']);
1016 if ($GLOBALS['TSFE']->pSetup
['bodyTagMargins.']['useCSS']) {
1017 // Setting margins in CSS, see above
1019 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' leftmargin="' . $margins . '" topmargin="' . $margins . '" marginwidth="' . $margins . '" marginheight="' . $margins . '">';
1023 if (trim($GLOBALS['TSFE']->pSetup
['bodyTagAdd'])) {
1024 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' ' . trim($GLOBALS['TSFE']->pSetup
['bodyTagAdd']) . '>';
1027 if (count($JSef[1])) { // Event functions:
1028 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' ' . trim(implode(' ', $JSef[1])) . '>';
1030 $pageRenderer->addBodyContent(LF
. $bodyTag);
1033 if ($GLOBALS['TSFE']->divSection
) {
1034 $pageRenderer->addBodyContent(LF
. $GLOBALS['TSFE']->divSection
);
1038 $pageRenderer->addBodyContent(LF
. $pageContent);
1040 // Render complete page
1041 $GLOBALS['TSFE']->content
= $pageRenderer->render();
1044 if ($GLOBALS['TSFE']->pSetup
['frameSet.']) {
1045 $GLOBALS['TSFE']->content
.= LF
. '</noframes>';
1062 /*************************
1065 * Remember: Calls internally must still be done on the non-instantiated class: TSpagegen::inline2TempFile()
1067 *************************/
1070 * Searches for placeholder created from *_INT cObjects, removes them from
1071 * $searchString and merges them to $intObjects
1073 * @param string $searchString: the String which should be cleaned from int-object markers
1074 * @param string $intObjects: the String the found int-placeholders are moved to (for further processing)
1076 protected static function stripIntObjectPlaceholder(&$searchString, &$intObjects) {
1077 $tempArray = array();
1078 preg_match_all('/\<\!--INT_SCRIPT.[a-z0-9]*--\>/', $searchString, $tempArray);
1079 $searchString = preg_replace('/\<\!--INT_SCRIPT.[a-z0-9]*--\>/', '', $searchString);
1080 $intObjects = implode('', $tempArray[0]);
1084 * Writes string to a temporary file named after the md5-hash of the string
1086 * @param string CSS styles / JavaScript to write to file.
1087 * @param string Extension: "css" or "js"
1088 * @return string <script> or <link> tag for the file.
1090 public static function inline2TempFile($str, $ext) {
1092 // Create filename / tags:
1096 $script = 'typo3temp/javascript_' . substr(md5($str), 0, 10) . '.js';
1099 $script = 'typo3temp/stylesheet_' . substr(md5($str), 0, 10) . '.css';
1105 if (! @is_file
(PATH_site
. $script)) {
1106 t3lib_div
::writeFile(PATH_site
. $script, $str);
1114 * Checks if the value defined in "config.linkVars" contains an allowed value. Otherwise, return FALSE which means the value will not be added to any links.
1116 * @param string The string in which to find $needle
1117 * @param string The string to find in $haystack
1118 * @return boolean Returns TRUE if $needle matches or is found in $haystack
1120 public static function isAllowedLinkVarValue($haystack, $needle) {
1123 if ($needle=='int' ||
$needle=='integer') { // Integer
1125 if (t3lib_utility_Math
::canBeInterpretedAsInteger($haystack)) {
1129 } elseif (preg_match('/^\/.+\/[imsxeADSUXu]*$/', $needle)) { // Regular expression, only "//" is allowed as delimiter
1131 if (@preg_match
($needle, $haystack)) {
1135 } elseif (strstr($needle, '-')) { // Range
1137 if (t3lib_utility_Math
::canBeInterpretedAsInteger($haystack)) {
1138 $range = explode('-', $needle);
1139 if ($range[0] <= $haystack && $range[1] >= $haystack) {
1144 } elseif (strstr($needle, '|')) { // List
1146 $haystack = str_replace(' ', '', $haystack); // Trim the input
1147 if (strstr('|'.$needle.'|', '|'.$haystack.'|')) {
1151 } elseif (!strcmp($needle, $haystack)) { // String comparison
1160 * Class for fetching record relations for the frontend.
1162 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
1165 * @see tslib_cObj::RECORDS()
1167 class FE_loadDBGroup
extends t3lib_loadDBGroup
{
1168 var $fromTC = 0; // Means that everything is returned instead of only uid and label-field