创造世界上最简单的 PHP 开发模式(2)

2016-02-19 16:49 5 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享创造世界上最简单的 PHP 开发模式(2)教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - Web开发 】

  七:文章列表察看页面实现和模板处理(万里长征的最后一步)

  先来看看页面list1的实现,在list1里面分页用了一个page.js文件,这个文件是自己给自己写的一个js分页的函数,挺好用的

  

---------------page.js---------------//--------共 20 条记录,当前 86/99 页 [1]... [82] [83] [84] [85] [86] [87] [88] [89] [90] ...[99] GO-------------------//recordCount = 20;//show = 20//pageShow = 11;//pageCount = 100;//pageNow = 86;//pageStr = "?page=_page_";//document.write(showListPage(recordCount, show, pageCount, pageNow, pageStr));function showListPage(recordCount, show, pageShow, pageCount, pageNow, pageStr){  if(pageCount1) pageCount =0;  if(pageNow1) pageNow = 0;  str = '共 B'+recordCount+'/B 条记录,当前 B'+pageNow+'/'+pageCount+'/B 页 ';if(pageCount=pageShow){      startHave = false;      endHave = false;      startNum = 1;      endNum = pageCount;    } else if(pageNow-1 = pageShow/2){      startHave = false;      endHave = true;      startNum = 1;      endNum = pageShow-1;    } else if(pageCount-pageNow = pageShow/2){      startHave = true;      endHave = false;      startNum = pageCount - pageShow + 2;      endNum = pageCount;    } else {      startHave = true;      endHave = true;      startNum = pageNow - Math.floor((pageShow-2)/2);      endNum = startNum + pageShow - 3;    }if(startHave){    startStr = " [A href='"+pageStr.replace("_page_",1)+"'1/A]... ";    str += startStr;  }for(i=startNum; i=endNum; i++){    if(pageNow==i)    str += "[" + i + "]";    else    str += " [A href='" + pageStr.replace("_page_",i) + "'" + i + "/A] ";  }if(endHave){      endStr = " ...[A href='" + pageStr.replace("_page_",pageCount) + "'" + pageCount + "/A] ";      str += endStr;    }    return str;}

  

--------------list1.htm----------------a href="new.php"添加新文章/ahrtabletrthphp开发文章/th/tr!-- BEGIN phplist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END phplist --/table!-- BEGIN phplist_page --script src="page.js" language="javascript"/scriptscript language="javascript"recordCount = {recordCount}; //总记录数show = {pageSize}; //每页显示的记录数量pageShow = 10; //每页显示的分页连接数量pageCount = {pageCount}; //总页数pageNow = {page}; //当前页数pageStr = "?page=_page_"; //页面连接document.write(showListPage(recordCount, show, pageShow, pageCount, pageNow, pageStr));/script!-- END phplist_page --hrtable ID="Table1"trthphp开发热点文章/th/tr!-- BEGIN phphotlist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END phphotlist --/tablehrtable ID="Table2"trthasp开发最新文章/th/tr!-- BEGIN aspnewlist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END aspnewlist --/table

  

--------------list1.php----------------?phprequire_once "config.inc.php";dbConnect();$data = array();$data[phplist] = getArticleList(1, "id DESC", (int)$_GET[page], 5);$data[phphotlist] = getArticleList(1, "clicks DESC, id DESC", 1, 3);$data[aspnewlist] = getArticleList(2, "id DESC", 1, 3);dbDisconnect();renderTpl('list1.htm', $data);?

本文示例代码或素材下载

  运行的效果怎么样,是不是实现了要求的功能呢。现在我们再做一下改动,在里面加上asp开发热点文章列表,实现代码如下

  

--------------list1.htm----------------a href="new.php"添加新文章/ahrtabletrthphp开发文章/th/tr!-- BEGIN phplist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END phplist --/table!-- BEGIN phplist_page --script src="page.js" language="javascript"/scriptscript language="javascript"recordCount = {recordCount}; //总记录数show = {pageSize}; //每页显示的记录数量pageShow = 10; //每页显示的分页连接数量pageCount = {pageCount}; //总页数pageNow = {page}; //当前页数pageStr = "?page=_page_"; //页面连接document.write(showListPage(recordCount, show, pageShow, pageCount, pageNow, pageStr));/script!-- END phplist_page --hrtable ID="Table1"trthphp开发热点文章/th/tr!-- BEGIN phphotlist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END phphotlist --/tablehrtable ID="Table2"trthasp开发最新文章/th/tr!-- BEGIN aspnewlist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END aspnewlist --/tabletable ID="Table3"trthasp热点文章/th/tr!-- BEGIN asphotlist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END asphotlist --/table

  

--------------list1.php----------------?phprequire_once "config.inc.php";dbConnect();$data = array();$data[phplist] = getArticleList(1, "id DESC", (int)$_GET[page], 5);$data[phphotlist] = getArticleList(1, "clicks DESC, id DESC", 1, 3);$data[aspnewlist] = getArticleList(2, "id DESC", 1, 3);$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);dbDisconnect();renderTpl('list1.htm', $data);?

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  仔细观察一下前后的区别,list1.php里面只是简单的加入了一行的代码,就实现这个改动,感觉怎么样啊?是不是超级简单。

  其实这种设计模式的好处还不只是这点:

  1、可以把程序的核心代码隔离开管理,便于以后程序的管理维护

  2、对于程序的可扩展性也很好,假设list1.php中要加入产品列表,我是不是也可以这么做呢?把对产品的管理也写成统一的数据库操作接口,然后简单的修改模板文件加入产品列表部分,最后在list1.php中加入一行函数调用的代码,就可以实现。

  3、代码复用,如果您是做中小型企业网站的,那这么做对您的好处是最大的,因为这种类型的网站的设计结构几乎是一样的,您可能只需要更改一下模板的样式,就可以赚到钞票了。

  这么看来这种模式是不是给您带来了很多的好处呢?

  

-----------lsit2.htm---------------a href="new.php"添加新文章/ahrtable ID="Table1"trthasp开发文章/th/tr!-- BEGIN asplist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END asplist --/table!-- BEGIN asplist_page --script src="page.js" language="javascript"/scriptscript language="javascript"recordCount = {recordCount}; //总记录数show = {pageSize}; //每页显示的记录数量pageShow = 10; //每页显示的分页连接数量pageCount = {pageCount}; //总页数pageNow = {page}; //当前页数pageStr = "?page=_page_"; //页面连接document.write(showListPage(recordCount, show, pageShow, pageCount, pageNow, pageStr));/script!-- END asplist_page --hrtable ID="Table4"trthasp热点文章/th/tr!-- BEGIN asphotlist --trtd{id}--a href="view.php?id={id}"{title}/a/td/tr!-- END asphotlist --/table

本文示例代码或素材下载

  

-----------lsit2.php---------------?phprequire_once "config.inc.php";dbConnect();$data = array();$data[asplist] = getArticleList(2, "id DESC", (int)$_GET[page], 5);$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);dbDisconnect();renderTpl('list2.htm', $data);?

  

--------view.htm--------------!-- BEGIN content --编号:{id}br标题:{title}br内容:{content}!-- END content --

  

--------view.php------------------?phprequire_once "config.inc.php";dbConnect();$data = array();$data[content] = getArticle((int)$_GET[id]);dbDisconnect();renderTpl('view.htm', $data);?

  八:文章添加实现和模板处理(万里长征的再来一步)

  

---------------new.htm-----------form action="add.php" method="post"标题:input type="text" size="20"br内容:textarea cols="50" rows="4"/textareabr    input type="submit" value="提交"/form

  

---------------new.php------------?phprequire_once "config.inc.php";renderTpl('new.htm', array());?

  

---------------CoreUtil.php--------------?phpfunction doPostVar(&$data){  $keys = array_keys($data);  foreach($keys as $key){    $data[$key] = addslashes(htmlspecialchars(trim($data[$key])));    if($data[$key]==null) $data[$key] = "$key default";  }}?

  

---------------add.htm------------!-- BEGIN success --{content}!-- END success --

  

---------------add.php------------?phprequire_once "config.inc.php";dbConnect();$data = action();doPostVar($data);addArticle($data);$result[success][content] = "文章添加成功";dbDisconnect();renderTpl('add.htm', $result);function action(){    $data = array();    $data[title] = $_POST[title];    $data[content] = $_POST[content];    $data[datetime] = date('Y-m-d H:i:s');    $data[pid] = 1;    return $data;}?

  这样一个最最简单的文章的发布系统就完成了,不知道对您有什么收获没有。

  九、总结

  程序写完了,大家来总结一下吧,看看实现过程,应该可以说是简单明了吧。

  1、统一实现数据库访问接口。更改后台数据库结构的时候,只要简单的修改相应的接口函数,其他部分的php代码根本就不用理会。

  2、整个系统php代码和html代码分开管理,php代码前台实现起来也很简单,你也应该已经可以发现了,基本上是在10行代码左右。

  3、可以任意的扩充功能。用函数对新的功能进行包装后,在具体的前台的查询显示页面中只有加入对相应的函数的简单的调用就可以了,一行代码就搞定了。

  4、代码复用。通过对功能的包装,减少了大量的不必要的重复代码工作,效率应该是提高了很多吧?

  5、可以移植性。如果将来做其他的网站,要是遇到了和这个项目相同的实现功能,你可以怎么做呢?把这里的函数和数据库结构copy过去,修改一下新项目的模板,是不是就可一完成这个新的项目了呢?根本就不用考虑修改php代码。

  6、结构代码清晰。别人可以轻易的和你共同开发一个项目,代码冲突也会减少至最低。

  当然实际工作中遇到的情况可能比这个例子复杂的多,但是再复杂的任务都是可以拆分的。

  十、后言

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  不知道大家有没有学过jsp和servlet这样的东西,他们有很多优秀的设计思路,值得我们去研究和copy(说句实在话,有时间的都应该去接触一下java,不是为了学习这门语言而学习,是要学习他的设计模式和优秀的功能实现方式)。jsp至少有两样东西对我们很有用,action和filter。

本文示例代码或素材下载

  action是主要是处理一些事件逻辑,就像add.php中我们定义的action()函数一样,用来验证和获取表单提交上来的数据。当然这样写的代码量和你以前方法的代码量是一样的,好像没有什么区别,但是它实现了代码的分离,结构是不是比你以前的方法清晰很多呢?

  filter是一个过滤功能,用来过滤和重新定向网络的访问,对一些非法的请求和错误的请求进行重新的定向。让我们来通过一个后台管理的程序来看看他具体的作用。

  将下面的这个函数copy到你的CoreUtil.php里面,这个函数是一个后台管理登陆的过滤函数,一个是不在本地缓存web页面的函数:

  

function windowNoCache($cache){  if(!$cache || headers_sent()) return ;  header('Expires: '.date('D,d M Y H:i:s',mktime(0,0,0,1,1,2000)).' GMT');  header('Last-Modified:'.gmdate('D,d M Y H:i:s').' GMT');  header('Cache-control: private, no-cache,must-revalidate');  header('Pragma: no-cache');}function isAdminLogin(){  if($_SESSION[relogin]=="ok") return;  if($_SESSION[adminuser]!=SYS_ADMIN_NAME){    $_SESSION[relogin] = "ok";    die("script language="javascript" top.location='adminlogin.php'; /script");  }  $_SESSION[relogin] = "no";}

  然后在 根目录 底下加上如下的文件

  

------------adminconfig.inc.php------------?phpdefine('SYS_ADMIN_NAME', 'hello'); //后台管理登陆名define('SYS_ADMIN_PASSWORD', 'hello'); //后台管理登陆密码include 'config.inc.php';windowNoCache(true);isAdminLogin();?

  

------------adminindex.php----------------?phprequire_once "adminconfig.inc.php";renderTpl('adminindex.htm', array());?

  

------------adminlogin.php------------------?phpinclude "adminconfig.inc.php";if($_POST[name]==SYS_ADMIN_NAME && $_POST[code]==SYS_ADMIN_PASSWORD){    $_SESSION[adminuser] = SYS_ADMIN_NAME;    header("location: adminindex.php");}else{    renderTpl('adminlogin.htm', array());}?

  在 smart/template 目录下面加上如下的文件

  

------------adminlogin.htm------------------form name="form1" method="post" action=""input type="text" name="name" size="20" value=""input type="password" name="code" size="20" value=""input type="submit" name="Submit" value=" 登 陆 "/form

  

------------adminindex.htm----------------h2您好欢迎登陆后台管理/h2

  现在访问adminindex.php看看会发生什么事情,然后用adminconfig.inc.php里面设定的用户名密码登陆。这种功能在web的很多地方都可以派上用场,应该是一个好的方法吧。其他的后台访问的页面只要也都加载了adminconfig.inc.php ,就不用再考虑后台访问权限的问题了。

  十一 附录

  简单的隐藏文件的扩展名,搞晕浏览者,让他不知道你是用什么语言编的程序。

  就以list1.php为例子吧,

  1、我们修改list1.php的名称为list1.tmp

  2、进入命令行窗口(dos窗口),在web的目录下面建立一个文件,文件名是.htaccess。

  3、编辑.htaccess文件,输入以下的内容

  AddType application/x-httpd-php .tmp

  通过浏览器访问list1.tmp,看看是不是ok了。

本文示例代码或素材下载

来源:https://www.tulaoshi.com/n/20160219/1613196.html

延伸阅读
现在大部分的人都把自己的时间以及精力放在了工作上面,熬夜加班的现象是非常的普遍的事情,长时间的劳作只是很多人经常出现体力不支的现象,其实那是因为我们的肾工作负荷太大的原因造成的,那您知道世界上最廉价的护肾零有哪些吗?您知道男性补肾护肾最好的方法是什么吗?今天三九图老师小编就为您介绍一下有关不花钱的养肾方法的知识,感...
标签: 汽车
1、法拉利500   1954年款的法拉利500 Mondial Spider Series I出自设计大师宾尼法利纳之手,该车采用了直列4缸发动机,其拥有190马力的最大输出功率,匹配了4速手动变速箱。法拉利500 Mondial Spider Series I采用前轮独立悬挂系统以及四轮鼓式刹车系统,销售估价275万美元。 2、法拉利250  于1953年巴黎车...
标签: 养生 健康
第一名,桑椹酒:桑椹酒属新型纯天然食品,采用绿色环保、全果控温发酵技术精酿而成的高品质饮料、果酒。现代研究证实,其营养价值远远高于葡萄酒,对于人类心脏及免疫系统的治疗及保护有10大作用的微量元素硒含量高于葡萄酒的12tulaoshi.com.41倍,蛋白质为葡萄酒的8.44倍,赖氨酸是葡萄酒的9.23倍,抗氧化物质等也远远高于葡萄酒。具有养...
标签: 孩子
帮助孩子直面挫折 在超市里,4岁的亮亮看到自己爱吃的糖果,要求妈妈买,妈妈不同意,亮亮便纠缠不休,但妈妈的态度很坚决。当亮亮意识到今天他无论如何也得不到糖果了,他气急败坏起来,转身从货架上抓了两个桔子,狠狠地摔到了地上。看到亮亮的行为,妈妈很是震惊。但事实上,亮亮并不另类,很多孩子都会这么做。孩子为何频频受挫?⊙3、4...
标签: 办公软件
在民间有很多年画、对联上印着一个大字“招财进宝”,这个“字”不仅好看而且很有意义(如图1)。但自己手工写出的这个“字”,总是让人恶心三天,于是想起了常用的文字处理工具——Word 2003。 1、在机器中安装上“方正行楷繁体”字体(从网上下载下该字体,解压后直接复制粘贴到“系统”所在盘中的WINDOWS文件夹下的Fonts文件夹中就可以了...

经验教程

546

收藏

26
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部