Maison  >  Article  >  php教程  >  Notes d'étude CodeIgniter Item6 - Sujets généraux dans CI

Notes d'étude CodeIgniter Item6 - Sujets généraux dans CI

黄舟
黄舟original
2016-12-29 10:30:171215parcourir

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[&#39;subclass_prefix&#39;] = &#39;MY_&#39;;

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(&#39;user/index4&#39;); ?> 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[&#39;default_controller&#39;] = &#39;welcome&#39;; $route[&#39;404_override&#39;] = &#39;&#39;;

更重要的功能是,如果我们要实现通过/index.php/news/4.html访问/index.php/article/show/1这样一个需求,可以在routes.php定义路由关系,将原始的URL转换成需要样式

[code]$route[&#39;news/([\d]+)\.html] = &#39;article/show/$1&#39;;

这样对于所有负责正则表达式的URL,都会路由到新的路径,其中$1
表示正则表达式中的第一个 

用()括起来的部分

4.CI中的分页

首先加载分页类

[code]$this->load->library(&#39;pagination&#39;);

然后设置分页属性

[code]// 每页显示的数量 
$config[&#39;page_size&#39;] = 10; 
// 总数据量 
$config[&#39;total_rows&#39;] = 200; 
// 设置分页跳转页面的基础地址 
$config[&#39;base_url&#39;] = site_url(&#39;index.php/user/test&#39;); 
// 设置分页显示文字 
$config[&#39;first_link&#39;] = &#39;首页&#39;; 
$config[&#39;next_link&#39;] = &#39;下一页&#39;; 
$config[&#39;prev_link&#39;] = &#39;上一页&#39;; 
$config[&#39;last_link&#39;] = &#39;末页&#39;;

初始化分页类

[code]$this->pagination->initialize($config);

创建链接并传递给视图

[code]$data[&#39;links&#39;] = $this->pagination->create_links(); $this->load->view(&#39;test&#39;, $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(&#39;url&#39;);     $this->load->view(&#39;file&#39;); }

在视图中创建一个表单用于选择并上传文件

[code]<!DOCTYPE html> 
<html> 
<head>     
<meta charset="UTF-8">     
<title>Document</title> 
</head> 
<body>     
<form action="<?php echo site_url(&#39;index.php/user/upload&#39;); ?>" 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[&#39;upload_path&#39;] = &#39;./upload&#39;;     
// 允许上传哪些类型     
$config[&#39;allowed_types&#39;] = &#39;gif|png|jpg|jpeg&#39;;     
// 上传后的文件名,用uniqid()保证文件名唯一     
$config[&#39;file_name&#39;] = uniqid();     
// 加载上传库     
$this->load->library(&#39;upload&#39;, $config);     
// 上传文件,这里的pic是视图中file控件的name属性     
$result = $this->upload->do_upload(&#39;pic&#39;);     
// 如果上传成功,获取上传文件的信息     
if ($result)      
{         
var_dump($this->upload->data());     
} 
}

这样就完成文件上传了

6.CI中的Session

CI默认没有启动Session,而是用Cookie代替Session,首先Cookie只能保存4KB的数据,其次,在Session中保存数据马上就可以获取到,而Cookie中的数据要等到下次客户端请求时才能获取到。

首先加载Session类

[code]$this->load->library(&#39;session&#39;);

然后通过set_userdata方法以键值对或关联数组的方式保存数据

[code]$user = array(&#39;id&#39; => 3, &#39;name&#39;=>&#39;dj&#39;); $this->session->set_userdata(&#39;user&#39;, $user);

用userdata方法获取数据

[code]$user = $this->session->userdata(&#39;user&#39;);

用unset_userdata方法删除数据

[code]$this->session->unset_userdata(&#39;user&#39;);

如果要保存的数据只需要用一次,可以使用闪出数据,这种数据只对下次服务器请求可用,然后会自动清除,闪出数据用set_flashdata()方法设置

[code]$this->session->set_flashdata(&#39;user&#39;, $user);

7.CI中的验证码

首先需要在入口文件的同级目录文件夹用于保存验证码图片,比如新建captcha目录

加载captcha辅助类

[code]$this->load->helper(&#39;captcha&#39;);

调用create_captcha函数生成验证码图片

[code]$this->load->helper(&#39;url&#39;); 
$vals = array     
(        
 // 验证码文字,默认是8位随机字符串         
 &#39;word&#39; => &#39;Random word&#39;,         
 // 图片保存路径         
 &#39;img_path&#39; => &#39;./captcha/&#39;,         
 // 基础目录URL         
 &#39;img_url&#39; => base_url() . &#39;./captcha&#39;,         
 // 图片中的字体使用的字体文件         
 &#39;font_path&#39; => &#39;./path/to/fonts/texb.ttf&#39;,         
 // 图片大小         
 &#39;img_width&#39; => &#39;150&#39;,         
 &#39;img_height&#39; => 30,         
 // 指定了验证码图片的超时删除时间(秒),默认2小时         
 &#39;expiration&#39; => 30     ); 
 $cap = create_captcha($vals);

此外,还可以设置字符串长度、颜色、字体大小、可选字符,返回值包括了生成图片的名称、完整的img标签、验证码字符串

由于CI不是PHP的session,因此对于验证码的验证过程可以直接使用PHP的session进行保存

[code]session_start(); $_SESSION[&#39;cap&#39;] = $cap[&#39;word&#39;];

然后使用用户的输入与session中的值进行比较就可以了

 以上就是CodeIgniter学习笔记 Item6--CI中的常规主题的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn