当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

第22章制作一个内容管理系统(CMS)

9/17/2020 9:34:15 PM 人评论

第22章制作一个内容管理系统(CMS)

第22章 制作一个内容管理系统(CMS)

在互联网高速发展的今天,网络信息以惊人的速度在高速增加。Web站点的信息量也是越来越多,比如文章、音乐、图片、视频等。如果说这么多的信息内容,没有一个系统化的管理工具,那么处理它将成为一个很麻烦的问题。随着这个问题的产生,现在已有很多优秀的内容管理系统提供多种解决方案。本章就来简单实现这样的一个CMS系统。

22.1 什么是CMS

内容管理系统(Content Management System,简称CMS),组织和协助共同合作的内容的结果,是指用于管理及方便数字内容的系统。

内容是任何类型的数字信息的结合体,可以是文本、图形图像、Web页面、业务文档、数据库表单、视频、声音、XML文件等。应该说,内容是一个比数据、文档和信息更广的概念,是对各种结构化数据、非结构化文档、信息的聚合。管理就是施加在“内容”对象上的一系列处理过程,包括收集、存储、审批、整理、定位、转换、分发、搜索、分析等,目的是为了使“内容”能够在正确的时间、以正确的形式传递到正确的地点和人。内容管理可以定义为:协助组织和个人,借助信息技术,实现内容的创建、存储、分享、应用、检索,并在企业个人、组织、业务、战略等诸多方面产生价值的过程。而内容管理系统就是能够支撑内容管理的一种工具或一套工具的软件系统。

内容管理系统的定义可以很狭窄,通常是指门户或商业网站的发布和管理系统;定义也可以很宽泛,个人网站系统也可归入其中。Wiki也是一种内容管理系统,Blog也算是一种内容管理系统。

现在流行的开源CMS系统有Joomla!、Drupal、Xoops等。

22.2 CMS的作用

目前的内容管理系统多如牛毛,不管是开源的,还是收费的,都有不少优秀的产品。但是在开发一些中小型网站的时候,使用一些当前流行的内容管理系统都不太顺利,发现它们都普遍存在着一些问题。

传统的内容管理系统除了基本的后台内容管理功能,通常包括了网站开发的功能。这样虽然降低了制作网站的技术门槛,让不懂程序的人也能制作出门户网站,但是很大程度上牺牲了网站前端的灵活性。在交互设计和用户体验越来越重要的今天,缺乏独立性的网站前端已经不能满足互联网应用日益多样化的需求。

另一方面强大的功能大大增加了系统的复杂性,不管是对网站管理者还是内容发布者来说,传统的内容管理系统学习成本都很高。

于是就想能不能自己开发一个轻量级的内容管理系统,解决上述的问题,满足中小型网站的外包开发需要?希望使用它能够达到这些目标。

  • 灵活独立:网站后台管理的开发与网站本身的开发完全分离,只是管理数据库里的数据,不关心数据如何在页面呈现,保持网站前端的独立性和灵活性。
  • 快速部署:一个中小型网站在开发完之后,使用这个内容管理系统能够在半天之内把后台管理部署出来。
  • 简单易用:即使对软件操作不太熟悉的用户都能顺利使用内容管理系统发布网站内容。
  • 扩展性强:开放的API接口,让后期开发人员能够容易地开发扩展功能,或者将服务器端程序扩展到其他平台,例如.NET或者Java。

22.3 需求分析

鉴于现在网站后台做的最多和最基本是对文章进行管理,这里就以内容管理系统中的文章管理为一个例子。当然这个文章系统鉴于篇幅的关系,所做的功能也没有很全面。但基本上要满足栏目的动态添加和删除,以及对栏目下文章进行管理的功能要求。还需要做到前台的视图和代码分离,便于以后多风格的前台界面更换。

对于以上提出的一些需求,使用前一个章节所介绍的框架就可以轻松实现。虽然这个框架只有一个文件,但重要的是思想。当然不是说这个框架如何好,而是希望读者明白掌握真正的原理和思想并能根据这个有自己的理解和创新。

22.4 相关策划

上一个小节的需求很简单,但是做这个需求的策划要烦琐得多。这个也和实际中相符合,通常提出需求的人只要求大体的功能要实现什么,而具体的那些细节他们一般不提(或者说他们也不清楚)。所以就需要策划来分析,到底对于这些需求需要做哪些功能,哪些需要注意等。如果还有不确定的因素还需要积极地和需求方沟通交流。

下面是对这个系统做的策划,采用图片和文字相结合的说明方式,这样更利于实现此功能的程序员理解和操作。其中图片是使用画图工具直接手工绘制的,如果要求高些或者可以用Photoshop之类的绘图软件来画。

22.4.1 后台策划

首先要实现的就是后台的管理,因为最常用到的是新闻的添加和删除,所以最先看到的是对新闻列表的管理,如图22.1所示。

015-01

图22.1 文章列表

由上图可以看到,这个是进入后台所看到的第一个界面也是新闻管理的界面。其中的列表是针对所有新闻的管理,在这个界面上可以很方便地找到相关的操作按钮。

之后要做的就是添加文章时的策划,如图22.2所示。

015-01

图22.2 文章表单

添加文章和修改文章的页面可以共用一个,主要包括3个属性:文章所属栏目、文章标题及文章内容。由图22.1可以看出还需要有文章的添加时间,这个可以在做程序时让其自动生成。

文章部分的大体策划已经完成,接下来是做系统栏目的规划。与文章一样,首先做的是列表的策划,如图22.3所示。

015-01

图22.3 栏目列表

栏目策划的列表显示与新闻列表大致相同,只是因为栏目本身的数量不多,所以省略掉了分页和搜索的功能。增加排序字段,用于在前台显示时栏目的前后位置摆放。

接下来是系统栏目的内容页,如图22.4所示。

015-01

图22.4 栏目表单

22.4.2 前台策划

那么到现在,后台的基本功能都已经策划完毕。接下来就剩下前台页面的显示,这里因为不是做网站所以要求也很简单,只要显示系统的栏目和新闻即可,如图22.5所示。

其他还应该包括栏目下的文章列表显示页面与单个文章的详细内容显示,因为都是差不多,这里就不一一列举出来。

015-01

图22.5 网站首页

22.5 系统架构

一般来说一个策划出来以后需要更改多次,最后确定终稿。然后再由美工人员把页面都设计完成。但是因为这里做的系统只是功能上的实现,这些步骤都省略了。

接下来就要讨论,这个系统运行的环境、数据存储的地方、数据结构等信息。

22.5.1 环境选择

这个系统的运行环境基本是PHP+MySQL的组合,同时满足Liunx和Windows的操作系统环境。因为PHP+MySQL配置相对来说比较复杂,期间也可能会发生很多问题,所以这里选择一个PHP的环境的安装包,只要安装这个包就同时安装了运行PHP的所有环境。选择的这个集成安装包的名字叫“XAMPP”,它的中文官方网址是http://www.apachefriends.org/zh_cn/index.html。可以根据操作系统的环境选择相应的软件包下载,安装也非常简单。

现在适用于Windows的最新版本是1.7.3,其中包含的组件如下所示。

  • Apache 2.2.14 (IPv6 enabled)+ OpenSSL 0.9.8l
  • MySQL 5.1.41 + PBXT engine
  • PHP 5.3.1
  • phpMyAdmin 3.2.4
  • Perl 5.10.1
  • FileZilla FTP Server 0.9.33
  • Mercury Mail Transport System 4.72

选择集成安装包的目的主要有两个,一个是方便快捷并能在多种系统下同样适用,第二个是因为它能进行很便捷相关的配置改动或者升级。

22.5.2 选择框架

那么现在已经有了PHP的运行环境,需要设定是否需要使用PHP的框架开发。单就这系统来讲,可用可不用,因为需要的实现功能不多,维护也比较容易。但是这里鉴于学习和了解的目的,采用上一个章节提供的框架思想来实现它。

22.5.3 数据结构设计

在数据库的设计上需要两个表一个是栏目表,如表22.1所示。

表22.1 栏目表

016-01

另外一个是文章表,如表22.2所示。

表22.2 文章表

016-01

以上两个数据表可以记录这个文章系统所需要的所有信息。另外需要说明的是,为了保持较好的兼容性,不管是在多语言的问题上还是和其他程序相结合,数据库和表的编码统一采用“UTF-8”编码。

注意 其中表名和字段名都统一为小写字母,并适当地加上易于区别的前缀。这个主要是因为现在的各种操作系统对大小写敏感的支持不同,所以统一使用小写便于在平台间的迁移。

22.5.4 目录结构

网站的目录统一用小写字母和数字,特别是不要使用中文。统一这个,是为了在不同的操作系统间有更好的兼容性。

总结常使用到的目录,初步构建的网站目录如图22.6所示。

015-01

图22.6 目录结构

其中,admin是后台管理目录,image是需要用到的图片目录,js是放置脚本的目录,include是需要引用的一些公共文件目录,template是模板目录。此目录结构是提前设计的,如在开发过程中有新的需求可以另行添加。

22.6 后台开发

后台开发主要分栏目功能开发和文字功能开发两部分。因为这两个有很多地方是相同的,所以本节会着重讲解文章功能开发的过程。

22.6.1 后台文件结构

当浏览器访问后台时,首先解析显示的是后台目录admin下的index.php文件。它是一个框架页面,包含了3个子页面,如代码22-1所示。

代码22-1 后台框架页

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>后台框架</title> 
</head> 
 
<frameset rows="80,*" cols="*" frameborder="yes" border="1" framespacing="0"> 
    <frame src="top.php" name="topFrame" scrolling="No" noresize="noresize" id="topFrame" title="topFrame" />     <!-- 顶部页面 --> 
    <frameset cols="180,*" frameborder="yes" border="1" framespacing="0"> 
        <frame src="menu.php" name="leftFrame" scrolling="No" noresize="noresize" id="leftFrame" title="leftFrame" />  <!-- 左边页面 --> 
        <frame src="article.php?act=list" name="mainFrame" id="mainFrame" title="mainFrame" /> 
       <!-- 主页面 --> 
    </frameset> 
</frameset> 
 
<noframes><body> 
</body></noframes> 
</html>

由以上代码可以看到这个页面其实本身没有什么内容,而是包含有3个子页面,分别为顶部的“top.php”页面、左边菜单页面“menu.php”和最初开始显示的“article.php?act=list”页面。为什么是最初开始显示的页面呢?因为在这个页面中的内容是可以随着左边菜单的选择而呈现出不同页面的。

Tips 在框架页面中,如果要替换其页面可以将相应的超级链接中的“target”属性赋值为需要在那个页面显示的“name”值。

顶部页面只是显示系统名字,这里就不再赘述。下面来看左边的“menu.php”菜单页面,如代码22-2所示。

代码22-2 菜单页面

<!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> 
</head> 
 
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
        <td>&nbsp;</td> 
    </tr> 
    <tr> 
        <td><a href="article.php?act=list" target="mainFrame">文章管理</a></td>  <!--  文章列表 --> 
    </tr> 
    <tr> 
        <td>&nbsp;</td> 
    </tr> 
    <tr> 
        <td><a href="category.php?act=list" target="mainFrame">栏目管理</a></td>  <!--  栏目列表 --> 
    </tr> 
    <tr> 
        <td>&nbsp;</td> 
    </tr> 
</table> 
</body> 
</html>

菜单页面也很简洁,这里主要讲解的是两个超级链接。它们都有自己的href链接地址,还有target属性。其中href地址是需要显示的网页地址,而target属性中的内容则表示在哪里显示。这个统一赋值为“mainFrame”,这样就表示当单击这个超级链接的时候,其中的href所示页面会在框架集中的名称为“mainFrame”的框架页中打开。

以上是后台的主要框架结构,实现了页面上的布局和菜单的基本切换等功能。接下来将具体来讲解栏目功能和文章功能的开发。

22.6.2 栏目功能开发

栏目功能开发主要有涉及到了个PHP页面,它们分别是category.php、category_form.php和category_list.php。其中category.php是有实现栏目功能的控制页面,主要实现的是控制器的作用。article_form.php和article_list.php分别是栏目信息和栏目列表页面,充当视图层的角色。首先来看下控制器做了哪些事情,其实现的内容如代码22-3所示。

代码22-3 栏目控制页面

<?php 
require_once('../include/init.php');                                       //引入初始文件 
 
if($_GET['act'] == 'list') {                                               //显示列表 
 
     $total_num = $db->get_col("SELECT COUNT(1) FROM {$prefix}category");  //取得栏目总数 
     $page_url = '?act=list';                                              //分页时需要调用的url地址 
     $page = intval(trim($_GET['page']));                                  //当前页数 
     $page = $page ? $page : 1;                                            //如果没有则为1 
     $page_size = 10;                                                      //每页10条记录 
     
     $rows = $db->get_all("SELECT * FROM {$prefix}category ORDER BY sort_order ASC LIMIT".($page-1)*$page_size.", {$page_size}");        //得到当前页所包含的数据 
     include('category_list.php');                                         //引入分页视图模板 
} elseif($_GET['act'] == 'edit') {                                         //编辑 
  
    $form_act = 'update';                                                  //表单动作改为update 
    $category=$db->get_one("SELECT*FROM{$prefix}categoryWHEREcat_id=?",array($_GET['cat_id']));                 //取得当前编辑的栏目 
    include('category_form.php');                                          //引入栏目信息视图模板 
  
} elseif($_GET['act'] == 'add') {                                          //添加 
  
    $form_act = 'insert';                                                  //表单动作改为insert 
    include('category_form.php');                                          //引入栏目信息视图模板 
  
} elseif($_GET['act'] == 'insert') {                                       //数据库插入 
  
    $_POST['add_time'] = date('Y-m-d H:i:s');                              //取得当前时间 
    $db->insert($prefix.'category', $_POST);                               //插入数据 
    sys_msg("添加栏目成功!", '?act=list');                                //系统提示插入数据成功 
  
} elseif($_GET['act'] == 'update') {                                       //数据库更新 
 
    $db->update($prefix.'category', $_POST, array('cat_id'=>$_POST['cat_id']));  
                                                                           //更新记录 
    //系统提示更新数据成功,并返回列表页   
    sys_msg("更新栏目成功!", '?act=list'); 
  
} elseif($_GET['act'] == 'del') {                                         //数据库删除操作 
 
    $db->delete($prefix.'category', 'cat_id', $_REQUEST['cat_id']);       //删除记录 
    sys_msg("删除栏目成功!", '?act=list');                               //系统提示删除数据成功 
  
} 
 
?>

如上代码中涉及到对数据库的添加、删除、修改、查询操作。相对于一般系统来说还是比较简洁易懂的。下面来讲解具体的程序执行流程。首先是每个对这个页面的请求都是需要包含有使用“get”方式提交的act参数,然后在此页面中对这个参数进行调节语句判断使之执行相应的操作。

重点需要说明的是当“act”的值为“list”时的操作。因为列表页还需要有分页的功能,所以这里特别多了一些变量需要赋值。见代码中第6~10行的注释,这些变量会在列表的模板页中被分页函数所调用。另外就是包含当前的页记录的数组变量$rows,此变量将会在实现列表数据时用到。那么在被它包含进来的模板页中就可以使用这些变量。

下面来看看模板页是如何实现的,如代码22-4所示。

代码22-4 栏目列表模板页

<!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> 
</head>
 
<body> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
        <td colspan="2">&nbsp;</td> 
    </tr> 
    <tr> 
        <td width="50%">&nbsp;</td> 
        <td width="50%" align="right"><a href="?act=add">添加栏目</a></td> 
    </tr> 
    <tr> 
        <td colspan="2">&nbsp;</td> 
    </tr> 
</table> 
<table width="100%" border="1" cellpadding="3"> 
    <tr> 
        <td width="10%" align="center">选择</td> 
        <td width="10%" align="center">编号</td> 
        <td width="50%" align="center">栏目名称</td> 
        <td width="18%" align="center">排序</td> 
        <td width="12%" align="center">操作</td> 
    </tr> 
    <?php foreach($rows as $row):?><!-- 循环记录 --> 
    <tr> 
        <td align="center"><input type="checkbox" name="cat_id[]" value="<?= $row['cat_id']?>"/ ></td> 
        <td align="center"><?= $row['cat_id']?></td> 
        <td align="center"><?= $row['cat_name']?></td> 
        <td align="center"><?= $row['sort_order']?></td> 
        <td align="center"><a href="?act=edit&cat_id=<?= $row['cat_id']?>">编辑</a> | <a href="?act= 
del&cat_id=<?= $row['cat_id']?>">删除</a></td> 
    </tr> 
    <?php endforeach;?><!-- 循环记录结束 --> 
</table> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
        <td>&nbsp;</td> 
        <td align="right"><?= pager($page, $page_size, $total_num, $page_url)?><!-- 分页函数显示分
页 --></td> 
    </tr> 
    <tr> 
        <td><input type="button" name="button" id="button" value="删除" /></td> 
        <td>&nbsp;</td> 
    </tr> 
</table> 
</body> 
</html>

此模板实现的代码主要包括两块,第一块是对$rows数组记录的循环显示,直接使用原生PHP的循环语句foreach。另外就是使用pager()函数输出分页内容,此函数是在另外的functions.php文件中定义,已在引入init.php文件时引入。如此栏目列表即可正常显示,效果如图22.7所示。

015-01

图22.7 栏目列表页面

22.6.3 文章功能开发

文章功能开发主要也有涉及到3个PHP页面,它们分别是article.php、article_form.php和article_list.php。其中article.php是有实现文章功能的控制页面,主要实现的是控制器的作用。article_form.php和article_list.php分别是文章信息和文章列表页面,充当视图层的角色。首先来看看文章的控制器做了哪些事情,其实现的内容如代码22-5所示。

代码22-5 文章控制页面

<?php 
require_once('../include/init.php');                                 //引入初始文件 
//提取栏目 
$categories = $db->get_a ll("SELECT * FROM {$prefix}category ORDER BY sort_order ASC");   
 
if($_GET['act'] == 'list') {                                         //显示文章列表 
 
    $total_num = $db->get_col("SELECT COUNT(1) FROM {$prefix}article");//取得文章总数 
    $page_url = '?act=list';                                         //分页时需要调用的url地址 
    $page = intval(trim($_GET['page']));                             //当前页数 
    $page = $page ? $page : 1;                                       //如果没有则为1 
    $page_size = 10;                                                 //每页10条记录 
     
    //得到当前页所包含的数据 
    $rows = $db->get_all("SELECT * FROM {$prefix}article AS A LEFT JOIN {$prefix}category AS B 
ON A.cat_id = B.cat_id ORDER BY A.add_time DESC LIMIT ".($page-1)*$page_size.", {$page_size}"); 
    include('article_list.php');                                    //引入分页视图模板 
 
} elseif($_GET['act'] == 'search') {                                //查询 
  
    $title = $_REQUEST['title'];                                    //取得查询的标题 
   
    $total_num = $db->get_col("SELECT COUNT(1) FROM {$prefix}article WHERE title like ?", array("%{$title}%"));             //取得符合标题的文章总数 
    $page_url = '?act=search&title='.$title;                        //分页时需要调用的url地址 
    $page = intval(trim($_GET['page']));                            //当前页数 
    $page = $page ? $page : 1;                                      //如果没有则为1 
    $page_size = 10;                                                //每页10条记录 
    $rows = $db->get_all("SELECT * FROM {$prefix}article AS A LEFT JOIN {$prefix}category AS B ON A.cat_id = B.cat_id WHERE A.title like ? ORDER BY A.add_time DESC", array("%{$title}%")); 
    include('article_list.php');                                    //引入分页视图模板 
  
} elseif($_GET['act'] == 'add') {                                   //添加 
  
    $form_act = 'insert';                                           //表单动作改为insert 
    include('article_form.php');                                    //引入文章信息视图模板 
} elseif($_GET['act'] == 'insert') {                                //数据库插入 
  
    $_POST['add_time'] = date('Y-m-d H:i:s');                       //取得当前时间 
    $db->insert($prefix.'article', $_POST);                         //插入数据 
    sys_msg("添加文章成功!", '?act=list');                         //系统提示插入数据成功 
  
} elseif($_GET['act'] == 'edit') {                                  //编辑 
  
    $form_act = 'update';                                           //表单动作改为update 
    $article = $db->get_one("SELECT * FROM {$prefix}article WHERE id = ?", array($_GET['id'])); 
    include('article_form.php');                                    //引入文章信息视图模板 
 
} elseif($_GET['act'] == 'update') {                                //数据库更新 
 
    $db->update($prefix.'article', $_POST, array('id'=>$_POST['id']));//更新记录 
        //系统提示更新数据成功,并返回列表页 
    sys_msg("更新文章成功!", '?act=list'); 
   
} elseif($_GET['act'] == 'del') {                                    //数据库删除操作 
    $db->delete($prefix.'article', 'id', $_REQUEST['id']);           //删除记录 
    sys_msg("删除文章成功!", '?act=list');                          //系统提示删除数据成功 
  
} 
 
?>

以上代码实现的功能与代码22-1基本相同,只不过这里多了一个搜索的功能处理。因为此功能在代码实现上和列出表格数据是差不多的,所以本小节对这块就不再赘述。重点来讲解如何添加一则文章。

在添加文章时,首先会收到这样的请求“article.php?act=add”,这时代码将会将“form_act”设置为“insert”,并引入文章信息视图模板。此时网页显示的就是一个添加文章的页面,如图22.8所示。

015-01

图22.8 文章添加页面

但是它所包含的form表单的action属性则变成为“article.php?act=insert”。所以当输入数据并单击“提交”按钮的时候,便会执行代码22-5中第38~40行的代码段。第38行代码如下:

$_POST['add_time'] = date('Y-m-d H:i:s');

取得当前的时间值并赋值于超全局变量POST数组中。然后执行第39行的代码,如下:

$db->insert($prefix.'article', $_POST);

此代码使用的是前一章节中介绍的数据库类,在这里使用的是它的insert方法。当传入需要被插入的表格名称与数据时,便会自动生成相应的SQL语句插入数据。这里为了方便直接使用POST组数作为输入数据,这样虽然是可行的,但是也存在一定弊端。因为POST中的数据有可能为伪造,所以在实践应用中需要对这个数据进行检测。

插入数据成功后,便会执行第40行语句来提示插入成功的信息,单击“确定”按钮后会回到列表页面。这样整个的添加文章过程就完成了,其他的编辑、删除等操作也是类似的。

22.7 前台实现

既然后台的功能都已经实现了,那么本小节的主要内容就来讲解如何实现前台显示。这里以实现首页的为例子,其他的页面就可举一反三。

首先来看一下首页的控制页面,如代码22-6所示。

代码22-6 首页控制器代码

<?php 
require_once('include/init.php');                       //引入初始文件 
//取得栏目数据 
$categories = $db->get_all("SELECT * FROM {$prefix}category ORDER BY sort_order ASC");   
function get_articles($cat_id) {                        //取得特定栏目下的文章数据 
    global $db, $prefix; 
    $articles = $db->get_all("SELECT * FROM {$prefix}article WHERE cat_id = ? ORDER BY add_time 
DESC LIMIT 10", array($cat_id)); 
    return $articles; 
} 
include_once("template/{$template_dir}/index.php");     //引入首页模板文件 
?>

由以上代码可以看出,首先是引入必要的文件init.php,其中包括了数据库的定义还有模板路径等内容。然后就是通过数据库对象取得网站的栏目数据并保存到变量$categories,这样就能在模板中调用。另外的get_articles()函数,接受一个栏目标识后会返回这个栏目下的文章数据并限制在10条记录内。最后就是通过include_once()函数将模板文件引入即可。

那么接下来就看看在模板文件中是如何显示数据的,如代码22-7所示。

代码22-7 首页模板文件

<!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>简单CMS首页</title> 
</head> 
 
<body> 
<table border="1" cellpadding="3" width="800"> 
    <tr> 
     <?php foreach($categories as $cat):?><!-- 栏目循环 --> 
        <td width="80"><?= $cat['cat_name']?></td> 
        <?php endforeach;?> 
    </tr> 
</table> 
<?php foreach($categories as $cat):?><!-- 栏目循环 --> 
<div style="float:left; width:380px; margin-right:40px; margin-top:10px;"> 
    <table width="100%" border="1" cellpadding="3"> 
     <tr><th><?= $cat['cat_name']?></th></tr> 
            <?php foreach(get_articles($cat['cat_id']) as $art):?><!-- 文章循环 --> 
        <tr>             
            <td width="80"><?= $art['title']?></td>             
        </tr> 
            <?php endforeach;?> 
    </table>   
</div> 
<?php endforeach;?> 
 
</body> 
</html>

代码第11~13行是对网站栏目的循环并显示。在第16~27行代码中有两个循环,第一个是对栏目的循环,第二个是针对该栏目下的文章循环显示,然后是对其中的标题内容进行显示。整个过程在这里就基本完成,下面是通过浏览器访问首页得到的效果,如图22.9所示。

015-01

图22.9 简单CMS首页

22.8 小结

本章主要介绍的是如何使用已有的框架制作一个内容管理系统,讲解了什么是CMS、为什么CMS、开发前的需求分析、相关策划、系统架构及前后台的开发。

现在,本书讲解的PHP入门的相关知识已基本结束,然而作为应用程序开发者,您的旅程也许才刚刚开始。在本书中,尽量让读者对设计和编写应用程序时所采取的方法有了一个大概印象。

22.9 习题

1. 谈谈你对这个简单CMS系统的看法。

2. 在这个系统上进一步完善或添加你想要的功能。

相关教程

共有条评论 网友评论

验证码: 看不清楚?