Joomla!-开源天空

2008-12-05


自定义URL(下)

E-mail

上一个简单例子中并没能体现出内容分类的层级关系

下面我们来看一个更复杂一些的例子,这个例子中我们尽可能的展示内容分类的层级关系,并去掉关于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的可读性很强

相关文章:
自定义URL(中)


收藏此文章:
Digg! Reddit! Del.icio.us! JoomlaVote! Google! Live! Facebook! StumbleUpon! Yahoo! Free social bookmarking plugins and extensions for Joomla! websites!

发表您的文章评论

您的姓名 (昵称)
标题:
评分: 很差一般较好很好
评论:
验证码:
请输入验证码