flemming 发表于 2019-1-11 01:00:53

简单粗暴解决模板JS/CSS相对路径问题

用CI两周了,感觉特别顺手,非常感谢CI提供这么好的产品,本人也希望尽绵薄之力回馈大家,
现在将我使用过程中的一个小心得贡献出来。
===============完美的分割线====================

关于相对路径问题,百度一下,目前主流解决办法主要是两种,

方法一:.将JS/CSS文件移到新建的resource目录(与system目录同级),然后在每个模板文件中加入<? echo "<base href='.base_url().'>"; ?>
方法二:放弃相对路径方式,直接把模板文件中的JS/CSS路径改成绝对路径

这两种方法都不好,因为都是侵入式修改,要么需要移动资源文件,要么要修改模板文件,都非常不人性化。
并且这两种方法都无法解决两个致命问题,
一是如果你的模板文件中包含又iframe,iframe中引用的文件是无法访问的,除非把访问文件也移动到资源目录去。
二是AJAX请求是没法实现的。

最好的解决办法是修改框架源码,实现无侵入式兼容相对路径。
方法如下:
修改 system/libraries/Parser.php文件
注:当你加载模板用的是$this->parser->parse()方式的时候修改这个文件,如果用的是$this->load->view()的话方法类似,自己去找相关文件修改。
在159行前面插入一行如下:

if ($return === FALSE)
{
   $this->CI->output->append_output('<base href="'.base_url().'/application/views/"/>'); //扩展byf疯子
   $this->CI->output->append_output($template);
}

有了这行之后,每次加载模板,就会自动在模板前面加入<base href="xxxx">标签,而你并不需要修改你的模板。

相关问题,你可能会遇到 403 错误,那是你的目录没有访问权限,去Apache上把相关目录权限打开即可,例如下面这样,

<Directory "C:\03_WorkSpace\FinacialSystem\root\application\views">
    AllowOverride All
    Options None
    Require all granted
</Directory>



不出意外的话你现在能在不修改任何模板文件,也不移动任何资源文件的情况下正常加载JS/CSS,图片以及iframe 引用资源,以及AJAX请求了。

另外对于CI个人有个小小建议,可以把异常捕捉和传递功能加强一下。。。我是自己扩展了(用的是restful风格,不是Exception机制),要不然稍微复杂点的系统都不好开发了。

好了以上希望对大家有所帮助。







faqe 发表于 2020-3-29 15:51:40

bucuo 很不错 给力
页: [1]
查看完整版本: 简单粗暴解决模板JS/CSS相对路径问题