|
给几个数据库table都建了scaffolding,都放在controllers目录下,与其他controller夹杂在一起比较碍眼。文档里说支持子目录,所以在controllers目录下建了个scaffolding子目录,把相关的controller都扔了进去。
打开页面测试下,发现只能打开scaffolding的view页面,其他add、insert、edit等function都无法访问。看了看连接,原来是地址发生错误了。原来应该是http://localhost/ci/index.php/scaffolding/users/s/add,结果连接指的是http://localhost/ci/index.php/scaffolding/users/add,把route.php中设置的scaffolding_trigger的值给漏了。
于是打开Scaffolding.php文件看了看,原来在取segment()的值时,直接用的是固定的数字,显然这是不合适的,在使用子目录时肯定取不完整。
遗憾而无奈的同时,在注释// Set the base URL下的$this->base_url和$this->base_uri做了些须修改:
PHP复制代码
$n = 1;
$tmp_paths = '';
while (is_dir(APPPATH . 'controllers/' . $this->CI->uri->segment($n)))
{
$tmp_paths .= $this->CI->uri->segment($n) . '/';
$n++;
}
$this->base_url = $this->CI->config->site_url().'/'.$tmp_paths.$this->CI->uri->segment($n).$this->CI->uri->slash_segment($n+1, 'both');
$this->base_uri = $tmp_paths.$this->CI->uri->segment($n).$this->CI->uri->slash_segment($n+1, 'leading');
复制代码
连接没问题了,不过点view上的add new居然没有反应,始终停留在view页面。于是找到Controller.php的_ci_scaffolding()方法,发现这里犯了一个和前面一样的错误:代码想控制scaffolding执行的function,在一个固定的数组之内(array('add', 'insert', 'edit', 'update', 'view', 'delete', 'do_delete')),所以取当前URI中的function值做了个检验。结果在取这个值时,又使用了固定的数字作为segment()的参数……-___-!
照上面的修改很简单就可以解决问题,代码就不重复了。
除了这两处,还有多处对于segment()的使用有问题,问题都是在segment()的获取上。
虽然是个比较小的修改,但这里反应了一些问题:
首先,CI的Sub-folders功能显然存在重大问题,尤其在通过segment()取输入参数时,简单而粗暴地直接通过参数位置获取,让人汗颜。
其次,联系前几日我提的关于checkbox的问题,个人感觉CI的代码的健壮性不敢恭维,还有很长路需要走。可想想CI出来也好几年了,怎么在一些基础问题上还会有如此毛病,实在不可思议。
常见的PHP FW都用了一遍,在PHP4环境下始终找不到一个合适的可以正式使用。CI的“轻框架”似乎是和我的思路最一致的,前前后后也不下三次注意CI,可一深入就让人失望。
牢骚多了点,见谅。
[ 本帖最后由 KnightE 于 2008-5-29 02:39 编辑 ] |
评分
-
查看全部评分
|