0:
jdoc声明是Joomla模板的一个方法(method),用来在页面中输出指定的内容。典型的jdoc声明看上去是这样的: <jdoc:include type="component" />。不同类型(type)的jdoc声明负责不同的内容输出。
Component
<jdoc:include type="component" />这个声明要放在模板的<body></body>中,并且只能出现一次;它负责输出当前页面的主要内容(main content)。
Head
<jdoc:include type="head" />这个声明要放在模板的<head></head>中,并且只能出现一次;它负责输出当前页面的样式表链接、脚本链接、meta信息等内容。
Installation
<jdoc:include type="installation" />这个类型的jdoc声明只用于Joomla的安装器模板(Installer template)中,与Component类型相似,它只负责输出安装过程中页面上的主要内容。
Message
<jdoc:include type="message" /> message声明要放在模板的<body></body>中,并且只能出现一次,用于输出操作过程中的系统提示信息或出错信息。
Module
<jdoc:include type="module" name="breadcrumbs" />
<jdoc:include type="module" name="menu" />
<jdoc:include type="module" name="submenu" style="rounded" id="submenu-box" />
module类型的jdoc声明会根据其name属性输出对应的模块,但该模块内容是否会呈现在页面上则取决于用户是否发布激活了该模块;可以为其设定style属性来控制模块输出模式;可参见“Joomla文档中文翻译 - 原生模块结构(module chrome)类型及对应的HTML输出”。
Modules
modules类型的jdoc声明用来在当前位置调用某个模板位置(template position)的所有模块;所有的模板位置都需要预先在templatedetails.xml文件中定义。同样可以为其设定style属性来控制模块的输出模式。下面是是一些Joomla模板中常见的modules类型的jdoc声明:
<jdoc:include type="modules" name="debug" />
<jdoc:include type="modules" name="icon" />
<jdoc:include type="modules" name="left" style="rounded" />
<jdoc:include type="modules" name="left" style="xhtml" />
<jdoc:include type="modules" name="right" style="xhtml" />
<jdoc:include type="modules" name="status" />
<jdoc:include type="modules" name="syndicate" />
<jdoc:include type="modules" name="title" />
<jdoc:include type="modules" name="toolbar" />
<jdoc:include type="modules" name="top" />
<jdoc:include type="modules" name="top" style="xhtml" />
<jdoc:include type="modules" name="user1" style="xhtml" />
<jdoc:include type="modules" name="user2" style="xhtml" />
<jdoc:include type="modules" name="user3" />
<jdoc:include type="modules" name="user4" />
1 2 |
$menu = & JSite::getMenu(); if( $menu->getActive() == $menu->getDefault() ){ /* 这里显示首页代码 */ }else{ /* 这里是非首页代码 */ } |
解释一下:这里使用 getActive 函数获取当前页面并与默认页面对比;
2、根据位置是否存在内容设置一些宽度:countModules();
1 2 3 |
if ($this->countModules('west and east') == 0) { $coreWidth = "100%"; } if ($this->countModules('west or east') == 1) { $coreWidth = "75%"; } if ($this->countModules('west and east') == 1) { $coreWidth = "50%"; } |
解释一下:通常多栏页面在没有其中一栏或多栏内容的情况下需要将其他栏目做宽度调整,这里使用 countModules() 函数判断是否存在一个或多个位置。
示例中展示的是三栏情况下,假使三栏分别为三个 west core east 位置,其中 west 和 east 为左右两个位置内容为可选,而 core 位置为主体位置内容为必须,通过判断得出四种情况即:无 west 栏、无 east 栏、仅 core 栏及同时具有三栏。示例代码第一行为仅有 core 栏即 west 和 east 都不存在的情况时赋 coreWidth 为 100% 宽度;第二行为仅有 west 或 east 栏其中之一时赋 coreWidth 为 75% 宽度;第三行为同时存在三栏时附 coreWidth 为 50% 宽度。取得了 coreWidth 值之后就可以在 html 代码中引用了,例如:
1 2 3 |
<div style="width:<?php echo $coreWidth; ?>;"> <jdoc:include type="modules" name="core" /> </div> |
当然,这里省略了 CSS 样式,你需要在 CSS 里面定义 west 和 east 的宽度等参数。
3、根据位置是否有内容控制输出:countModules();
1 2 3 4 5 6 7 |
<?php if ( $this->countModules('west or core or east') == 1 ) : ?> <div class="body"> <div id="west"><jdoc:include type="modules" name="west" style="xhtml" /></div> <div id="core"><jdoc:include type="modules" name="core" style="xhtml" /></div> <div id="east"><jdoc:include type="modules" name="east" style="xhtml" /></div> </div> <?php endif; ?> |
解释一下:这种使用其实是对上面第 2 点的一个补充,通常在输出位置的时候我们喜欢使用一个 div 包裹输出的位置内容用来做一些效果,但如果该位置没有输出,或是一个大通栏里面包括的三个位置都没有输出,那么这个通栏就没有必要输出了,使用 countModules 同时判断 west core east 位置是否有任意一个位置有内容输出,如果有任一位置有输出便输出 <div class=”body”> </div> 中间的内容。
4、方便的查看当前模板位置情况:index.php?tp=1
示例代码:网站 URL 路径 + index.php?tp=1 (如 http://127.0.0.1/index.php?tp=1 等)
解释一下:这个地址参数用来方便的查看当前页面的模板上的位置情况,及相应的输出模式,其中的 127.0.0.1 需要根据具体地址修改。
5、直接在模板调用模块:
1 2 3 4 5 6 |
require_once (JPATH_BASE .DS. 'modules' .DS. 'mod_latestnews' .DS. 'helper.php'); $params = new JParameter(”); $params -> set('catid',5); $params -> set('count',3); $list = modLatestNewsHelper::getList($params); require(JModuleHelper::getLayoutPath('mod_latestnews')); |
解释一下:这段代码就是在模板中直接调用 LatestNews 模块,并设置分类 ID 28 显示 3 篇文章。