本文转载自:http://www.softeng.cn/?p=74

这节课讲一下CI框架的路由规则,以及如何在CI框架下实现ajax功能。
首先,先介绍CI框架的路由规则,因为CI框架是在PHP的基础上发展而来的,所以在基本的路由规则中,和原生态的PHP项目是相似的,但是CI框架是符合MVC框架的,在前两节中也提到了,MVC框架一般是以控制器作为程序入口,所以,使用CI框架做出来的网站,其URL都是控制器的地址,而视图和模型的地址对于用户来说是透明的。接下来先看看CI的默认路由规则:
example.com/index.php/floder/class/function/id/
在上面的这个地址中:
example.com表示网站的域名或IP地址;
index.php这个是PHP路由中常见的,必须写;
floder表示的是控制器所处的文件夹,在一般的网站中,会有多个模块,当功能较多、较复杂,代码量较大时,会通过将不同的模块对应的代码放入不同的文件夹中,当出现这种情况时,路由中就需要写清楚控制器所在的文件夹,对于直接放在控制器根目录下的类(文件)则不需要这一级路由;
class是控制器的类名,这里和PHP路由不同,这里注意是类名,不是文件名;
function是控制器中对应的函数名,如果是index函数,则可以不写;
id这是要传入function的参数,这里还应注意,当一个函数拥有参数时,即使是index函数,也要在URL中写清楚,这里大家会发现,普通的PHP,如果通过URL传参的话,应该是以问号开头,然后是键值对的形式完成get方式传参,但是在CI中,确是通过/符号,这就是CI自己的路由规则,有人可能会问,那如果是多个参数呢?很好办,多个参数就继续用/分割,比如现在有三个参数分别是id1,id2,id3,那么URL将是
example.com/index.php/floder/class/function/id1/id2/id3/
这就是CI框架的默认路由规则,当然,既然有默认的,那就会有自定义的。
很多人会说,都已经是MVC框架了,为什么还要有那个index.php,大家还记得第一节课中讲到的CI框架的目录结构吗?在其中可以看到在CI框架的根目录下,有一个index.php,如下图:
 
就是我标注为“网站默认页面”的那个文件(其实这个文件并没有输出任何东西,而是大量的变量定义和环境检测,然后跳转去其他页面),在URL中的index.php就是指他,但是像上面这样的路由结构看起来多奇怪啊,如果能把那个index.php去了,感觉明显好多了,而且在也有助于SEO优化(这是一个独立的内容,这里不涉及),那么现在就动手来去了它吧!就在CI框架的根目录下,新建一个名为.htaccess的文件,用记事本打开文件,然后在里面添加如下代码:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /CI_03/index.php/$1 [L]
大家注意看,最后一行代码中出现了“CI_03”,在这个位置,需要填入你的项目的根目录名称,比如,第一课的时候,这里应该写CI_01,第二课就写CI_02,这样,就可以在URL中去掉那个别扭的index.php了。
除了能够去掉index.php,CI的路由规则还能够更加灵活的自定义,如果大家想了解更多内容,可以参看我在第一课中所共享的《CodeIgniter框架API手册》的“常规主题”下的“URL路由”一节,其中介绍了如何自定义的URL规则。
讲完了路由规则,接下来说一下在CI框架下实现ajax,下面的部分必须要有第二课的内容做为基础才能看懂,如果你还没有学习第二课,请先学习第二课后,再看下面的内容。
这部分内容,仍然是以一个简单的计算器做为例子,相比较上节课的内容而言,使用ajax后,将减少一个视图(用于显示结果的视图),同时,可以实现无刷新的页面更新,关于ajax的基础学习,可以参看《基于PHP的AJAX学习笔记(教程)》一文,该文为本人在学习ajax过程中的学习笔记。
接下来,看看具体的代码,这节课,所要实现的功能和上节课完全相同,所以,在上节课的代码基础上进行修改,首先还是从控制器改起,上节课里,是将整个式子以及其计算结果作为一个数组传给另外一个数组,而本节课,因为使用ajax的关系,只需要一个视图,也就是上节课输入算式的视图即可完成,所以,需要修改Calculate控制器里的count()方法的内容,具体修改如下:
function count() {
// 使用输入类接收参数
$num1 = $this->input->post('num1');
$op = $this->input->post('operate');
$num2 = $this->input->post('num2'); if (is_numeric($num1) && is_numeric($num2)) {
// 如果两个数输入均为数字,则调用calculate_model模型下的count方法
$result = $this->calculate_model->count($num1, $num2, $op); // 采用文本作为格式作为回传值,所以直接返回结果
echo $result;
}else {
echo FALSE;
}
}
大家会发现,控制器的改动很小,而且比上节更加简单了,这是因为计算的结果只是一个简单的数字,所以这里我采用文本格式返回,当返回数据较多时,推荐采用xml格式或json格式,具体内容参看上面提到的《基于PHP的AJAX学习笔记(教程)》。
修改完控制器,现在要修改视图了,在本课中,只有一个视图,那就是calculate_view视图,同时,也是改动内容最大的一个部分。下面就来看看他的代码是怎样的:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>网页计算器</title>
<style type="text/css">
#calculators {
margin: 10% auto;
width:600px;
border:1px solid #000;
}
</style>
<script type="text/javascript">
var xmlhttp = null;
function $(id) {
return document.getElementById(id);
} //创建ajax引擎
function getXMLHttpRequest() {
var xmlhttp;
try {
//Firefox,Opera 8.0+, Safari
xmlhttp = new XMLHttpRequest();
}catch (e) {
//Internet Explorer
try {
xmlhttp = new ActiveXObject("Msxml12.XMLHTTP");
}catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch (e) {
alert("您的浏览器不支持AJAX!");
return false;
}
}
}
return xmlhttp;
} function isubmit() {
xmlhttp = getXMLHttpRequest(); //怎么判断创建是否成功
if (xmlhttp) {
//以post方式发送
var url = "index.php/calculate/count/";
var data = "num1="+$("num1").value+"&operate="+$("operate").value+"&num2="+$("num2").value;
//打开请求
xmlhttp.open("post", url, true);
//下面这句话是post方式发送时必须要
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//指定回调函数,指定的函数名一定不要带括号
xmlhttp.onreadystatechange = deal;
//发送请求
xmlhttp.send(data);
}
}
function deal() {
//取出从服务器返回的数据
if (xmlhttp.readyState == 4) {
//取出值,根据返回信息的格式而定
$("result").value = xmlhttp.responseText;
}
}
</script>
</head> <body>
<div id="calculators">
<form>
<input type="text" name="num1" id="num1" />
<select name="operate" id="operate">
<option value="add">+</option>
<option value="sub">-</option>
<option value="mul">x</option>
<option value="div">÷</option>
</select>
<input type="text" name="num2" id="num2" />=
<input type="text" name="result" id="result" disabled="disabled" />
<input type="button" value="计算" onclick="isubmit()" />
</form>
</div>
</body>
</html>
上面的代码,只是实现了基本的ajax功能,但是没有进行任何输入检查,这样的代码是不安全的,也是不健壮的,但因为时间原因,本人不再就上面的代码进行优化,感兴趣的同学,可以自己尝试优化代码,已完成更加丰富的功能。
最后,来看看calculate_model模型,其实模型中要求该的地方也非常少,同样也只是count函数而已,具体代码如下:
function count($num1, $num2, $op) {
if ($op == "add") {
return $num1 + $num2;
}else if ($op == "sub") {
return $num1 - $num2;
}else if ($op == "mul") {
return $num1 * $num2;
}else if ($op == "div" && $num2 != 0) {
return $num1 / 1.0 / $num2;
}else {
return FALSE;
}
}
到这里,就已经通过ajax技术和CI框架实现了一个简单的计算器。现在来总结一下ajax的内容。
总结:其实CI框架下的ajax就是将ajax请求接在控制器的函数上,然后由控制器的函数完成相关调用和操作,将结果返回ajax的过程,通过这样的方式,能够有效提高页面的加载效率,提高用户体验。尤其是在页面数据量较大时,ajax的重要性更加凸显。

第三课源代码下载地址:

http://www.softeng.cn/?p=74

CodeIgniter框架入门教程——第三课 URL及ajax的更多相关文章

  1. CodeIgniter框架入门教程——第一课 Hello World!

    本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...

  2. CI(CodeIgniter)框架入门教程——第二课 初始MVC

    本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...

  3. Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导

    Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导 Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导 必要的message类实现 从下面开始是在veins/src/vei ...

  4. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

  5. Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)

    原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  6. WCF入门教程(三)定义服务协定--属性标签

    WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...

  7. SQLite 入门教程(三)好多约束 Constraints(转)

    转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...

  8. 【知识整理】这可能是最好的RxJava 2.x 入门教程(三)

    这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最好的RxJava 2.x 入门教程(二) GitHub 代码同步更新:ht ...

  9. Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

    https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...

随机推荐

  1. CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.13

    CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.132013-10-24 15:31:12标签:服务器 防火墙 file 配置文件 written 一.配置好I ...

  2. Makefile内嵌函数

    subst字符串替换函数 $(subst <from>, <to>, <text>),把<text>中的<from>字符串替换成<to ...

  3. x01.os.13: 文件系统

    停了两天电,忽然得空闲.找来破吉他,已然不成弦.           丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...

  4. hadoop2.6---常用命令

    为了方便操作,可以把hadoop加入环境变量 修改,vi ~/.bashrc export HADOOP_PREFIX=/app/programs/hadoop- export HADOOP_MAPR ...

  5. OpenStack 企业私有云的若干需求(9): 云管理平台 CMP

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  6. 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  7. OpenXml入门---word里面插入图片

    下面介绍如何在word里面插入图片,顺便小弟发现MSDN官网有完整的OpenXML教程,虽然是全英文的不过还是很有帮助的. Tips,原来摘抄代码里面没有模板,在copy过来发现插入word中的图片大 ...

  8. MMORGP大型游戏设计与开发(客户端架构 part13 of vegine)

    一些数据是需要不断改动的,程序不可能因为这些改动而不厌其烦的去改动代码,早期的这种做法就成了程序员们最悲哀的痛苦.自从有了数据管理后,程序的世界逐渐清晰,这些烦恼也不再出现,不过若是要很好的管理数据可 ...

  9. [The Basics of Hacking and Penetration Testing] Learn & Practice

    Remember to consturct your test environment. Kali Linux & Metasploitable2 & Windows XP

  10. ExcelHelper

    NPOI下载:http://pan.baidu.com/s/1JNAGm 最新封装类: 2016-03-14 1.添加对OleConn的读 private static string connstri ...