#1 GoolLong
问题现象:我生成的静态页面地址会是这个样子的
http://localhost/html/./view-1.html
http://localhost/html/./view-2.html
问题重现:
主控文件index.php
$spConfig = array(
'html' => array(
'enabled' => true,
'file_root_name' => 'html',
),
);
控制器在生成静态页面时,指定了静态文件的文件名
for ($i = 0; $i < count($rows); $i++) {
$urls[] = array(
array('main', 'view', array('id'=>$rows[$i]['id']) ),
"view_".$rows[$i]['id'].".html"
);
}
原因分析:
在框架内核 spView.php 文件第125 ~ 135行
$file_root_name = ( '' == $GLOBALS['G_SP']['html']['file_root_name'] ) ?
'' : $GLOBALS['G_SP']['html']['file_root_name'].'/';
if( null == $alias_url ){
$filedir = $file_root_name .date('Y/n/d').'/';
$filename = substr(time(),3,10).substr(mt_rand(100000, substr(time(),3,10)),4).".html";
}else{
$filedir = $file_root_name.dirname($alias_url) . '/';
$filename = basename($alias_url);
}
$baseuri = rtrim(dirname($GLOBALS['G_SP']['url']["url_path_base"]), '/\\')."/".$filedir.$filename;
$realfile = APP_PATH."/".$filedir.$filename;
没有对 $alias_url 是否包含路径做处理。
另外还有个问题:
1、在模板中使用 spUrl 时,如果不指定 c 或 a(比如c=main或a=index时,可能会省略c、a参数),会造成找不到对应静态文件的问题,输出的全是动态地址,无法给出已生成好的静态HTML文件地址。必须明确指定c、a参数才行。
2、在程序中使用 spUrl 时,参数必须指定为字符串型,否则可能跟生成的静态文件匹配不上。因为一般生成静态文件,都是从数据库中取数据。从数据库中取出的数据,即使字段是INT型,可取出来的值也是String型,那么在生成静态文件列表时,会这样生成
main|view|{"id":"1"}
如果在程序中 spUrl("main", "view", array('id' => 1)) ,那么内核会生成
main|view|{"id":1}
这样就无法匹配上已生成好的静态文件。
(以上2个问题困扰了我一晚上,读了内核程序后才把问题解决了,所以发出来供大家参考)
2011-05-15 03:34:27