if (!defined('TYPO3_MODE')) die("Can't include this file directly.");
-require_once(PATH_t3lib.'class.t3lib_ajax.php');
-
-
-
-
-
-
-
-
-
/**
* Deprecated fontwrap function. Is just transparent now.
* @return string Output string (in the old days this was wrapped in <font> tags)
* @deprecated since TYPO3 3.6
*/
-function fw($str) {
+function fw($str) {
+ t3lib_div::logDeprecatedFunction();
return $str;
}
var $form=''; // This can be set to the HTML-code for a formtag. Useful when you need a form to span the whole page; Inserted exactly after the body-tag.
var $JScodeLibArray = array(); // Similar to $JScode (see below) but used as an associative array to prevent double inclusion of JS code. This is used to include certain external Javascript libraries before the inline JS code. <script>-Tags are not wrapped around automatically
var $JScode=''; // Additional header code (eg. a JavaScript section) could be accommulated in this var. It will be directly outputted in the header.
- var $extJsCode = ''; // Additional header code for ExtJS. It will be included in document header and inserted in a Ext.onReady(function()
+ var $extJScode = ''; // Additional header code for ExtJS. It will be included in document header and inserted in a Ext.onReady(function()
var $JScodeArray = array(); // Similar to $JScode but for use as array with associative keys to prevent double inclusion of JS code. a <script> tag is automatically wrapped around.
var $postCode=''; // Additional 'page-end' code could be accommulated in this var. It will be outputted at the end of page before </body> and some other internal page-end code.
var $docType = ''; // Doc-type used in the header. Default is xhtml_trans. You can also set it to 'html_3', 'xhtml_strict' or 'xhtml_frames'.
var $form_rowsToStylewidth = 9.58; // Multiplication factor for formWidth() input size (default is 48* this value).
var $form_largeComp = 1.33; // Compensation for large documents (used in class.t3lib_tceforms.php)
var $endJS=1; // If set, then a JavaScript section will be outputted in the bottom of page which will try and update the top.busy session expiry object.
- protected $additionalStyleSheets=array(); // Links to additional style sheets
// TYPO3 Colorscheme.
// If you want to change this, please do so through a skin using the global var $TBE_STYLES
var $bgColor5 = '#ABBBB4'; // light tablerow background, greenish
var $bgColor6 = '#E7DBA8'; // light tablerow background, yellowish, for section headers. Light.
var $hoverColor = '#254D7B';
- var $styleSheetFile = 'stylesheet.css'; // Filename of stylesheet (relative to PATH_typo3)
+ var $styleSheetFile = ''; // Filename of stylesheet (relative to PATH_typo3)
var $styleSheetFile2 = ''; // Filename of stylesheet #2 - linked to right after the $this->styleSheetFile script (relative to PATH_typo3)
var $styleSheetFile_post = ''; // Filename of a post-stylesheet - included right after all inline styles.
var $backGroundImage = ''; // Background image of page (relative to PATH_typo3)
var $inDocStyles_TBEstyle = ''; // Inline css styling set from TBE_STYLES array
+ /**
+ * Whether to use the X-UA-Compatible meta tag
+ * @var boolean
+ */
+ protected $useCompatibilityTag = TRUE;
+
+ // Skinning
+ // stylesheets from core
+ protected $stylesheetsCore = array(
+ 'structure' => 'stylesheets/structure/',
+ 'visual' => 'stylesheets/visual/',
+ 'generatedSprites' => '../typo3temp/sprites/',
+ );
+
+ // include these CSS directories from skins by default
+ protected $stylesheetsSkins = array(
+ 'structure' => 'stylesheets/structure/',
+ 'visual' => 'stylesheets/visual/',
+ );
+
// DEV:
var $parseTimeFlag = 0; // Will output the parsetime of the scripts in milliseconds (for admin-users). Set this to false when releasing TYPO3. Only for dev.
var $sectionFlag=0; // Internal: Indicates if a <div>-output section is open
var $divClass = ''; // (Default) Class for wrapping <DIV>-tag of page. Is set in class extensions.
- // internal flags for JS-libraries
- protected $addPrototype = false;
- protected $addScriptaculousModules = array(
- 'builder' => false,
- 'effects' => false,
- 'dragdrop' => false,
- 'controls' => false,
- 'slider' => false
- );
- protected $addExtJS = false;
- protected $addExtJSdebug = false;
+ var $pageHeaderBlock = '';
+ var $endOfPageJsBlock = '';
+ var $hasDocheader = true;
+
+ /**
+ * @var t3lib_PageRenderer
+ */
+ protected $pageRenderer;
+ protected $pageHeaderFooterTemplateFile = ''; // alternative template file
+
+ /**
+ * Whether flashmessages should be rendered or not
+ *
+ * @var $showFlashMessages
+ */
+ public $showFlashMessages = TRUE;
/**
* Constructor
function template() {
global $TBE_STYLES;
+ // Initializes the page rendering object:
+ $this->getPageRenderer();
+
// Setting default scriptID:
if (($temp_M = (string) t3lib_div::_GET('M')) && $GLOBALS['TBE_MODULES']['_PATHS'][$temp_M]) {
- $this->scriptID = ereg_replace('^.*\/(sysext|ext)\/', 'ext/', $GLOBALS['TBE_MODULES']['_PATHS'][$temp_M] . 'index.php');
+ $this->scriptID = preg_replace('/^.*\/(sysext|ext)\//', 'ext/', $GLOBALS['TBE_MODULES']['_PATHS'][$temp_M] . 'index.php');
} else {
- $this->scriptID = ereg_replace('^.*\/(sysext|ext)\/', 'ext/', substr(PATH_thisScript, strlen(PATH_site)));
+ $this->scriptID = preg_replace('/^.*\/(sysext|ext)\//', 'ext/', substr(PATH_thisScript, strlen(PATH_site)));
}
if (TYPO3_mainDir!='typo3/' && substr($this->scriptID,0,strlen(TYPO3_mainDir)) == TYPO3_mainDir) {
$this->scriptID = 'typo3/'.substr($this->scriptID,strlen(TYPO3_mainDir)); // This fixes if TYPO3_mainDir has been changed so the script ids are STILL "typo3/..."
}
- $this->bodyTagId = ereg_replace('[^[:alnum:]-]','-',$this->scriptID);
+ $this->bodyTagId = preg_replace('/[^A-Za-z0-9-]/','-',$this->scriptID);
// Individual configuration per script? If so, make a recursive merge of the arrays:
if (is_array($TBE_STYLES['scriptIDindex'][$this->scriptID])) {
if ($TBE_STYLES['styleSheetFile_post']) $this->styleSheetFile_post = $TBE_STYLES['styleSheetFile_post'];
if ($TBE_STYLES['inDocStyles_TBEstyle']) $this->inDocStyles_TBEstyle = $TBE_STYLES['inDocStyles_TBEstyle'];
+ // include all stylesheets
+ foreach ($this->getSkinStylesheetDirectories() as $stylesheetDirectory) {
+ $this->addStylesheetDirectory($stylesheetDirectory);
+ }
+
// Background image
if ($TBE_STYLES['background']) $this->backGroundImage = $TBE_STYLES['background'];
}
-
+ /**
+ * Gets instance of PageRenderer
+ *
+ * @return t3lib_PageRenderer
+ */
+ public function getPageRenderer() {
+ if (!isset($this->pageRenderer)) {
+ $this->pageRenderer = t3lib_div::makeInstance('t3lib_PageRenderer');
+ $this->pageRenderer->setTemplateFile(
+ TYPO3_mainDir . 'templates/template_page_backend.html'
+ );
+ $this->pageRenderer->setLanguage($GLOBALS['LANG']->lang);
+ $this->pageRenderer->enableConcatenateFiles();
+ $this->pageRenderer->enableCompressCss();
+ $this->pageRenderer->enableCompressJavascript();
+ }
+ return $this->pageRenderer;
+ }
$viewPage = $noViewPageIcon ? '' : $this->viewPageIcon($row['uid'],$this->backPath,'');
if ($table=='pages') $path.=' - '.t3lib_BEfunc::titleAttribForPages($row,'',0);
} else {
- $iconImgTag='<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/i/_icon_website.gif',$wHattribs='width="18" height="16"').' title="'.htmlspecialchars($path).'" alt="" />';
+ $iconImgTag = t3lib_iconWorks::getSpriteIcon('apps-pagetree-page-domain', array('title' => htmlspecialchars($path)));
$title=$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
}
$pathInfo = parse_url(t3lib_div::getIndpEnv('REQUEST_URI'));
// Add the module identifier automatically if typo3/mod.php is used:
- if (ereg('typo3/mod\.php$', $pathInfo['path']) && isset($GLOBALS['TBE_MODULES']['_PATHS'][$modName])) {
+ if (preg_match('/typo3\/mod\.php$/', $pathInfo['path']) && isset($GLOBALS['TBE_MODULES']['_PATHS'][$modName])) {
$storeUrl = '&M='.$modName.$storeUrl;
}
.'\''.rawurlencode($pathInfo['path']."?".$storeUrl).$mMN.'\''
.');return false;';
- $sIcon = '<a href="#" onclick="'.htmlspecialchars($onClick).'"><img'.t3lib_iconWorks::skinImg($backPath,'gfx/shortcut.gif','width="14" height="14"').' title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.makeShortcut',1).'" alt="" /></a>';
+ $sIcon = '<a href="#" onclick="' . htmlspecialchars($onClick).'" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.makeShortcut', TRUE) . '">'
+ . t3lib_iconworks::getSpriteIcon('actions-system-shortcut-new') . '</a>';
return $sIcon;
}
}
}
+ /**
+ * Defines whether to use the X-UA-Compatible meta tag.
+ *
+ * @param boolean $useCompatibilityTag Whether to use the tag
+ * @return void
+ */
+ public function useCompatibilityTag($useCompatibilityTag = TRUE) {
+ $this->useCompatibilityTag = (bool) $useCompatibilityTag;
+ }
+
}
}
- // Get META tag containing the currently selected charset for backend output. The function sets $this->charSet.
- $charSet = $this->initCharset();
- $generator = $this->generator();
+ $this->pageRenderer->backPath = $this->backPath;
+ // alternative template for Header and Footer
+ if ($this->pageHeaderFooterTemplateFile) {
+ $file = t3lib_div::getFileAbsFileName($this->pageHeaderFooterTemplateFile, TRUE);
+ if ($file) {
+ $this->pageRenderer->setTemplateFile($file);
+ }
+ }
// For debugging: If this outputs "QuirksMode"/"BackCompat" (IE) the browser runs in quirks-mode. Otherwise the value is "CSS1Compat"
# $this->JScodeArray[]='alert(document.compatMode);';
// Send HTTP header for selected charset. Added by Robert Lemke 23.10.2003
+ $this->initCharset();
header ('Content-Type:text/html;charset='.$this->charset);
+ // Standard HTML tag
+ $htmlTag = '<html xmlns="http://www.w3.org/1999/xhtml">';
+
switch($this->docType) {
case 'html_3':
$headerStart = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">';
+ $htmlTag = '<html>';
+ // disable rendering of XHTML tags
+ $this->getPageRenderer()->setRenderXhtml(FALSE);
break;
case 'xhtml_strict':
$headerStart = '<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<?xml version="1.0" encoding="'.$this->charset.'"?>
-<?xml-stylesheet href="#internalStyle" type="text/css"?>
-';
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
break;
case 'xhtml_frames':
$headerStart = '<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
-<?xml version="1.0" encoding="'.$this->charset.'"?>
-';
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">';
+ break;
+ case 'html_5':
+ $headerStart = '<!DOCTYPE html>' . LF;
+ $htmlTag = '<html>';
+ // disable rendering of XHTML tags
+ $this->getPageRenderer()->setRenderXhtml(FALSE);
break;
- // The fallthrough is intended as XHTML 1.0 transitional is the default for the BE.
+ // The fallthrough is intended as XHTML 1.0 transitional is the default for the BE.
case 'xhtml_trans':
default:
$headerStart = '<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<?xml version="1.0" encoding="'.$this->charset.'"?>
-<?xml-stylesheet href="#internalStyle" type="text/css"?>
-';
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
}
+ $this->pageRenderer->setHtmlTag($htmlTag);
+
// This loads the tabulator-in-textarea feature. It automatically modifies
// every textarea which is found.
if (!$GLOBALS['BE_USER']->uc['disableTabInTextarea']) {
$this->loadJavascriptLib('tab.js');
}
+ // Get the browser info
+ $browserInfo = t3lib_utility_Client::getBrowserInfo(t3lib_div::getIndpEnv('HTTP_USER_AGENT'));
+
+ // Set the XML prologue
+ $xmlPrologue = '<?xml version="1.0" encoding="' . $this->charset . '"?>';
+
+ // Set the XML stylesheet
+ $xmlStylesheet = '<?xml-stylesheet href="#internalStyle" type="text/css"?>';
+
+ // Add the XML prologue for XHTML doctypes
+ if ($this->docType !== 'html_3' && $this->docType !== 'html_5') {
+ // Put the XML prologue before or after the doctype declaration according to browser
+ if ($browserInfo['browser'] === 'msie' && $browserInfo['version'] < 7) {
+ $headerStart = $headerStart . LF . $xmlPrologue;
+ } else {
+ $headerStart = $xmlPrologue . LF . $headerStart;
+ }
+
+ // Add the xml stylesheet according to doctype
+ if ($this->docType !== 'xhtml_frames') {
+ $headerStart = $headerStart . LF . $xmlStylesheet;
+ }
+ }
+
+ $this->pageRenderer->setXmlPrologAndDocType($headerStart);
+ $this->pageRenderer->setHeadTag('<head>' . LF. '<!-- TYPO3 Script ID: '.htmlspecialchars($this->scriptID).' -->');
+ $this->pageRenderer->setCharSet($this->charset);
+ $this->pageRenderer->addMetaTag($this->generator());
+ if ($this->useCompatibilityTag) {
+ $this->pageRenderer->addMetaTag($this->xUaCompatible());
+ }
+ $this->pageRenderer->setTitle($title);
+
+ // add docstyles
+ $this->docStyle();
+
+
+ // add jsCode - has to go to headerData as it may contain the script tags already
+ $this->pageRenderer->addHeaderData($this->JScode);
+
+ foreach ($this->JScodeArray as $name => $code) {
+ $this->pageRenderer->addJsInlineCode($name, $code);
+ }
+
+ if (count($this->JScodeLibArray)) {
+ foreach($this->JScodeLibArray as $library) {
+ $this->pageRenderer->addHeaderData($library);
+ }
+ }
+
+ if ($this->extJScode) {
+ $this->pageRenderer->addExtOnReadyCode($this->extJScode);
+ }
+
// Construct page header.
- $str = $headerStart.'
-<html>
-<head>
- <!-- TYPO3 Script ID: '.htmlspecialchars($this->scriptID).' -->
- '.$charSet.'
- '.$generator.'
- <title>'.htmlspecialchars($title).'</title>
- '.$this->docStyle().'
- ' . $this->renderJSlibraries() . '
- '.$this->JScode.'
- '.$this->wrapScriptTags(implode("\n", $this->JScodeArray)).
- ($this->extJsCode ? $this->wrapScriptTags('Ext.onReady(function() {' . chr(10) . $this->extJsCode . chr(10) . '});') : '') .
- '
- <!--###POSTJSMARKER###-->
-</head>
-';
+ $str = $this->pageRenderer->render(t3lib_PageRenderer::PART_HEADER);
+
$this->JScodeLibArray = array();
- $this->JScode = $this->extJsCode = '';
+ $this->JScode = $this->extJScode = '';
$this->JScodeArray = array();
+ $this->endOfPageJsBlock = $this->pageRenderer->render(t3lib_PageRenderer::PART_FOOTER);
+
if ($this->docType=='xhtml_frames') {
return $str;
} else
$this->parseTime().
($this->form?'
</form>':'');
+ // if something is in buffer like debug, put it to end of page
+ if (ob_get_contents()) {
+ $str .= ob_get_clean();
+ header('Content-Encoding: None');
+ }
- if ($this->docType!='xhtml_frames') {
+ if ($this->docType !== 'xhtml_frames') {
$str .= ($this->divClass?'
<!-- Wrapping DIV-section for whole page END -->
-</div>':'').'
-</body> ';
+</div>':'') . $this->endOfPageJsBlock ;
}
- $str .= '</html>';
// Logging: Can't find better place to put it:
if (TYPO3_DLOG) t3lib_div::devLog('END of BACKEND session', 'template', 0, array('_FLUSH' => true));
* @param string Additional attributes to h-tag, eg. ' class=""'
* @return string HTML content
*/
- function sectionHeader($label,$sH=FALSE,$addAttrib='') {
- $tag = ($sH?'h3':'h4');
+ function sectionHeader($label, $sH=FALSE, $addAttrib='') {
+ $tag = ($sH ? 'h3' : 'h4');
+ if ($addAttrib && substr($addAttrib, 0, 1) !== ' ') {
+ $addAttrib = ' ' . $addAttrib;
+ }
$str='
<!-- Section header -->
- <'.$tag.$addAttrib.'>'.$label.'</'.$tag.'>
+ <' . $tag . $addAttrib . '>' . $label . '</' . $tag . '>
';
- return $this->sectionBegin().$str;
+ return $this->sectionBegin() . $str;
}
/**
$this->inDocStylesArray[] = $this->inDocStyles_TBEstyle;
// Implode it all:
- $inDocStyles = implode('
- ',$this->inDocStylesArray);
-
- // The default color scheme should also in full be represented in the stylesheet.
- $style=trim('
- '.($this->styleSheetFile?'<link rel="stylesheet" type="text/css" href="'.$this->backPath.$this->styleSheetFile.'" />':'').'
- '.($this->styleSheetFile2?'<link rel="stylesheet" type="text/css" href="'.$this->backPath.$this->styleSheetFile2.'" />':'').'
- <style type="text/css" id="internalStyle">
- /*<![CDATA[*/
- '.trim($inDocStyles).'
- /*###POSTCSSMARKER###*/
- /*]]>*/
- </style>
- '.($this->styleSheetFile_post?'<link rel="stylesheet" type="text/css" href="'.$this->backPath.$this->styleSheetFile_post.'" />':'').'
- '.implode("\n", $this->additionalStyleSheets)
- )
- ;
- $this->inDocStyles='';
- $this->inDocStylesArray=array();
+ $inDocStyles = implode(LF, $this->inDocStylesArray);
+
+ if ($this->styleSheetFile) {
+ $this->pageRenderer->addCssFile($this->backPath . $this->styleSheetFile);
+ }
+ if ($this->styleSheetFile2) {
+ $this->pageRenderer->addCssFile($this->backPath . $this->styleSheetFile2);
+ }
+
+ $this->pageRenderer->addCssInlineBlock('inDocStyles', $inDocStyles . LF . '/*###POSTCSSMARKER###*/');
+ if ($this->styleSheetFile_post) {
+ $this->pageRenderer->addCssFile($this->backPath . $this->styleSheetFile_post);
+ }
- return '
- '.$style;
}
/**
* @return void
*/
function addStyleSheet($key, $href, $title='', $relation='stylesheet') {
- if (!isset($this->additionalStyleSheets[$key])) {
- $this->additionalStyleSheets[$key] = '<link rel="' . $relation . '" type="text/css" href="' . $href . '"' . ($title ? (' title="' . $title . '"') : '') . ' />';
+ if (strpos($href, '://') !== FALSE || substr($href, 0, 1) === '/') {
+ $file = $href;
+ } else {
+ $file = $this->backPath . $href;
}
- }
+ $this->pageRenderer->addCssFile($file, $relation, 'screen', $title);
+ }
+
+ /**
+ * Add all *.css files of the directory $path to the stylesheets
+ *
+ * @param string directory to add
+ * @return void
+ */
+ function addStyleSheetDirectory($path) {
+ // calculation needed, when TYPO3 source is used via a symlink
+ // absolute path to the stylesheets
+ $filePath = dirname(t3lib_div::getIndpEnv('SCRIPT_FILENAME')) . '/' . $GLOBALS['BACK_PATH'] . $path;
+ // clean the path
+ $resolvedPath = t3lib_div::resolveBackPath($filePath);
+ // read all files in directory and sort them alphabetically
+ $files = t3lib_div::getFilesInDir($resolvedPath, 'css', FALSE, 1);
+ foreach ($files as $file) {
+ $this->pageRenderer->addCssFile($GLOBALS['BACK_PATH'] . $path . $file, 'stylesheet', 'all');
+ }
+ }
/**
* Insert post rendering document style into already rendered content
function insertStylesAndJS($content) {
// insert accumulated CSS
$this->inDocStylesArray[] = $this->inDocStyles;
- $styles = "\n".implode("\n", $this->inDocStylesArray);
+ $styles = LF.implode(LF, $this->inDocStylesArray);
$content = str_replace('/*###POSTCSSMARKER###*/',$styles,$content);
// insert accumulated JS
- $jscode = $this->JScode."\n".$this->wrapScriptTags(implode("\n", $this->JScodeArray));
+ $jscode = $this->JScode.LF.$this->wrapScriptTags(implode(LF, $this->JScodeArray));
$content = str_replace('<!--###POSTJSMARKER###-->',$jscode,$content);
return $content;
}
/**
+ * Returns an array of all stylesheet directories belonging to core and skins
+ *
+ * @return array Stylesheet directories
+ */
+ public function getSkinStylesheetDirectories() {
+ $stylesheetDirectories = array();
+
+ // add default core stylesheets
+ foreach ($this->stylesheetsCore as $stylesheetDir) {
+ $stylesheetDirectories[] = $stylesheetDir;
+ }
+
+ // Stylesheets from skins
+ // merge default css directories ($this->stylesheetsSkin) with additional ones and include them
+ if (is_array($GLOBALS['TBE_STYLES']['skins'])) {
+ // loop over all registered skins
+ foreach ($GLOBALS['TBE_STYLES']['skins'] as $skinExtKey => $skin) {
+ $skinStylesheetDirs = $this->stylesheetsSkins;
+
+ // skins can add custom stylesheetDirectories using
+ // $TBE_STYLES['skins'][$_EXTKEY]['stylesheetDirectories']
+ if (is_array($skin['stylesheetDirectories'])) {
+ $skinStylesheetDirs = array_merge($skinStylesheetDirs, $skin['stylesheetDirectories']);
+ }
+
+ // add all registered directories
+ foreach ($skinStylesheetDirs as $stylesheetDir) {
+ // for EXT:myskin/stylesheets/ syntax
+ if (substr($stylesheetDir, 0, 4) === 'EXT:') {
+ list($extKey, $path) = explode('/', substr($stylesheetDir, 4), 2);
+ if (strcmp($extKey, '') && t3lib_extMgm::isLoaded($extKey) && strcmp($path, '')) {
+ $stylesheetDirectories[] = t3lib_extMgm::extRelPath($extKey) . $path;
+ }
+ } else {
+ // for relative paths
+ $stylesheetDirectories[] = t3lib_extMgm::extRelPath($skinExtKey) . $stylesheetDir;
+ }
+ }
+ }
+ }
+ return $stylesheetDirectories;
+ }
+
+ /**
* Initialize the charset.
* Sets the internal $this->charset variable to the charset defined in $GLOBALS["LANG"] (or the default as set in this class)
* Returns the meta-tag for the document header
* @return string <meta> tag with name "generator"
*/
function generator() {
- $str = 'TYPO3 '.TYPO3_branch.', http://typo3.com, © Kasper Skårhøj 1998-2008, extensions are copyright of their respective owners.';
+ $str = 'TYPO3 '.TYPO3_branch.', http://typo3.com, © Kasper Skårhøj 1998-2009, extensions are copyright of their respective owners.';
return '<meta name="generator" content="'.$str .'" />';
}
+ /**
+ * Returns X-UA-Compatible meta tag
+ *
+ * @param string $content Content of the compatible tag (default: IE-8)
+ * @return string <meta http-equiv="X-UA-Compatible" content="???" />
+ */
+ public function xUaCompatible($content = 'IE=8') {
+ return '<meta http-equiv="X-UA-Compatible" content="' . $content . '" />';
+ }
function icons($type, $styleAttribValue='') {
switch($type) {
case '3':
- $icon = 'gfx/icon_fatalerror.gif';
+ $icon = 'status-dialog-error';
break;
case '2':
- $icon = 'gfx/icon_warning.gif';
+ $icon = 'status-dialog-warning';
break;
case '1':
- $icon = 'gfx/icon_note.gif';
+ $icon = 'status-dialog-notification';
break;
case '-1':
- $icon = 'gfx/icon_ok.gif';
+ $icon = 'status-dialog-ok';
break;
default:
break;
}
if ($icon) {
- return '<img'.t3lib_iconWorks::skinImg($this->backPath,$icon,'width="18" height="16"').' class="absmiddle"'.($styleAttribValue ? ' style="'.htmlspecialchars($styleAttribValue).'"' : '').' alt="" />';
+ return t3lib_iconWorks::getSpriteIcon($icon);
}
}
function wrapScriptTags($string, $linebreak=TRUE) {
if(trim($string)) {
// <script wrapped in nl?
- $cr = $linebreak? "\n" : '';
+ $cr = $linebreak? LF : '';
// remove nl from the beginning
$string = preg_replace ('/^\n+/', '', $string);
// re-ident to one tab using the first line as reference
$match = array();
if(preg_match('/^(\t+)/',$string,$match)) {
- $string = str_replace($match[1],"\t", $string);
+ $string = str_replace($match[1],TAB, $string);
}
$string = $cr.'<script type="text/javascript">
/*<![CDATA[*/
* @return void
*/
function loadJavascriptLib($lib) {
- if (!isset($this->JScodeLibArray[$lib])) {
- $this->JScodeLibArray[$lib] = '<script type="text/javascript" src="' . $this->backPath . $lib . '"></script>';
- }
+ $this->pageRenderer->addJsFile($this->backPath . $lib);
}
- /**
- *
- * @param string $lib it will remove lib from general JScodeLibArray because lib is loaded already.
- */
- protected function removeJavascriptLib($lib) {
- if (count($this->JScodeLibArray)) {
- $scripts = array_keys($this->JScodeLibArray);
- foreach ($scripts as $script) {
- if (strpos($script, '/' . $lib . '/') !== false) {
- unset ($this->JScodeLibArray[$script]);
- }
- }
- }
- }
/**
* Includes the necessary Javascript function for the clickmenu (context sensitive menus) in the document
* Please just call this function without expecting a return value for future calls
*/
function getContextMenuCode() {
- $this->loadPrototype();
+ $this->pageRenderer->loadPrototype();
$this->loadJavascriptLib('js/clickmenu.js');
$this->JScodeArray['clickmenu'] = '
* @return array If values are present: [0] = A <script> section for the HTML page header, [1] = onmousemove/onload handler for HTML tag or alike, [2] = One empty <div> layer for the follow-mouse drag element
*/
function getDragDropCode($table) {
- $this->loadPrototype();
+ $this->pageRenderer->loadPrototype();
$this->loadJavascriptLib('js/common.js');
$this->loadJavascriptLib('js/tree.js');
foreach($menuItems as $value => $label) {
$menuDef[$value]['isActive'] = !strcmp($currentValue,$value);
$menuDef[$value]['label'] = t3lib_div::deHSCentities(htmlspecialchars($label));
- $menuDef[$value]['url'] = htmlspecialchars($script.'?'.$mainParams.$addparams.'&'.$elementName.'='.$value);
+ $menuDef[$value]['url'] = $script . '?' . $mainParams . $addparams . '&' . $elementName . '=' . $value;
}
$content = $this->getTabMenuRaw($menuDef);
}
$mouseOverOut = ' onmouseover="DTM_mouseOver(this);" onmouseout="DTM_mouseOut(this);"';
- $requiredIcon = '<img name="' . $id . '-' . $index . '-REQ" src="' . $GLOBALS['BACK_PATH'] . 'gfx/clear.gif" width="10" height="10" hspace="4" alt="" />';
+ $requiredIcon = '<img name="' . $id . '-' . $index . '-REQ" src="' . $GLOBALS['BACK_PATH'] . 'gfx/clear.gif" class="t3-TCEforms-reqTabImg" alt="" />';
if (!$foldout) {
// Create TAB cell:
}
}
-
/**
* Function to load a HTML template file with markers.
+ * When calling from own extension, use syntax getHtmlTemplate('EXT:extkey/template.html')
*
* @param string tmpl name, usually in the typo3/template/ directory
* @return string HTML of template
if ($GLOBALS['TBE_STYLES']['htmlTemplates'][$filename]) {
$filename = $GLOBALS['TBE_STYLES']['htmlTemplates'][$filename];
}
- return ($filename ? t3lib_div::getURL(t3lib_div::resolveBackPath($this->backPath . $filename)) : '');
+ if (substr($filename,0,4) != 'EXT:') {
+ $filename = t3lib_div::resolveBackPath($this->backPath . $filename);
+ } else {
+ $filename = t3lib_div::getFileAbsFileName($filename, true, true);
+ }
+ return t3lib_div::getURL($filename);
}
/**
*/
function setModuleTemplate($filename) {
// Load Prototype lib for IE event
- $this->loadPrototype();
+ $this->pageRenderer->loadPrototype();
$this->loadJavascriptLib('js/iecompatibility.js');
$this->moduleTemplate = $this->getHtmlTemplate($filename);
}
foreach ($subpartArray as $marker => $content) {
$moduleBody = t3lib_parsehtml::substituteSubpart($moduleBody, $marker, $content);
}
+
+ if ($this->showFlashMessages) {
+ // adding flash messages
+ $flashMessages = t3lib_FlashMessageQueue::renderFlashMessages();
+ if (!empty($flashMessages)) {
+ $flashMessages = '<div id="typo3-messages">' . $flashMessages . '</div>';
+ }
+
+ if (strstr($moduleBody, '###FLASHMESSAGES###')) {
+ // either replace a dedicated marker for the messages if present
+ $moduleBody = str_replace(
+ '###FLASHMESSAGES###',
+ $flashMessages,
+ $moduleBody
+ );
+ } else {
+ // or force them to appear before the content
+ $moduleBody = str_replace(
+ '###CONTENT###',
+ $flashMessages . '###CONTENT###',
+ $moduleBody
+ );
+ }
+ }
+
// replacing all markers with the finished markers and return the HTML content
return t3lib_parsehtml::substituteMarkerArray($moduleBody, $markerArray, '###|###');
}
}
// replace the marker with the template and remove all line breaks (for IE compat)
- $markers['BUTTONLIST_' . strtoupper($key)] = str_replace("\n", '', $buttonTemplate);
+ $markers['BUTTONLIST_' . strtoupper($key)] = str_replace(LF, '', $buttonTemplate);
+ }
+
+ // Hook for manipulating docHeaderButtons
+ if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['docHeaderButtonsHook'])) {
+ $params = array(
+ 'buttons' => $buttons,
+ 'markers' => &$markers,
+ 'pObj' => &$this
+ );
+ foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['docHeaderButtonsHook'] as $funcRef) {
+ t3lib_div::callUserFunction($funcRef, $params, $this);
+ }
}
+
return $markers;
}
* @return string Page path
*/
protected function getPagePath($pageRecord) {
- global $LANG;
// Is this a real page
if ($pageRecord['uid']) {
- $title = $pageRecord['_thePath'];
+ $title = $pageRecord['_thePathFull'];
} else {
$title = $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
}
// Setting the path of the page
- $pagePath = $LANG->sL('LLL:EXT:lang/locallang_core.php:labels.path', 1) . ': <span class="typo3-docheader-pagePath">' . htmlspecialchars(t3lib_div::fixed_lgd_cs($title, -50)) . '</span>';
+ $pagePath = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.path', 1) . ': <span class="typo3-docheader-pagePath">';
+
+ // crop the title to title limit (or 50, if not defined)
+ $cropLength = (empty($GLOBALS['BE_USER']->uc['titleLen'])) ? 50 : $GLOBALS['BE_USER']->uc['titleLen'];
+ $croppedTitle = t3lib_div::fixed_lgd_cs($title, -$cropLength);
+ if ($croppedTitle !== $title) {
+ $pagePath .= '<abbr title="' . htmlspecialchars($title) . '">' . htmlspecialchars($croppedTitle) . '</abbr>';
+ } else {
+ $pagePath .= htmlspecialchars($title);
+ }
+ $pagePath .= '</span>';
return $pagePath;
}
// Add icon with clickmenu, etc:
if ($pageRecord['uid']) { // If there IS a real page
$alttext = t3lib_BEfunc::getRecordIconAltText($pageRecord, 'pages');
- $iconImg = t3lib_iconWorks::getIconImage('pages', $pageRecord, $this->backPath, 'class="absmiddle" title="'. htmlspecialchars($alttext) . '"');
+ $iconImg = t3lib_iconWorks::getSpriteIconForRecord('pages', $pageRecord, array('title'=>$alttext));
// Make Icon:
$theIcon = $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($iconImg, 'pages', $pageRecord['uid']);
+ $pid = $pageRecord['uid'];
} else { // On root-level of page tree
// Make Icon
- $iconImg = '<img' . t3lib_iconWorks::skinImg($this->backPath, 'gfx/i/_icon_website.gif') . ' alt="' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] . '" />';
+ $iconImg = t3lib_iconWorks::getSpriteIcon('apps-pagetree-root', array('title' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']));
if($BE_USER->user['admin']) {
$theIcon = $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($iconImg, 'pages', 0);
} else {
$theIcon = $iconImg;
}
+ $pid = '0 (root)';
}
// Setting icon with clickmenu + uid
- $pageInfo = $theIcon . '<em>[pid: ' . $pageRecord['uid'] . ']</em>';
+ $pageInfo = $theIcon . '<em>[pid: ' . $pid . ']</em>';
return $pageInfo;
}
- /**
- * Following functions are help function for JS library include.
- * They enable loading the libraries prototype, scriptaculous and extJS from contrib-directory
- */
-
-
- /**
- * Function for render the JS-libraries in header
- * Load order is prototype / scriptaculous / extJS
- */
- protected function renderJSlibraries() {
- $libs = array();
-
- // include prototype
- if ($this->addPrototype) {
- $libs[] = 'contrib/prototype/prototype.js';
- // remove prototype from JScodeLibArray
- $this->removeJavascriptLib('prototype');
- }
-
- // include scriptaculous
- if ($this->addScriptaculous) {
- $mods = array();
- foreach ($this->addScriptaculousModules as $key => $value) {
- if ($this->addScriptaculousModules[$key]) {
- $mods[] = $key;
- }
- }
- // resolve dependencies
- if (in_array('dragdrop', $mods) || in_array('controls', $mods)) {
- $mods = array_merge(array('effects'), $mods);
- }
-
- if (count($mods)) {
- $moduleLoadString = '?load=' . implode(',', $mods);
- }
- $libs[] = 'contrib/scriptaculous/scriptaculous.js' . $moduleLoadString;
- // remove scriptaculous from JScodeLibArray
- $this->removeJavascriptLib('scriptaculous');
- }
- // include extJS
- if ($this->addExtJS) {
- // if prototype is loaded, then use the prototype adapter, otherwise the default one
- if ($this->addPrototype) {
- $libs[] = 'contrib/extjs/adapter/prototype/ext-prototype-adapter.js';
- } else {
- $libs[] = 'contrib/extjs/adapter/ext/ext-base.js';
- }
- $libs[] = 'contrib/extjs/ext-all' . ($this->addExtJSdebug ? '-debug' : '') . '.js';
- // add extJS localization
- $extJsLocaleFile = 'contrib/extjs/locale/ext-lang-' . $GLOBALS['BE_USER']->uc['lang'] . '.js';
- if (file_exists(PATH_typo3 . $extJsLocaleFile)) {
- $libs[] = $extJsLocaleFile;
- }
- // set clear.gif
- $this->extJScode .= 'Ext.BLANK_IMAGE_URL = "' . htmlspecialchars(t3lib_div::locationHeaderUrl('gfx/clear.gif')) . '";';
- // remove extjs from JScodeLibArray
- $this->removeJavascriptLib('extjs');
- }
- foreach ($libs as &$lib) {
- $lib = '<script type="text/javascript" src="' . $this->backPath . $lib . '"></script>';
}
- // add other JavascriptLibs and return it
- $libs = array_merge($libs, $this->JScodeLibArray);
- return count($libs) ? chr(10) . chr(10) . implode(chr(10), $libs) . chr(10) . chr(10) : '';
- }
-
- /**
- * call function if you need the prototype library
- */
- public function loadPrototype() {
- $this->addPrototype = true;
- }
-
- /**
- * call function if you need the Scriptaculous library
- * @param string $modules add modules you need. use "all" if you need complete modules
- */
- public function loadScriptaculous($modules) {
- // Scriptaculous require prototype, so load prototype too.
- $this->addPrototype = true;
- $this->addScriptaculous = true;
- if ($modules) {
- if ($modules == 'all') {
- foreach ($this->addScriptaculousModules as $key => $value) {
- $this->addScriptaculousModules[$key] = true;
- }
- } else {
- $mods = t3lib_div::trimExplode(',', $modules);
- foreach ($mods as $mod) {
- if (isset($this->addScriptaculousModules[strtolower($mod)])) {
- $this->addScriptaculousModules[strtolower($mod)] = true;
- }
- }
- }
- }
- }
-
- /**
- * call this function if you need the extJS library
- * @param string $css
- */
- public function loadExtJS($css = true, $theme = true) {
- if (!$this->addExtJS) {
- $this->addExtJS = true;
- if ($css) {
- if (isset($GLOBALS['TBE_STYLES']['extJS']['all'])) {
- $this->addStyleSheet('ext-all', $GLOBALS['TBE_STYLES']['extJS']['all']);
- } else {
- $this->addStyleSheet('ext-all', $this->backPath . 'contrib/extjs/resources/css/ext-all.css');
- }
- }
- if ($theme) {
- if (isset($GLOBALS['TBE_STYLES']['extJS']['theme'])) {
- $this->addStyleSheet('ext-theme', $GLOBALS['TBE_STYLES']['extJS']['theme']);
- } else {
- $this->addStyleSheet('ext-theme', $this->backPath . 'contrib/extjs/resources/css/xtheme-gray.css');
- }
- }
- }
- }
-
- /**
- * call this function to load debug version of extJS. Use this for development only
- */
- public function setExtJSdebug() {
- $this->addExtJSdebug = true;
- }
-
-
-}
-
// ******************************
// Extension classes of the template class.
}
+/**
+ * Extension class for "template" - used in the context of frontend editing.
+ */
+class frontendDoc extends template {
+
+ /**
+ * Gets instance of PageRenderer
+ *
+ * @return t3lib_PageRenderer
+ */
+ public function getPageRenderer() {
+ if (!isset($this->pageRenderer)) {
+ $this->pageRenderer = $GLOBALS['TSFE']->getPageRenderer();
+ }
+ return $this->pageRenderer;
+ }
+
+ /**
+ * Used in the frontend context to insert header data via TSFE->additionalHeaderData.
+ * Mimics header inclusion from template->startPage().
+ *
+ * @return void
+ */
+ public function insertHeaderData() {
+
+ $this->backPath = $GLOBALS['TSFE']->backPath = TYPO3_mainDir;
+ $this->pageRenderer->setBackPath($this->backPath);
+ $this->docStyle();
+
+ // add applied JS/CSS to $GLOBALS['TSFE']
+ if ($this->JScode) {
+ $this->pageRenderer->addHeaderData($this->JScode);
+ }
+ if (count($this->JScodeArray)) {
+ foreach ($this->JScodeArray as $name => $code) {
+ $this->pageRenderer->addJsInlineCode($name, $code);
+ }
+ }
+ }
+}
+
+
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/template.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/template.php']);
}