## 用户自定义
本章讲介绍一些开发过程中常用需要自定义的东西。
### 一、自定义404页面
一般比较完整的站点,都会有自定义的404页面,既美观统一、又能保持访问者不至于因为错误页面而退出网站。
> 比如说duowan.com的404页面,是一个坦克大战的小游戏,可以在线玩并且成绩还会进入排行榜,和其他网友一较高下。
**对404错误页面的建议:**
- 建议不要使用PHP动态页面,纯HTML页面会比较好。
- 具特色,但不能过于复杂的页面,保存页面可以快速载入和有鲜明的提示。
- 通常会进行一些引导,作为“找不到页面”的补充,但建议不要过多。
在sp框架中,自定义自己程序的404页面,也是很简单的事情。
打开protected/controller/BaseController.php,在BaseController类中,加入以下方法:
public static function err404($module, $controller, $action){
header("HTTP/1.0 404 Not Found");
exit;
}
当你访问到一个不存在的controller/action的时候,就会出现http 404的提示了。
当然你还可以做得更漂亮一点,比如说做个叫404.html的页面,放在模板目录里面。然后修改一下上面的err404()方法:
public static function err404($module, $controller, $action){
header("HTTP/1.0 404 Not Found");
$controlObj = new Controller;
$controlObj->display("404.html");
exit;
}
现在你就可以在404的时候显示你的404.html页面了。
> 这里不建议去掉header函数输出的404头,因为这样才比较符合一个404页面的规范,并且搜索引擎以及内容分发网络(CDN)等都不会误会成一个普通的页面(只是页面上写着404),从而引发一些没必要的问题。
> 另外exit也最好保留,因为404之后你就不需要再执行下去了。
### 二、全局位置
在后面准备讲自定义类库和自定义函数库的知识之前,我们最好能来了解一下关于程序的全局位置。
全局位置的作用一般是:
- 定义常量:定义在整个程序中使用到的静态常量,如路径的定义、数值的定义等。
- 载入文件:载入全局都要使用的类库/函数库php文件
- 执行某些代码:如进行应用程序配置的合并、执行全局函数,GZIP压缩或输出处理等。
- 全局性的预操作,如权限控制,菜单构造、全局跳转等。
在新版的sp框架里面,全局位置更为单一,因为我们认为全局位置就是一个控制专用的位置,所以它必须处在控制器的范畴内。
新版中我们加入了BaseController这个自带的用户类,它的位置刚好在Controller控制器父类和用户自定义控制器的继承链之间。这样使得BaseController既有普通的Controller的功能,也能覆盖到全部用户控制器之前进行操作。所以BaseController是比较适合当做全局位置的地方。
BaseController有一个初始化执行的方法,名为init(),它会在BaseController构造函数内执行,所以进入控制器后最先执行的位置。
**全局定于和全局操作,就可以放在BaseController/init()里面执行。**
> 对比来说,新版的init()和旧版直接使用控制器父类的构造函数,差别并不大。但是直接使用构造函数还是会不太优雅,所以新版加入了init()方法来代替。
### 三、自定义类库
在之前的快速入门教程中,我们已经讲述过,新版sp框架里面,自定义的类库实际上跟Model模型类一样,只要满足以下条件,都可以直接通过new语法来实例化:
- 类名和类文件名一致,当然也必须是大小写一致才行。
- 类文件放在protected下面的model、include、controller之一的目录内。
### 四、自定义函数库
用户自定义的函数,一般都是比较实用并且经常用到的一些函数集合,如加解密、分片下载、美化时间等函数。
所以我们一般会建议自定义的函数都放到一个函数库文件里面,在“全局位置”中引入该文件(如BaseController的init()函数),这样就在程序的大部分地方都可以轻松调用了——包括新版的模板引擎内。
> 是的,新版的模板引擎,已经不再需要“注册函数”才能在模板里面用函数了。
这里举个例子,我们为程序引入一个叫mydate()的函数。
<?php
// mydate函数
function mydate($time = null){
if( null == $time )$time = time(); // 默认是当前时间
if( $time > (time() - 3600) ){
return "刚才";
}elseif( $time > (time() - 3600 * 24) ){
return "今天";
}elseif( $time > (time() - 3600 * 24 * 2) ){
return "昨天";
}elseif( $time > (time() - 3600 * 24 * 3) ){
return "前天";
}else{
return date("Y-m-d H:s", $time);
}
}
?>
将以上代码保存到protected/include/functions.php里面。
> functions.php文件和include目录都是不存在的,需要自行创建。
然后在BaseController的init()函数内,将它包含进来:
<?php
class BaseController extends Controller{
function init(){
require(APP_DIR.'/protected/include/functions.php');
}
}
?>
那么,在程序的控制器以及模板内,都可以正常使用mydate()函数了。
- 自述
- 一、入门教程
- 1. 开始使用SpeedPHP
- 2. Hello World
- 3. 理解MVC
- 4. 制作留言本
- 5. 数据操作及Ajax
- 二、框架概述
- 1. 特色
- 2. 版权及开源协议
- 3. 开发环境
- 4. 编码版本
- 5. SAE平台使用
- 三、开发指南
- 1. 开发流程
- 2. 架构及扩展
- 3. 程序目录结构
- 4. 命名建议
- 5. 安全建议
- 6. 用户自定义
- 7. 模块modules
- 四、访问交互
- 1. 表单提交及数据获取
- 2. session/cookie的使用
- 3. 伪静态及URL跳转
- 4. 使用frameset
- 5. 模板引擎特性和使用方法
- 五、数据操作
- 1. 建立数据模型类
- 2. 数据操作教程
- 3. 分页
- 4. SQL支持及关联实现
- 5. 多数据库、主从库配置