我知道这个问题有点老了,但我想知道同样的事情,这是我想出的解决方案,如果您使用一些额外的代码更改模板index.php文件,则可以基于子域创建多个模块位置,然后将正确的菜单项分配给相关的子域。
$dom = explode ( '.', str_replace ( '//', '.', JURI::base () ) ) ;
$sub = ( in_array ( 'plus', $dom ) ? 'plus' : ( in_array ('group', $dom) ? 'group' : 'home' ) ) ;
if ($this->countModules('navigation'.$sub )) : ?>
<nav class="navigation">
<jdoc:include type="modules" name="navigation<?php echo $sub ?>" style="html5" />
</nav>
<?php endif; ?>
在上面的示例中,以$ sub开头的行是您需要针对自己的网站进行自定义的行,目前,该示例根据子域为导航模块创建了一个空间-这是为具有两个子域和一个站点的网站创建的通用域,因此它为每个子域创建三个导航位置-navigationhome navigationplus和navigationgroup。
该代码要注意的几件事-
找到子域,我已经使用了in_array函数。我本可以在$ dom [1]上使用switch语句来找到子域,但是如果有人像在$ dom [1]中那样输入www.plus.mysite.co.uk之类的东西,这将无法工作...例如
switch ( $dom[1] )
{
case 'group' : $sub = 'group' ; break ;
case 'plus' : $sub = 'plus' ; break ;
default : $sub = 'home' ; break ;
}
初始爆炸使用str_replace将//替换为。这是为了使初始的http / https最终位于其自己的数组中($ dom [0]将始终包含http / https,如果您想根据加载的协议显示不同的站点,我想可以进一步使用它,如果那样的话那时没有人放在类似http://plus.mysite.co.uk的东西中,那么第一个数组将包含http:// plus,in_array将不返回任何匹配项。
请记住,如果子域与站点域相同,则需要确保它是?中的最后一个?:语句链,否则它将自己分配给其他子域-例如,如果您有两个子域,一个叫site.site.co.uk,另一个叫site1.site.co.uk,则下面的语句将起作用
$sub = ( in_array ( 'site1' ) ? 'site1' : ( in_array ( 'site' ) ? 'site' : 'site' ) ) ;
//it never reaches the in_array ( 'site' ) if sub domain is site1
但在这种情况下,这两种方法都无法正常工作...
$sub = ( in_array ( 'site' ) ? 'site' : ( in_array ( 'site1' ) ? 'site1' : 'main' ) ) ;
// all domains would be referred to as site because XXX.site.co.uk provides a match
$sub = ( in_array ( 'site1' ) ? 'site1' : ( in_array ( 'site' ) ? 'site' : 'main' ) ) ;
// www.site.co.uk would still be site and not main
您不太可能以这种方式使用它们,但是值得注意。