📄 theme.php
字号:
global $xoopsModule, $xoopsLogger;
if ( $_SERVER['REQUEST_METHOD'] != 'POST' && $this->contentCacheLifetime ) {
$template = $this->contentTemplate ? $this->contentTemplate : 'db:system_dummy.html';
$dirname = $xoopsModule->getVar( 'dirname', 'n' );
$this->template->caching = 2;
$this->template->cache_lifetime = $this->contentCacheLifetime;
$uri = str_replace( XOOPS_URL, '', $_SERVER['REQUEST_URI'] );
// Clean uri by removing session id
if (defined('SID') && SID && strpos($uri, SID)) {
$uri = preg_replace("/([\?&])(".SID."$|".SID."&)/", "\\1", $uri);
}
$this->contentCacheId = $this->generateCacheId($dirname . '|' . $uri);
if ( $this->template->is_cached( $template, $this->contentCacheId ) ) {
$xoopsLogger->addExtra( $template, sprintf('Cached (regenerates every %d seconds)', $this->contentCacheLifetime ) );
$this->render( null, null, $template );
return true;
}
}
return false;
}
/**
* Render the page
*
* The theme engine builds pages from 2 templates: canvas and content.
*
* A module can call this method directly and specify what templates the theme engine must use.
* If render() hasn't been called before, the theme defaults will be used for the canvas and
* page template (and xoopsOption['template_main'] for the content).
*
* @param string $canvasTpl The canvas template, if different from the theme default
* @param string $pageTpl The page template, if different from the theme default (unsupported, 2.3+ only)
* @param string $contentTpl The content template
* @param array $vars Template variables to send to the template engine
*/
function render( $canvasTpl = null, $pageTpl = null, $contentTpl = null, $vars = array() ) {
global $xoops, $xoopsLogger, $xoopsOption;
if ( $this->renderCount ) {
return false;
}
$xoopsLogger->startTime( 'Page rendering' );
// @internal: Lame fix to ensure the metas specified in the xoops config page don't appear twice
$old = array( 'robots', 'keywords', 'description', 'rating', 'author', 'copyright' );
foreach ( $this->metas['meta'] as $name => $value ) {
if ( in_array( $name, $old ) ) {
$this->template->assign( "xoops_meta_$name", htmlspecialchars( $value, ENT_QUOTES ) );
unset( $this->metas['meta'][$name] );
}
}
if ( $canvasTpl ) $this->canvasTemplate = $canvasTpl;
if ( $contentTpl ) $this->contentTemplate = $contentTpl;
if ( !empty( $vars ) ) {
$this->template->assign( $vars );
}
if ( $this->contentTemplate ) {
$this->content = $this->template->fetch( $this->contentTemplate, $this->contentCacheId );
}
if ( $this->bufferOutput ) {
$this->content .= ob_get_contents();
ob_end_clean();
}
$this->template->assign_by_ref( 'xoops_contents', $this->content );
$header = empty($xoopsOption['xoops_module_header']) ? $this->template->get_template_vars( 'xoops_module_header' ) : $xoopsOption['xoops_module_header'];
$this->template->assign( 'xoops_module_header', $header . "\n" . $this->renderMetas( null, true ) );
if ( !empty($xoopsOption['xoops_pagetitle']) ) {
$this->template->assign( 'xoops_pagetitle', $xoopsOption['xoops_pagetitle'] );
}
// Do not cache the main (theme.html) template output
$this->template->caching = 0;
$this->template->display( $this->path . '/' . $this->canvasTemplate );
$this->renderCount++;
$xoopsLogger->stopTime( 'Page rendering' );
}
/**#@+ @tasktype 20 Manipulating page meta-information*/
/**
* Adds script code to the document head
*
* This methods allows the insertion of an external script file (if $src is provided), or
* of a script snippet. The file URI is parsed to take benefit of the theme resource
* overloading system.
*
* The $attributes parameter allows you to specify the attributes that will be added to the
* inserted <script> tag. If unspecified, the <var>type</var> attribute value will default to
* 'text/javascript'.
*
* <code>
* // Add an external script using a physical path
* $theme->addScript( 'www/script.js', null, '' );
* $theme->addScript( 'modules/newbb/script.js', null, '' );
* // Specify attributes for the <script> tag
* $theme->addScript( 'mod_xoops_SiteManager#common.js', array( 'type' => 'application/x-javascript' ), '' );
* // Insert a code snippet
* $theme->addScript( null, array( 'type' => 'application/x-javascript' ), 'window.open("Hello world");' );
* </code>
*
* @param string $src path to an external script file
* @param array $attributes hash of attributes to add to the <script> tag
* @param string $content Code snippet to output within the <script> tag
*
* @return void
**/
function addScript( $src = '', $attributes = array(), $content = '' ) {
global $xoops;
if ( empty( $attributes ) ) $attributes = array();
if ( !empty( $src ) ) $attributes['src'] = $xoops->url( $this->resourcePath( $src ) );
if ( !empty( $content ) ) $attributes['_'] = $content;
if ( !isset( $attributes['type'] ) ) $attributes['type'] = 'text/javascript';
$this->addMeta( 'script', $src, $attributes );
}
/**
* Add StyleSheet or CSS code to the document head
* @param string $src path to .css file
* @param array $attributes name => value paired array of attributes such as title
* @param string $content CSS code to output between the <style> tags (in case $src is empty)
*
* @return void
**/
function addStylesheet( $src = '', $attributes = array(), $content = '' ) {
global $xoops;
if ( empty( $attributes ) ) $attributes = array();
if ( !empty( $src ) ) $attributes['href'] = $xoops->url( $this->resourcePath( $src ) );
if ( !isset($attributes['type']) ) $attributes['type'] = 'text/css';
if ( !empty( $content ) ) $attributes['_'] = $content;
$this->addMeta( 'stylesheet', $src, $attributes );
}
/**
* Add a <link> to the header
* @param string $rel Relationship from the current doc to the anchored one
* @param string $href URI of the anchored document
* @param array $attributes Additional attributes to add to the <link> element
*/
function addLink( $rel, $href = '', $attributes = array() ) {
global $xoops;
if ( empty( $attributes ) ) $attributes = array();
if ( !empty( $href ) ) $attributes['href'] = $href;
$this->addMeta( 'link', $rel, $attributes );
}
/**
* Set a meta http-equiv value
*/
function addHttpMeta( $name, $value = null ) {
if ( isset($value) ) {
return $this->addMeta( 'http', $name, $value );
}
unset( $this->metas['http'][$name] );
}
/**
* Change output page meta-information
*/
function addMeta( $type = 'meta', $name = '', $value = '' ) {
if ( !isset( $this->metas[$type] ) ) {
$this->metas[$type] = array();
}
if ( isset($name) ) {
$this->metas[$type][$name] = $value;
} else {
$this->metas[$type][] = $value;
}
return $value;
}
function headContent( $params, $content, &$smarty, &$repeat ) {
if ( !$repeat ) {
$this->htmlHeadStrings[] = $content;
}
}
function renderMetas( $type = null, $return = false ) {
$str = '';
if ( !isset($type) ) {
foreach ( array_keys($this->metas) as $type ) {
$str .= $this->renderMetas( $type, true );
}
$str .= implode( "\n", $this->htmlHeadStrings );
} else {
switch ( $type ) {
case 'script':
foreach ( $this->metas[$type] as $attrs ) {
$str .= '<script' . $this->renderAttributes( $attrs ) . ">\n";
if ( @$attrs['_'] ) {
$str .= "\n//<![CDATA[\n" . $attrs['_'] . "\n//]]>";
}
$str .= "</script>\n";
}
break;
case 'link':
foreach ( $this->metas[$type] as $rel => $attrs ) {
$str .= '<link rel="' . $rel . '"' . $this->renderAttributes( $attrs ) . " />\n";
}
break;
case 'stylesheet':
foreach ( $this->metas[$type] as $attrs ) {
if ( @$attrs['_'] ) {
$str .= '<style' . $this->renderAttributes($attrs) . ">\n/* <![CDATA[ */\n" . $attrs['_'] . "\n/* //]]> */\n</style>";
} else {
$str .= '<link rel="stylesheet"' . $this->renderAttributes($attrs) . " />\n";
}
}
break;
case 'http':
foreach ( $this->metas[$type] as $name => $content ) {
$str .= '<meta http-equiv="' . htmlspecialchars( $name, ENT_QUOTES ) . '" content="' . htmlspecialchars( $content, ENT_QUOTES) . "\" />\n";
}
break;
default:
foreach ( $this->metas[$type] as $name => $content ) {
$str .= '<meta name="' . htmlspecialchars( $name, ENT_QUOTES ) . '" content="' . htmlspecialchars( $content, ENT_QUOTES) . "\" />\n";
}
break;
}
}
if ( $return ) {
return $str;
}
echo $str;
return true;
}
/**
* Generates a unique element ID
* @param string $tagName
* @return string
*/
function genElementId( $tagName = 'xos' ) {
static $cache = array();
if ( !isset( $cache[ $tagName ] ) ) {
$cache[$tagName] = 1;
}
return $tagName . '-' . $cache[$tagName]++;
}
/**
* Transform an attributes collection to an XML string
* @param array $coll
* @return string
*/
function renderAttributes( $coll ) {
$str = '';
foreach ( $coll as $name => $val ) {
if ( $name != '_' ) {
$str .= ' ' . $name . '="' . htmlspecialchars( $val, ENT_QUOTES ) . '"';
}
}
return $str;
}
/**
* Return a themable file resource path
*
* @param string $path
* @return string
*/
function resourcePath( $path ) {
global $xoops;
if ( substr( $path, 0, 1 ) == '/' ) {
$path = substr( $path, 1 );
}
if ( file_exists( "$this->path/$path" ) ) {
return "themes/$this->folderName/$path";
}
return $path;
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -