YII的自定义路由规则类的使用(初级)

发现网上的yii自定义路由规则类的使用介绍比较少

前两天做了网站SEO方面的URL优化工作。

具体要求是:商城门店的URL中需要有门店的地区id和分页p出现,

如:http://www.abc.com/store-provinceid(门店地区id)-p(分页数).html  

本人分享自己的使用心得

对于复杂的url美化,yii可以设置url 规则类的使用  

第一步:mian.php中urlManage配置中rules数组中添加规则时可以添加一个规则

array(
        'class' => 'application.components.StoreUrlRule',
    ), 
第二步:在conponents 文件下创一个自定义的规则类,例如StoreUrlRule.PHP

这个StoreUrlRule必须继承CBaseUrlRule这个类,自定义类必须实现基类中createUrl和parseUrl2个方法

createUrl这个方法在控制器中$this->createUrl('store/index',$this->parameter)可以调用到,在分页类中可以用Yii::app()->createUrl('store/index',$this->parameter)这个方法动态调用

 public function createUrl($manager,$route,$params,$ampersand)
     {
         if ($route=='store/index')
         {
             if (isset($params['province'], $params['p']))
                 return 'store-'.$params['province'] . '-' . $params['p'].'.html';
             else if (isset($params['province']))
                 return 'store-'.$params['province'];
         }
        // return false;  // this rule does not apply
     }
     
     public function parseUrl($manager, $request,$pathInfo,$rawPathInfo)
     {
         
         if (preg_match('/^(\w+)(-(\d+))(-(\d+))?$/', $pathInfo, $matches))
         {
             $province=$matches[3];
             if(!empty($matches[5])){
                 $p=$matches[5];
             } 
            // There is a match from db check above
                 if(isset($p)){
                     $_GET['p']=$p;
                     $_GET['province']=$province;
                     return 'web110/store/index';
                 }else{
                     $_GET['province']=$province;
                     return 'web110/store/index';
                 }
         }
     }
在这个规则类中还可以完成更变态的url,例如:

具体要求是:商城门店的URL中需要有门店的地区拼音和分页p出现,

如:http://www.abc.com/store-拼音(门店地区拼音)-p(分页数).html

在createUrl()中先修改$params(将id转换为地区pinyin,转换后如果有多余的参数,可以unset掉。);

在parseUrl()中解析完$params后,添加地区拼音转id的代码。

需要在规则类中添加一个方法获取所有地区id和对应的拼音

 protected function getRegionNames()
     {
          $store = new B2cStore();
          $result = $store->getAllRegions();
          return $result;
     }
在createurl方法中添加
$regions = CHtml::listData($this->getRegionNames(),'region_id','local_name');
YII内置方法listData将二维数组转换为region_id与拼音对应的一维数组

<span style="color:#333333;">if (isset($params['province'], $params['p']))
                 return 'store-'</span><span style="color:#ff6666;">.$regions[$params['province']]</span><span style="color:#333333;"> . '-' . $params['p'].'.html';
             else if (isset($params['province']))
                 return 'store-'.</span><span style="color:#ff6666;">$regions[$params['province']</span><span style="color:#333333;">];</span>
即可 解析同创建 ,本人初学yii,更深度的挖掘http://my.oschina.net/liuxiaobo/blog/202568
 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值