生成静态HTML过程中的一点瑕疵

#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

#2 jake

第一个问题目前我也测试一下。第二个问题是一直以来sphtml的一个问题,目前已经计划是通过类似spUrlRewrite的那种方式去解决它,也就是直接使用生成的地址,而不是json或序列化的数据地址。

:) 楼上的做法非常欢迎,能找到原因来说明问题,这样才是真正解决问题的态度!不像最近某些人,直接就说框架有什么什么问题,其实根本就用错了或者是没有经过寻找问题的过程,只是一有不顺心的地方就是框架的问题。这样的态度很令人心寒。

2011-05-15 09:06:38

#3 logoove

楼主高人,这样才符合开源精神,顶,让我也明白了

2011-05-15 13:01:13

#4 vsxp

这样的分析也有助于提高个人能力

2011-05-15 15:30:22

#5 vsxp

这样的分析也有助于提高个人能力:)

2011-05-15 15:30:26