存档

文章标签 ‘phpcms中文URL’

phpcms中文路径 之 sitemap中文路径处理

2010年3月17日 没有评论

phpcms的sitemaps怎样支持中文路径呢?

昨天我们谈了 phpcms怎样支持中文路径呢phpcms中文URL要怎样设置呢?

今天我们来处理下 phpcms的sitemaps如何支持中文路径。

首先,我们在 include 目录下,打开 global.func.php 文件

添加下面的一个函数。

 

function urlcode($url)
{
	if (empty($url)) return;
	$url = urlencode(trim($url));
	$url = str_replace('%2F','/',$url);
	$url = str_replace('%3A',':',$url);
	$url = str_replace('+',' ',$url);
	return $url;
}

 

然后再修改 include->admin 目录下的 sitemaps.class.php 文件。

这里面,我们找到 $item->loc = htmlentities($item->loc, ENT_QUOTES); 这一行。修改成下面的一行

$item->loc = $item->loc;

 

再去根目录下 ->admin 目录下,找到 googlemap.inc.php 文件。中的 下面的代码

if(!preg_match(‘/http:\/\//’,$r['url']))
        {
            $url = $domain.$r['url'];
        }
        else
        {
            $url = $r['url'];
        }

在该代码下面添加一句

$url = urlcode($url);

 

OK。 针对phpcms sitemaps 中文路径就可以实现了。

 

 

phpcms还针对百度新闻有baidunews.xml文件。同样也需要处理一下。

我们打开 include -> admin 目录下 baidunews.class.php 文件。

找到 $link = htmlspecialchars($link); 一行,修改为  $link = urlcode($link);

这样就可以了。

 

同时,我发现 baidunews.xml文件 中 keyword 和 description 都带有连接。

我们也可以稍作处理。

只需要将 $description = htmlspecialchars(strip_tags($data['description'])); 替换成

$description = htmlspecialchars(strip_tags($r['description']));

 

再将 $keywords = htmlspecialchars($data['keywords']); 替换成

$keywords = htmlspecialchars($r['keywords']);

 

这样就搞定了。

 

phpcms中文路径 phpcms中文URL

2010年3月16日 2 条评论

 

phpcms怎样支持中文路径呢?phpcms中文URL要怎样设置呢?

待我下面叙来。。。

首先,在 phpcms的include目录下,有global.func.php 文件。

找到 function createhtml($file) 这个函数。

说明下,这个函数是用来生成html静态文件的。

我们只需要修改下这个函数即可。

修改后如下:

 

 

function createhtml($file)
{
	//scofield 2010-3-16
	//for create file as chinses name
	$file = iconv('UTF-8', 'GBK', $file);

	$data = ob_get_contents();
	ob_clean();
	dir_create(dirname($file));
	$strlen = file_put_contents($file, $data);
	@chmod($file,0777);
	return $strlen;
}

 

 

 

$file = iconv(‘UTF-8′, ‘GBK’, $file); 主要增加了这一句。该句实现了 编码转换。这样生成的 html 文件或者路径 都可以带有中文。

 

其次,在include目录下还有 include/url.class.php 这个文件。

打开后找到 function show($contentid, $page = 0, $catid = 0, $time = 0, $prefix = ”) 这个函数。

添加 如下语句

 

 

//scofield 2010-3-16
//get root category name
$catetemp = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE  catid = $catid  LIMIT 1");
$arrparentidarr = explode(',',$catetemp['arrparentid']);
$rootidtemp = $arrparentidarr[count($arrparentidarr)-1];
$rootcatetemp = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE  catid = $rootidtemp LIMIT 1");
$rootcatename = $rootcatetemp['catname'];
//for url roles add content title and category name
$showtitle = strip_tags($r['title']);
$catdirname = $C['catname'];

 

 

 

完整的函数如下:

 

 

function show($contentid, $page = 0, $catid = 0, $time = 0, $prefix = '')
{
    global $PHPCMS;
    if($catid == 0 || $time == 0 || $prefix == '')
    {
        $r = $this->db->get_one("SELECT * FROM `".DB_PRE."content` WHERE `contentid`='$contentid'");
        if($r['isupgrade'] && !empty($r['url']))
        {
            if($page>1)
            {
                $base_name = basename($r['url']);
                $fileext = fileext($base_name);
                $url_a[0] = $url_a[1] = preg_replace('/.'.$fileext.'$/','_'.$page.'.'.$fileext,$r['url']);
                return $url_a;
            }
            else
            {
                $url_a[0] = $url_a[1] = $r['url'];
                return $url_a;
            }
        }
        $catid = $r['catid'];
        $time = $r['inputtime'];
        if(!$prefix) $prefix = $r['prefix'];
    }
    if(!isset($this->CATEGORY[$catid])) return false;
    $C = cache_read('category_'.$catid.'.php', '', 1);
    $tag = 0;
    if(preg_match('/:\\/\\//',$C['url']))
    {
        $tag = 1;
        $arr_url = preg_split('/\\//', $C['url']);
        $domain = 'http://'.$arr_url[2];
        $domain1 = 'http://'.$arr_url[2].'/';
        $info = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE `url` IN ('$domain', '$domain1') LIMIT 1");
        $crootdir = $info['parentdir'].$info['catdir'].'/';
    }

    $categorydir = $C['parentdir'].$C['catdir'];
    $catdir = $C['catdir'];

    //scofield 2010-3-16
    //for url roles add content title and category name
    $showtitle = strip_tags($r['title']);
    $catdirname = $C['catname'];

    //scofield 2010-3-16
    //get root category name
    $catetemp = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE  catid = $catid  LIMIT 1");
    $arrparentidarr = explode(',',$catetemp['arrparentid']);
    $rootidtemp = $arrparentidarr[count($arrparentidarr)-1];
    if($rootidtemp)
    {
        $rootcatetemp = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE  catid = $rootidtemp LIMIT 1");
        $rootcatename = $rootcatetemp['catname'];
    }else
    {
        $rootcatename = $catdirname	;
    }

    $fileext = $this->PHPCMS['fileext'];
    $year = date('Y', $time);
    $month = date('m', $time);
    $day = date('d', $time);
    $modelid = $C['modelid'];
    $urlruleid = $this->MODEL[$modelid]['show_urlruleid'];
    $urlrules = explode('|', $this->URLRULE[$urlruleid]);
    $urlrule = $page < 2 ? $urlrules[0] : $urlrules[1];
    if($this->MODEL[$modelid]['ishtml'])
    {
        if($prefix)
        {
            $contentid = $prefix;
        }
        elseif($PHPCMS['enable_urlencode'])
        {
            $contentid = hash_string($contentid);
        }
    }
    eval("\\$url = \\"$urlrule\\";");
    if($tag)
    {
        if(!(strpos($url, $crootdir)===0))
        {
            $url = $crootdir.$url;
        }
        $url_a[0] = $url;
        $url_a[1] = $domain1.str_replace($crootdir, '', $url);
    }
    else
    {
        $url_a[0] = $url_a[1] = $url;
    }
    return $url_a;
}

 

 

 

说明下,这个函数是生成 文章内容页要用到的函数。

 

同样,在这个文件中还有 个 function category($catid, $page = 0, $isurls = 0, $type = 3) 这个函数

也需要修改。添加如下代码

 

 

//scofield 2010-3-16 add
$catdirname = $C['catname'];

//scofield 2010-3-16
//get root category name
$parentidtemp = $C['parentid'];
$catetemp = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE  catid = $parentidtemp  LIMIT 1");
$parentcatename = $catetemp['catname'].'/'.$catdirname;

 

 

完整的函数代码如下:

 

 

function category($catid, $page = 0, $isurls = 0, $type = 3)
{
    if(!isset($this->CATEGORY[$catid])) return false;
    $C = cache_read('category_'.$catid.'.php', '', 1);
    if($C['type'] == 0)
    {
        $modelid = $C['modelid'];
        $urlruleid = $this->MODEL[$modelid]['category_urlruleid'];
    }
    elseif($C['type'] == 1)
    {
        $urlruleid = $C['category_urlruleid'];
    }
    elseif($C['type'] == 2)
    {
        return $C['url'];
    }
    if(is_numeric($page)) $page = intval($page);
    $arrparentids = explode(',',$C['arrparentid']);
    $domain_dir = $domain_url = '';
    if(preg_match('/:\\/\\//', $C['url']) && (substr_count($C['url'], '/')<4))
    {
        $url_a[0] = $C['parentdir'].$C['catdir'].'/index.'.$this->PHPCMS['fileext'];
        $url_a[1] = $C['url'];
        return $type<3 ? $url_a[$type] : $url_a;
    }
    else
    {
        $count = count($arrparentids)-1;
        for($i=$count; $i>=0; $i--)
        {
            if(preg_match('/:\\/\\//', $this->CATEGORY[$arrparentids[$i]]['url']) && (substr_count($this->CATEGORY[$arrparentids[$i]]['url'], '/')<4))
            {
                $domain_dir = $this->CATEGORY[$arrparentids[$i]]['parentdir'].$this->CATEGORY[$arrparentids[$i]]['catdir'].'/';
                $domain_url = $this->CATEGORY[$arrparentids[$i]]['url'];
                break;
            }
        }
    }
    $categorydir = $C['parentdir'].$C['catdir'];
    $catdir = $C['catdir'];

    //scofield 2010-3-16 add
    $catdirname = $C['catname'];

    //scofield 2010-3-16
    //get root category name
    $parentidtemp = $C['parentid'];
    $catetemp = $this->db->get_one("SELECT * FROM `".DB_PRE."category` WHERE  catid = $parentidtemp  LIMIT 1");
    $parentcatename = $catetemp['catname'].'/'.$catdirname;

    $fileext = $this->PHPCMS['fileext'];
    $urlrules = explode('|', $this->URLRULE[$urlruleid]);
    $urlrule = $page === 0 ? $urlrules[0] : $urlrules[1];
    eval("\\$url = \\"$urlrule\\";");
    if($C['type']==0 && $this->MODEL[$modelid]['ishtml'] && $domain_dir)
    {
        if(strpos($url, $domain_dir)===false)
        {
            $url_a[0] = $domain_dir.$url;
        }
        else
        {
            $url_a[0] = $url;
        }
        $url_a[1] = str_replace($domain_dir, $domain_url.'/', $url_a[0]);
    }
    else
    {
        $url_a[0] = $url_a[1] = $url;
    }
    return $type<3 ? $url_a[$type] : $url_a;
}

 

 

 

注意,在 show方法中,多了 $showtitle , $catdirname ,$rootcatename 这三个变量。 第一个是内容的标题,第二个是当前分类的名称,第三个是某分类的父分类的名称。

这样就可以生成 类似 http://www.aa.com/分类1/标题_1.html 这样的路径。

当然,我们还需要在phpcms后台更改下 URL规则,以使得phpcms支持中文路径。这个下面我们再说。

我们再来看 category 方法。 也多了几个要用的 变量。 $catdirname , $parentcatename  第一个是 当前分类的名称,第二个是某分类的父分类的名称。

 

这几个变量,我们需要来更改phpcms的URL规则。

在phpcms后台->系统管理->其他设置->URL规则管理->管理URL规则。

我们找到 

Phpcms   category  √   {$categorydir}/index.{$fileext}|{$categorydir}/{$page}.{$fileext}   it/product/2.html    修 改 | 删除

这行,修改为

Phpcms  category   √   {$parentcatename}/index.{$fileext}|{$parentcatename}/{$page}.{$fileext} it/product/2.html    修 改 | 删除

 

 

再将

Phpcms   category   √ 
{$catdir}/index.{$fileext}|{$catdir}/{$page}.{$fileext} news/2_1.html    修 改 | 删除

修改为

Phpcms   category   √   {$parentcatename}/index.{$fileext}|{$parentcatename}/{$page}.{$fileext} news/2_1.html  修 改 | 删除

 

 

再将

Phpcms  show   √   {$year}/{$month}{$day}/{$contentid}.{$fileext}|{$year}/{$month}{$day}/{$contentid}_{$page}.{$fileext} 2006/1010/1_2.html  修 改 | 删除

修改为

Phpcms show   √ 
{$rootcatename}/{$showtitle}_{$contentid}.{$fileext}|{$rootcatename}/{$showtitle}_{$contentid}_{$page}.{$fileext} product/1_2.html 修 改 | 删除

 

修改后的 URL规则就可以支持中文路径了。

 

经过以上设置和修改,我们使得PHPCMS支持了中文路径,支持了中文URL。

 

其实也不难哈。

嚎嚎~~~~、