上一个简单例子中并没能体现出内容分类的层级关系
下面我们来看一个更复杂一些的例子,这个例子中我们尽可能的展示内容分类的层级关系,并去掉关于url中的view部分。
来看看以下这些我们将要构造的URL
When viewing an article: http://www.example.com/[menualias]/[category]/[article]
When viewing a category: http://www.example.com/[menualias]/[category]
When viewing the categories overview: http://www.example.com/[menualias]
我们直接来将是router.php,假设文章link的Joomla内部地址如下:
JRoute::_( 'index.php?view=article&catid='.$row?->catslug .'&id='.$row?->slug );
假设文章的分类的URL地址如下:
JRoute::_( 'index.php?view=category&id='.$row?->catslug );The corresponding router.php:
function [Componentname]BuildRoute(&$query)
{
$segments = array();
if(isset( $query['catid'] ))
{
$segments[] = $query['catid'];
unset( $query['catid'] );
};
if( isset($query['id']) )
{
$segments[] = $query['id'];
unset( $query['id'] );
};
unset( $query['view'] );
return $segments;
}
与前例不同的是,并没有将view添加到$segments数组中,并且将$view清空。另一件事情是将catid添加到$segments中。
function [Componentname]ParseRoute($segments)
{
$vars = array();
$menu =& JMenu::getInstance();
$item =& $menu?->getActive();
// Count segments
$count = count( $segments );
//Handle View and Identifier
switch( $item?->query['view'] )
{
case 'categories':
if($count == 1) {
$vars['view'] = 'category';
}
if($count == 2) {
$vars['view'] = 'article';
}
$id = explode( ':', $segments[$count?-1] );
$vars['id'] = (int) $id[0];
break;
case 'category':
$id = explode( ':', $segments[$count?-1] );
$vars['id'] = (int) $id[0];
$vars['view'] = 'article';
break;
}
return $vars;
}
ParseRoute和前例有很多不同,原因很简单,因为我们没有view的名字,那么就必须通过其他方式来确定,目前我们可以通过活动菜单的view来觉得当前请求是那个级别的内容。而通过$count = count( $segments )获得参数的个数,就可以决定是指向一个category的链接还是文章的链接。
由此,实现了可以自定义URL,并且URL的可读性很强