首页 > 代码库 > 说点关于Yii的 Yii::app()->createUrl 与 CHtml::normalizeUrl 使用的问题

说点关于Yii的 Yii::app()->createUrl 与 CHtml::normalizeUrl 使用的问题

现在说下问题,请看下面的这段代码:

$words = array();
			foreach ($items as $item) {
				$tmp['link'] = CHtml::link($item['searchword'], 
								CHtml::normalizeUrl(array('list/search', 'name' => urlencode($item['searchword']))));
				$words[] = $tmp;
				unset($tmp);
			}

这是我又在查找项目哪有问题时,发现的一个问题,就是一个热门搜索,会列出来5个经常被搜索的问题当然,这个功能是放在头部的,页面都有加载这个头文件,

当我在首页点击这些被热门搜索的商品时,是可以正常跳转到相应的页面的,但是如果我点击一个商品,如:苹果,那我们就跳转到了苹果这个商品的详细商品了,

苹果商品的URL:http://clzv2.lygclz.com/index.php/product/default/view/pid/1

这时,我们在点击被热门搜索的商品时,就会出错.URL不存在,

某热门商品的URL地址:http://www.clz.com/index.php/product/list/search/name/%25E5%25BC%2580%25E5%25BF%2583%25E6%259E%259C

出错的原因是在/product/list多出一个product路径.去掉就正常了,问题就出在上面的那段代码 array(‘list/search‘),应该为array(‘/list/search‘).

如果list前没有加 / ,Yii会以为是指的在product模块下的list,所以大家要注意细节.


Yii::app()->createUrl 

public function createUrl($route,$params=array(),$ampersand='&')
	{
		return $this->getUrlManager()->createUrl($route,$params,$ampersand);
	}

CHtml::normalizeUrl

normalizeUrl() 方法 
public static string normalizeUrl(mixed $url) 
$url mixed 生成一个有效的URL的参数 
{return} string 有效的URL 

源码: framework/web/helpers/CHtml.php#1088 (显示) public static function normalizeUrl($url)
{
    if(is_array($url))
    {
        if(isset($url[0]))
        {
            if(($c=Yii::app()->getController())!==null)
                $url=$c->createUrl($url[0],array_splice($url,1));
            else
                $url=Yii::app()->createUrl($url[0],array_splice($url,1));
        }
        else
            $url='';
    }
    return $url==='' ? Yii::app()->getRequest()->getUrl() : $url;
} 
通过标准的输入来生成一个有效的URL。 

如果输入参数是一个空字符串,将返回当前请求的URL。 

如果输入参数不是一个空字符串,它被当作一个有效的URL,不作任何改变被返回。 

如果输入参数是一个数组,它被视为一个控制器路由和一个GET参数列表,将会调用CController::createUrl方法来创建一个URL。既然这样,数组的第一个元素是指控制器的路由,其它的键名-键值对指额外的URL参数。例如,array('post/list', 'page'=>3) 可以生成一个URL /index.php?r=post/list&page=3.