CodeIgniter学习笔记 Item6--CI中的常规主题
1. 扩展控制器
CI的控制器默认继承自CI_Controller
,如果要扩展控制器,需要定义一个从CI_Controller
派生的控制器,所有的自定义控制器都继承这个新控制器。
在application/core目录下,有与system目录下类似的目录结构,比如core、helpers、language、libraries目录,扩展控制器就是在application/core目录下自定义控制器,该控制器类从CI_Controller继承,类似的,如果要扩展系统的功能,就在application下的对应目录新增自定义类,从系统类继承。
[code]<?php class My_Controller extends CI_Controller { function __construct() { parent::__construct(); echo "自定义控制器"; // 权限验证... // 登录验证... } } ?>
之后,将所有添加的控制器都从MY_Controller
派生,通过在MY_Controller
中重写父类方法来实现扩展控制器。
在application/config/config.php文件中,有这样一个配置项
[code]$config['subclass_prefix'] = 'MY_';
CI在查找扩展类,会根据这里的前缀去查找并包含定义类文件,此处前缀不区分大小写
2. CI中的URL
当PHP程序部署在服务器上时,用户会将程序安装到指定目录,程序员无法预先知道用户会安装到哪个目录,因此对于代码中出现的URL不能写死,需要通过URL辅助函数动态获取,在使用函数前需要先加载URL辅助函数库($this->load->helper('url'))
或配置/application/config/autoload.php自动加载。
site_url()
:返回以config.php中指定的base_url
和index.php,还有传递给函数的URL段参数拼接成的字符串
[code]<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action=<?php echo site_url('user/index4'); ?> method="post"> name:<input type="text" name="name" /><br /> password:<input type="text" name="password"><br /> <input type="submit" name="submit" value="submit" /> </form> </body> </html>
base_url():返回项目的基础目录
[code]<img src="<?php echo base_url(); ?>upload/qe.jpg">
current_url():返回当前查看页面的完整URL
3.CI中的路由
路由用于配置针对某些URL与项目中实际文件的对应关系,是的URL看起来更符合用户的习惯,又不用改变项目现有的结构,路由的配置文件是/application/config/routes.php,可以设置默认控制器和404错误页面
[code]$route['default_controller'] = 'welcome'; $route['404_override'] = '';
更重要的功能是,如果我们要实现通过/index.php/news/4.html访问/index.php/article/show/1这样一个需求,可以在routes.php定义路由关系,将原始的URL转换成需要样式
[code]$route['news/([\d]+)\.html] = 'article/show/$1';
这样对于所有负责正则表达式的URL,都会路由到新的路径,其中$1
表示正则表达式中的第一个
用()括起来的部分
4.CI中的分页
首先加载分页类
[code]$this->load->library('pagination');
然后设置分页属性
[code]// 每页显示的数量 $config['page_size'] = 10; // 总数据量 $config['total_rows'] = 200; // 设置分页跳转页面的基础地址 $config['base_url'] = site_url('index.php/user/test'); // 设置分页显示文字 $config['first_link'] = '首页'; $config['next_link'] = '下一页'; $config['prev_link'] = '上一页'; $config['last_link'] = '末页';
初始化分页类
[code]$this->pagination->initialize($config);
创建链接并传递给视图
[code]$data['links'] = $this->pagination->create_links(); $this->load->view('test', $data);
通过URL获取偏移量拼装查询
[code]$offset = (int)$this->load->uri->segment(3); $sql = "SELECT * FROM blog_user limit $offset, $page_size";
5.CI中的文件上传
首先通过控制器的方法跳转至视图
[code]public function file() { $this->load->helper('url'); $this->load->view('file'); }
在视图中创建一个表单用于选择并上传文件
[code]<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="<?php echo site_url('index.php/user/upload'); ?>" method="post" enctype="multipart/form-data"> <input type="file" name="pic" /> <input type="submit" name="submit" value="submit"> </form> </body> </html>
其中,要注意第一个input的name属性,这个属性后面要用,在表单中将action设置为一个控制器方法,编写对应的控制器方法
[code] public function upload() { // 上传文件到服务器目录 $config['upload_path'] = './upload'; // 允许上传哪些类型 $config['allowed_types'] = 'gif|png|jpg|jpeg'; // 上传后的文件名,用uniqid()保证文件名唯一 $config['file_name'] = uniqid(); // 加载上传库 $this->load->library('upload', $config); // 上传文件,这里的pic是视图中file控件的name属性 $result = $this->upload->do_upload('pic'); // 如果上传成功,获取上传文件的信息 if ($result) { var_dump($this->upload->data()); } }
这样就完成文件上传了
6.CI中的Session
CI默认没有启动Session,而是用Cookie代替Session,首先Cookie只能保存4KB的数据,其次,在Session中保存数据马上就可以获取到,而Cookie中的数据要等到下次客户端请求时才能获取到。
首先加载Session类
[code]$this->load->library('session');
然后通过set_userdata方法以键值对或关联数组的方式保存数据
[code]$user = array('id' => 3, 'name'=>'dj'); $this->session->set_userdata('user', $user);
用userdata方法获取数据
[code]$user = $this->session->userdata('user');
用unset_userdata方法删除数据
[code]$this->session->unset_userdata('user');
如果要保存的数据只需要用一次,可以使用闪出数据,这种数据只对下次服务器请求可用,然后会自动清除,闪出数据用set_flashdata()方法设置
[code]$this->session->set_flashdata('user', $user);
7.CI中的验证码
首先需要在入口文件的同级目录文件夹用于保存验证码图片,比如新建captcha目录
加载captcha辅助类
[code]$this->load->helper('captcha');
调用create_captcha函数生成验证码图片
[code]$this->load->helper('url'); $vals = array ( // 验证码文字,默认是8位随机字符串 'word' => 'Random word', // 图片保存路径 'img_path' => './captcha/', // 基础目录URL 'img_url' => base_url() . './captcha', // 图片中的字体使用的字体文件 'font_path' => './path/to/fonts/texb.ttf', // 图片大小 'img_width' => '150', 'img_height' => 30, // 指定了验证码图片的超时删除时间(秒),默认2小时 'expiration' => 30 ); $cap = create_captcha($vals);
此外,还可以设置字符串长度、颜色、字体大小、可选字符,返回值包括了生成图片的名称、完整的img标签、验证码字符串
由于CI不是PHP的session,因此对于验证码的验证过程可以直接使用PHP的session进行保存
[code]session_start(); $_SESSION['cap'] = $cap['word'];
然后使用用户的输入与session中的值进行比较就可以了
以上就是CodeIgniter学习笔记 Item6--CI中的常规主题的内容,更多相关内容请关注PHP中文网(www.php.cn)!
推荐阅读
-
CodeIgniter学习笔记 Item2--CI中的MVC
-
CodeIgniter学习笔记 Item3--CI中的超级对象
-
CodeIgniter学习笔记 Item5--CI中的AR
-
CodeIgniter学习笔记 Item6--CI中的常规主题
-
CodeIgniter学习笔记 Item4--CI中的数据库操作
-
CodeIgniter学习笔记 Item9--CI中的类库
-
CodeIgniter学习笔记 Item6--CI中的常规主题
-
CodeIgniter学习笔记 Item5--CI中的AR
-
CodeIgniter学习笔记 Item4--CI中的数据库操作
-
CodeIgniter学习笔记 Item3--CI中的超级对象