您的位置:首页 > 编程语言 > PHP开发

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

2015-09-15 13:46 666 查看
发现网上的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
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息