2009-06-13

osTube v2.5-簡潔網址(Clean URLs)的中文問題

我想,應該有蠻多人從之前的版本就發現,如果在後台把Clean URLs(簡短網址)給他enable,回到前台,然後在各媒體的link應該只會留下原先標題上的英數、符號的部份,其他中文(正體/簡體)的變成減號("-"),想必看中文的我們會有點不太爽吧!!!

其實,這也不是個問題…照常理推,因為osTube是外國人寫的,沒理由請他們把中文(正體/簡體)都放進去考量,但事實上,依「Clean URLs」的想法去想,其實原來他們會把標題放在link的後面,也不符合所謂的「簡短網址」的概念吧,因為,很多媒體我們的標題會打的很長…

反正,這不重要,因為看過osTube的.htaccess發現,若以「http://web-site-url/video/video-index/video-subject」格式來看,其實,mod_rewrite只做「/video/video-index/」的解析,後面的video-subject根本就可有可無,只是給人看的而已


所以,如果有人覺得video-subject的部份中文(正體/簡體)變成減號("-")很讓人不爽的話…在version 2.5(之前的版本我忘了)在ostube根目錄下有一個includes資料匣,開啟includes中的function.seo.php
在function seo_chars($item){
/*
$item = str_replace("/", "-", $item);
$item = str_replace(" ", "-", $item);
$item = str_replace("?", "-", $item);
$item = str_replace("=", "-", $item);
$item = str_replace("!", "-", $item);
$item = str_replace("*", "-", $item);
$item = str_replace("'", "-", $item);
$item = str_replace('"', "-", $item);
*/

//$item = preg_replace("#[^a-zA-Z0-9_-]#msi", "-", $item); <------註解這一行,改寫下一行

$item = preg_replace("/ /", "_", $item);//把title中的半形空格,用半形底線來取代

return strtolower($item);

}

preg_replace(pattern, replace_str, source_str)
preg_replace的使用

pattern是條件式,支援regex文字表示法,型態:文字

replace_str是用什麼來取代符合pattern條件的,型態:文字

source_str是來源文字

用了之後,先確定後台組態設定那是否有把Clean URLs(簡短網址)給開啟,有的話就可以回到前台來看看各媒體的列表,應該就會發現原先是減號("-")的就會是正常的顯示方式,只不過,我的規則是把標題中有半型空格的改用底線來取代

===

如果有人覺得怕改了function seo_chars()會造成其他也使用seo_chars()會產生問題的話,那ok,你也可以選擇性的更動

例:
假設我只想要媒體(像video/music...之類)的link中的中文可以正常顯示,一樣開啟function.seo.php

一開始的seo_chars() 可以不用去改,接著,找到

function seo_media_link($mid = NULL, $mkey = NULL, $type = NULL, $mtitle = NULL, $htmlEscape = true){
global $dbconn, $main;

if($mkey == NULL){
$all = $dbconn -> return_query("SELECT media_title,
media_key,
media_id,
media_type
FROM " . $dbconn -> getTable("media") . "
WHERE media_id='". $dbconn -> escape($mid) ."'", "alias");

$mkey = $all["media_key"];
$mid = $all["media_id"];
$type = $all["media_type"];
$mtitle = $all["media_title"];

}
elseif($mid == NULL){
$all = $dbconn -> return_query("SELECT media_title,
media_key,
media_id,
media_type
FROM " . $dbconn -> getTable("media") . "
WHERE media_key='". $dbconn -> escape($mkey) ."'", "alias");

$mid = $all["media_id"];
$mkey = $all["media_key"];
$type = $all["media_type"];
$mtitle = $all["media_title"];

}

$seo = $main->getConfig('clean_urls', 0);

if($seo){
//return url($type . "/" . $mid ."/" . seo_chars($mtitle)); <----註解這一行,改用底下

return url($type . "/" . $mid ."/" . preg_replace("/ /", "_", $mtitle));//一樣的道理

}
else {
return url("mediadetails.php?key=" . $mkey . (($htmlEscape) ? '&amp;' : '&') ."title=" . urlencode($mtitle));

}

}

沒有留言: