发现网上的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