你现在的位置:首页 > PHP网站建设知识库 > Joomla > 正文

如何在joomla指定页面以外的所有页面中显示某模块

这其实是一个很常见的Joomla开发需求,并且会在Joomla 1.6中作为原生功能添加进来。具体情况是,比如你希望在站点首页以外的所有页面中都显示某模块,并且每次有新的菜单对应的页面生成时,不需要再手动将该模块分配绑定给新的页面。

Joomla 1.5中并没有这个功能,但我们可以对PHP文件做一些改动,来实现我们的需求。

实例
设想我们要实现如上所述的需求(为首页以外的所有页面添加模块)。现在我们通过安装有Joomla范例内容的站点以及默认的huk_milkyway模板来进行操作演示。

1.按下面所示的方法创建一个新的模块位置(position),命名为“exclude_left”。我们也可以使用模板中现有的模块位置,但是最好新建一个单独使用。
找到并打开这个文件:Joomla根路径/templates/rhuk_milkyway/templateDetails.xml,在63行,“面包屑(breadcrumb)”代码的后面增加下面这行代码,用来添加新的模块位置:

<position>exclude_left</position>
打开模板文件的索引页面:Joomla根路径/templates/rhuk_milkyway/index.php,在88行附近,将下面这段代码添加到<div id="leftcolum">的后面:
<?php $Itemid = JRequest::getVar('Itemid'); // get the current itemid
    // don't show this position if $Itemid is 1
    if($this->countModules('exclude_left') && $Itemid != 1) : ?> 
    <jdoc:include type="modules" name="exclude_left" style="rounded" />
<?php endif; ?>

这段代码向模板文件中添加了我们需要的新模块位置,并且规定如果当前页面的菜单项ID不为“1”,则显示该模块。(注意,这里的“1”就是对应着首页的菜单项ID;可以在菜单项管理中找到菜单项对应的ID)

2.现在来处理我们的模块。我新建了一个Custom HTML模块,当然我们可以使用任何已有的模块。在模块设置中,将“位置”设置为我们之前新建的“exclude_left”,并且将该模块分配绑定给所 有的菜单项。因为有了我们之前添加的代码,所以现在即使选择将模块分配给所有的菜单项,在首页中依然不会显示出来。

搞定;现在可以尝试为站点添加新的菜单项及相应页面,如果一切正常,我们的模块会自动出现在新菜单项对应的页面中。

更进一步
如何排除一组菜单项:例如,我们希望模块在首页(ID为1)以及ID为4和22的菜单项页面中均保持隐藏,那么可以将之前的代码修改为:
<?php $Itemid = JRequest::getVar('Itemid'); // get the current itemid
    // don't show this position if $Itemid is 1, 4, or 22
    if( $this->countModules('exclude_left') && ! in_array($Itemid, array(1, 4, 22)) ) : ?> 
    <jdoc:include type="modules" name="exclude_left" style="rounded" />
<?php endif; ?>

使用其他的判断条件:我们之前是根据当前页面所属菜单项的ID来判断是否显示某模块,其实也可以根据其他条件来判断,下面是一些示例代码(对应着之前代码中的$Itemid=...)
 $option      = JRequest::getVar('option'); // for example, "com_content"
 $view        = JRequest::getVar('view');   // for example, "article"
 $task        = JRequest::getVar('task');   // for example, "edit"
 $layout      = JRequest::getVar('layout'); // for example, "blog"
 $article_id  = JRequest::getVar('id');     // id of the current article being shown

出于相同的逻辑,你还可以使用“用户”或“用户组”等作为判定条件,来决定在哪些页面中显示指定的模块。