`

Smarty实例教程之三:----实例篇( 使用PHP内置MYSQL函数)

阅读更多

从本节开始我们来学习一下如果把Smarty应用到实际的例子中. 为了演示说明,我将以前写的一个站点作为实例来讲来下.先说明一下, 我本人的美术功底不是很强,所以设计出来的页面不太好看,大家就对付着看吧
在看本文之前,可以先看看indexbak.htm与newsbak.htm,它们是我们生成后的例图。

一、 首先来说明一下我们将要使用到的数据库,下面我先将数据库源文件给大家例出来:

代码:

<?php

CREATE DATABASE News
;

USE
News;

/****************************
*
* 表 名: tb_news_ch
* 用 途: 国内新闻表
*
****************************/
CREATE TABLE tb_news_ch
(
iNewsID interger(11) primary key auto_increment,
vcNewsTitle varchar(50) not null,
ltNewsContent longtext not null
);


/****************************
*
* 表 名: tb_news_in
* 用 途: 国际新闻表
*
****************************/
CREATE TABLE tb_news_in
(
iNewsID interger(11) primary key auto_increment,
vcNewsTitle varchar(50) not null,
ltNewsContent longtext not null
);


/****************************
*
* 表 名: tb_news_mu
* 用 途: 娱乐新闻表
*
****************************/

CREATE TABLE tb_news_mu
(
iNewsID interger(11) primary key auto_increment,
vcNewsTitle varchar(50) not null,
ltNewsContent longtext not null
);


?>


我这里简单的将数据库说明一下.

第一个问题:
大家可以看到,其实3个数据表的字段名都一样,那么为什么不把它们合并成一个数据表呢,答案很简单:效率,在开发的时候我们可能感觉不出有什么可提高效率的地方,不过大家想想,当这个网站运行一段时间后,它的新闻数据量就会变的很大,而且考虑到如果将来网站做大后可能将各个类型分离出来形成类似 china.xxx.com, international.xxx.com, music.xxx.com,将每一栏目独立分出去物理上做成一个单独的站点,到那时如果新闻还是合起来放置的话就会造成数据库瓶颈,所以针对当前的站点,我认为还是分开的比较合理.

第二个问题:
有人可能问了,你在字段前加的i, vc,lt干什么用?这里是按照字段类型来命名的, 这也是一种良好风格的体现,将类型前缀放在变量前,使用用户不用看字段定义就可以知道字段是什么类型,这是从微软的匈牙利命名法中参考过来的,在数据库设计时,我先将每种类型定义成1--3个字母,然后在每个字段前加相应的代码来代表它的类型.像上边,我将各个数据库字段类型定义为:

integer i
varchar vc
longtext lt
char c
....

在使用的时候,你可以往每个数据表中输入5条数据记录以备我们在调试实例时使用.

二、示例站点目录结构:

代码:

<?php

--------------------------------------------------------------------------------
+
Web (站点根目录)
|
|----+
comm (Smarty相关文档目录)
| |
| |----+
plugins (Smarty插件目录)
| |-----
Config_File.class.php (Smarty配置文件)
| |-----
Smarty.class.php (Smarty类主文件)
| |-----
Smarty_Compiler.class.php (Smarty编译类文件)
|
|----+
cache (Smarty缓存目录,*nix下保证读写权限)
|
|----+
templates (站点模板文件存放目录)
| |
| |----
header.tpl(页面页头模板文件)
| |----
index.tpl(站点首页模板文件)
| |----
foot.tpl(页面页脚模板文件)
| |----
news.tpl (新闻页模板文件)
|
|
|----+
templates_c (模板文件编译后存放目录,*nix下保证读写权限)
|
|----+
css (站点CSS文件目录)
|
|----+
image (站点图片目录)
|
|----+
media (站点Flash动画存放目录)
|
|----
indexbak.htm (首页原始效果图)
|
|----
newsbak,htm (新闻页原始效果图)
|
|----
index.php (Smarty首页程序文件)
|
|----
news.php (Smarty新闻显示文件)
|
|----
例程说明.txt (目录说明)
|
|----
数据库建立文件.txt (数据库的建立文档)

?>



详细情况请大家下载实例后对照结构图。

--------------------------------------------------------------------------------

三、模板中的实例片段:

1. index.tpl:

index.tpl是站点首页的模板类,打开它的源文件后我们可以首先看到这么二句:
==================================================
1. <{*下面这一句为本页面的页面头*}>
2. <{include file="header.tpl"}>
==================================================
第 1 句大家都知道了,是模板注释
第 2 句表示在当前位置要包含另一个文件,什么文件呢,header.tpl,这里的这个header.tpl是页面的标准页头文件,把它单独拿出来是为将这一部分独立出来,以便在在其它页面进行重用,习惯上要把页头文件写在一个table中,但因为我的实例是早已做好的,所以有些不符合规范。

再来看最后一句:
=================================================
3. <{include file="foot.tpl"}>
=================================================
不用说大家都明白了,就是包含一个页脚文件。

再看看国内新闻部分的模板代码:

代码:

<?php

<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#B9E9FF">
<
tr>
<
td height="115" width="10"></td>
<
td valign="top" width="295" bgcolor="#B9E9FF">
<{
section name=loop loop=$News_CH}>
<
li class="newsfont"><a href="news.php?type=1&id=<{$News_CH[loop].NewsID}>" class="newsfont"><{$News_CH[loop].NewsTitle}></a>
<{/
section}>
</
td>
</
tr>
</
table>

?>



大家关键看<{section}>与<{/section}>,它们之外的那一部分是为了更好的理解代码的意思而列出来的。能看明白吗?这里将以前讲过的内容复习一遍:定义了一个section循环模板块,名字叫loop, 要循环的是$News_CH这个数组,以<a href="xxxx">处将为当前的新闻产生一个链接,地址为news.php?type=1&id=xxx,这里的xxx是从数据库里提取的iNewsID,指的是要在新闻显示页里显示编号为id的新闻。$News_CH[loop].NewsTitle这种表示形式来看的懂吧?看不懂的话看看上一节讲过的《Smarty实例教学 ---程序设计》部分中的<{section}>语法。
也许大家对<{}>感觉有点陌生,这里的<{}>为模板语句定义块,在前2节我们都使用{},但因为这里是具体的应用,所以就不取{}了,使用大家习惯的<{}>来表示,当然这在.php文件中要设置的。

再看国际新闻与娱乐新闻的代码:


国际新闻:

代码:

<?php

<table width="100%" border="0" cellpadding="0" cellspacing="0">
<
tr>
<
td width="295" height="115" valign="top">
<{
section name=loop loop=$News_IN}>
<
li class="newsfont"><a href="news.php?type=2&id=<{$News_IN[loop].NewsID}>" class="newsfont"><{$News_IN[loop].NewsTitle}></a>
<{/
section}>
</
td>
</
tr>
</
table>

?>



娱乐新闻:

代码:

<?php

<table width="100%" border="0" cellpadding="0" cellspacing="0">
<
tr>
<
td width="296" height="115" valign="top">
<{
section name=loop loop=$News_MU}>
<
li class="newsfont"><a href="news.php?type=3&id=<{$News_MU[loop].NewsID}>" class="newsfont"><{$News_MU[loop].NewsTitle}></a>
<{/
section}>
</
td>
</
tr>
</
table>

?>



有没有看出有什么不同? loop部分不同,loop指的是要循环的数组,这里要注意的,不可将多个section的loop指定为同一个值,那样的话Smarty进行分析模板的时候就会将两个具有相同名字的section同时分析,生成两个一样的记录。

看到这里,有人就会产生疑问:循环块我已经有了,我怎么才能就它在当前位置只显示我们想要的记录数呢?这个问题简单,我们对Smarty的section循环块的循环次数控制是在.php文件中控制要替换这个循环块的数组来决定的,在设计模板时我们不用考虑。


其次,我们再来看看news.tpl:

1. 看这一句:
<title><{$NewsTitle}> ----天骄信息网</title>
将要显示的新闻页的标题显示为新闻标题 + "----天骄信息网"
2. 新闻标题:
<div align="center" class="NewsTitle"><{$NewsTitle}></div>
这里又设置了一个模板变量$NewsTitle,意思说要.php将$NewsTitle(包括标题栏)替换为数据库中当前新闻的标题。
3. 新闻内容:
<p><{$NewsContext}></p>
这一句也容易,在当前位置显示新闻内容。

当然,这里只是简单的将新闻列出来了,在实际应用时你还可以把文章出处,发表时间,作者,相关新闻一起列出来,这里就不作多的讨论了.


三、程序部分:

1. 大家先来看看index.php的源文件,然后我们再来慢慢分析它的作用:

index.php
代码:



<?php
1.
/*********************************************
*
* 文件名: index.php
* 作 用: 显示实例程序
*
* 作 者: 大师兄
* Email: teacherli@163.com

* 修 正: forest
*********************************************/
2. include_once("./comm/Smarty.class.php"); //包含smarty类文件
3. define("NUM", 5); //定义每次显示的新闻条数

4. $smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates_dir = "./templates"; //设置模板目录
$smarty->compile_dir = "./templates_c"; //设置编译目录
$smarty->cache_dir = "./cache"; //设置缓存目录
$smarty->cache_lifetime = 60 * 60 * 24; //设置缓存时间
$smarty->caching = false; //这里是调试时设为false,发布时请使用true
$smarty->left_delimiter = "<{"; //设置左边界符
$smarty->right_delimiter = "}>"; //设置右边界符


5. $db = mysql_connect("localhost", "root", "");
mysql_select_db("News", $db);


//这里将处理国内新闻部分
6. $strQuery = "SELECT iNewsID, vcNewsTitle FROM tb_news_ch ORDER BY iNewsID DESC";
$result = mysql_query($strQuery);
$i = NUM;
7. while(($row = mysql_fetch_array($result)) && $i > 0)
{
$array[] = array("NewsID"=>substr($row["iNewsID"], 0, 40),
"NewsTitle"=>substr($row["vcNewsTitle"], 0, 40));

$i--;
}
8. $smarty->assign("News_CH", $array);
9. unset($array);
mysql_free_result();


10. //这里处理国际新闻部分
$strQuery = "SELECT iNewsID, vcNewsTitle FROM tb_news_in ORDER BY iNewsID DESC";
$result = mysql_query($strQuery);
$i = NUM;
while((
$row = mysql_fetch_array($result)) && $i > 0)
{
$array[] = array("NewsID"=>substr($row["iNewsID"], 0, 40),
"NewsTitle"=>substr($row["vcNewsTitle"], 0, 40));

$i--;
}
$smarty->assign("News_IN", $array);
unset(
$array);
mysql_free_result();


11. //这里将处理娱乐新闻部分
$strQuery = "SELECT iNewsID, vcNewsTitle FROM tb_news_mu ORDER BY iNewsID DESC";
$result = mysql_query($strQuery);
$i = NUM;
while((
$row = mysql_fetch_array($result)) && $i > 0)
{
$array[] = array("NewsID"=>substr($row["iNewsID"], 0, 40),
"NewsTitle"=>substr($row["vcNewsTitle"], 0, 40));

$i--;
}
$smarty->assign("News_MU", $array);
unset(
$array);
mysql_free_result();


mysql_close($db);

//编译并显示位于./templates下的index.tpl模板
12. $smarty->display("index.tpl");
?>



为了方便说明,我把每一个要说明的地方都标了号,下面就来说说每一个部分的作用:

1. 程序注释, 风格问题,我多次在程序中加这个就是为了让读者也养成这种习惯.
2. 文件包含. 这一句意思是把Smarty的类文件包含到当前程序文件中.
3. 常数定义: 定义NUM为5,为新闻显示条数
4. 设置Smarty参数: 关于里边的参数大家可以参考上一节讲过的,这里只想特别说明一下$smarty->cache属性,在我们的程序调试过程中,要把它设置为false,正式发布的时候将它设计为true就可以实现我们的程序缓存效果.
5. 数据库连接: 这一部分我不用说吧?标准的PHP语句.
6. 进行国内新闻查找SQL语句: 标准的SQL语句,按新题编号降序排序.
7. while():
这一句控制将要显示的新闻行数.首先给$i赋值为NUM,NUM为我们在开始外定义的一个常量, 在while()的开始判断处使用$i>0 这个条件,while()每次循环时要将$i的值减1,这样,当它完成5次循环时while就会结束.
这里我们主要来看看$array[]这个数组:
$array[]在理论上为一个二维数组,也就是一个数组中的元素为另一个数组,像上例中,当while()语句结束时,$array就是一个包含5个数组元素的数组,而每一元素又是一个字符索引的数组.而这些字符索引正是在模板中定义section循环块的$news[loop]的属性值,大家一定要注意这里要与模板循环块的属性值相对应,否则将不能显示出来!
在构建这个二维数组时我们使用了一个substr()方法进行字符截取,这个方法在这里仅供参考,实际使用当中因为中文为全角字符,使用它时可能会造成乱码,在以后的例子中我们将使用另一个网友与的csubstr()函数来实现字符截取功能.

8. 对模板中的loop = $News_CH的section循环块进行解析.
大家要注意,使用$smarty->assign("News_CH", $array),assign的第一个参数为section中的loop的值, 第二个参数为上面所建立的数组.

9. 注销$array: $array[]在使用完后要注销,因为使用赋值语句对$array进行赋值时不会将它清空,而是将新数组作为它的一个元素增加,为了不产生副作用,这里使用unset()是必需的.

10. 国际新闻处理模块:
同国内新闻处理模块一样,大家可以对比一下模板与这一段,找找其中有什么关联之处.

11. 娱乐新闻处理模块:同上,大家找找其中的关系.相信大家看完会有收获的.

12. 处理并显示index.tpl.


2. 下面再来看看news.php的源文件:

news.php
代码:



<?php
/*********************************************
*
* 文件名: news.php
* 作 用: 新闻显示程序
*
* 作 者: 大师兄
* Email: teacherli@163.com

* 修 正: forest
*********************************************/
include_once("./comm/Smarty.class.php"); //包含smarty类文件
define("NUM", 5); //定义每次显示的新闻条数

$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates_dir = "./templates"; //设置模板目录
$smarty->compile_dir = "./templates_c"; //设置编译目录
$smarty->cache_dir = "./cache"; //设置缓存目录
$smarty->cache_lifetime = 60 * 60 * 24; //设置缓存时间
$smarty->caching = false; //这里是调试时设为false,发布时请使用true
$smarty->left_delimiter = "<{"; //设置左边界符
$smarty->right_delimiter = "}>"; //设置右边界符


$db = mysql_connect("localhost", "root", "") or die("数据库连接错误!");
mysql_select_db("News", $db);

$NewsID = $_GET["id"]; //获取新闻编号
$NewsType = $_GET["type"]; //要显示的新闻类型
switch($NewsType)
{
case
1:
$dbName = "tb_news_ch";
break;
case
2:
$dbName = "tb_news_in";
break;
case
3:
$dbName = "tb_news_mu";
break;
}

$strQuery = "SELECT vcNewsTitle, ltNewsContent FROM $dbName";
$result = mysql_query($strQuery) or die("数据库查询错误!");
if(
$row = mysql_fetch_array($result))
{
$smarty->assign("NewsTitle", $row["vcNewsTitle"]);
$smarty->assign("NewsContent", $row["ltNewsContent"]);

mysql_free_result($result);
$smarty->display("news.tpl");
}

mysql_close($db);

?>


这上面关于Smarty的程序语句主要只有3行:
代码:

<?php


$smarty
->assign("NewsTitle", $row["vcNewsTitle"]);
$smarty->assign("NewsContent", $row["ltNewsContent"]);

mysql_free_result($result);

?>



很简单的将新闻页中的NewsTitle, NewsContent替换成从数据库中查找出来的内容.

好了,关于这一讲的Smarty例程学习的初级部分就讲到这里,相信大家学完后会对Smarty的用法有个基本的了解,下一节还使用个这个例子来讲讲如何使用phplib中的DB类来实现对模板的控制.
分享到:
评论

相关推荐

    PHP100视频教程全集112集BT种子【PHP经典】

    PHP100视频教程29:PHP模板引擎Smarty内置函数 PHP100视频教程30:PHP模板引擎Smarty缓存应用 PHP100视频教程31:PHP在线编辑器fckeditor应用 PHP100视频教程32:PHP5中Cookie与 Session详解 PHP100视频教程33:...

    smarty简易教程

    smarty简易教程,入门级,整个教程分四大部分: 一、模板设计部分 二、程序设计部分 三、实例篇(使用PHP内置MySQL函数) 四、实例篇(使用phplib的DB类)

    php课程(共100多节)

    29:PHP模板引擎Smarty内置函数 30:PHP模板引擎Smarty缓存应用 31:PHP在线编辑器fckeditor应用 32:PHP5中Cookie与 Session详解 33:PHP5中图片验证码的制作(上) 34:PHP5中图片中文验证码(下) 35:PHP5文字...

    (全)传智播客PHP就业班视频完整课程

    10-19 7 smarty实例应用2 10-19 8 smarty实例应用3 10-20 1 smarty应用 更换网站皮肤 10-20 2 smarty应用 更换网站皮肤2 10-20 3 smarty应用 更换网站皮肤3 10-20 4 smarty应用 更换网站皮肤4 10-20 5 smarty二级...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    10-19 8 smarty实例应用3 10-20 1 smarty应用 更换网站皮肤 10-20 2 smarty应用 更换网站皮肤2 10-20 3 smarty应用 更换网站皮肤3 10-20 4 smarty应用 更换网站皮肤4 10-20 5 smarty二级联动 10-20 6 smarty完成静态...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    10-19 8 smarty实例应用3 10-20 1 smarty应用 更换网站皮肤 10-20 2 smarty应用 更换网站皮肤2 10-20 3 smarty应用 更换网站皮肤3 10-20 4 smarty应用 更换网站皮肤4 10-20 5 smarty二级联动 10-20 6 smarty完成静态...

    史上最全传智播客PHP就业班视频课,8月份视频

    10-19 8 smarty实例应用3 10-20 1 smarty应用 更换网站皮肤 10-20 2 smarty应用 更换网站皮肤2 10-20 3 smarty应用 更换网站皮肤3 10-20 4 smarty应用 更换网站皮肤4 10-20 5 smarty二级联动 10-20 6 smarty完成静态...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    10-19 7 smarty实例应用2 10-19 8 smarty实例应用3 10-20 1 smarty应用 更换网站皮肤 10-20 2 smarty应用 更换网站皮肤2 10-20 3 smarty应用 更换网站皮肤3 10-20 4 smarty应用 更换网站皮肤4 10-20 5 smarty二级...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP+MySQL动态网站开发

    理论部分包括PHP技术概述和基本语法、字符串和正则表达式、数组和函数、文件和目录操作、PHP的异常处理机制、XML文件操作、Session和Cookie会话管理、Smarty模板引擎、Ajax技术和MySQL数据库。实战部分包括在线投票...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    Smarty模板使用教学

    第一步 模板设计部分 第二步 程序设计部分 第三步 实例篇( 使用PHP内置MYSQL函数) 第四步 实例篇(使用phplib的DB类)

    PHP入门到精通

    第1篇 基础知识 1.初识PHP(教学录像:23分42秒) 1.1PHP概述 1.2扩展库 1.3前期准备工作 1.4网站建设的基本流程 1.5PHP的学习资源 1.6如何学好PHP 2.PHP环境搭建和开发工具(教学录像:36分3秒) 2.1PHP开发环境和...

    PHP入门到精通02

    第1篇 基础知识 1.初识PHP(教学录像:23分42秒) 1.1PHP概述 1.2扩展库 1.3前期准备工作 1.4网站建设的基本流程 1.5PHP的学习资源 1.6如何学好PHP 2.PHP环境搭建和开发工具(教学录像:36分3秒) 2.1PHP开发环境和...

    PHP从入门到精通第二版

    包括初识PHP、PHP环境搭建和开发工具、PHP语言基础、流程控制语句、字符串...PHP操作MySQL数据库、ADODB类库、Zend Framework框架、Smarty模板技术、PHP与XML技术、PHP与Ajax技术、应用Smarty模板开发电子商务网站等...

    Y.PHP 1.1.0.rar

    Y.PHP是一个微核心、轻量级的PHP框架,核心文件仅有Y.php/Model.php/Action.php三个文件(不到20k),目前实现的功能有: 1.控制器、模型、助手的自动加载; 2.连接mysql,实现SQL助手(非ORM,查询时需要写sql语句...

    学通PHP的24堂课

    主要包括php概述、php基础、php函数、php流程控制语句、php数组应用、php与web页面交互、mysql数据库技术、php数据库编程技术、cookie与会话控制、字符串高级处理技术、日期和时间的处理技术、图形图像处理技术、...

    PHP框架Gaeaphp.zip

    [$option=array()]]) 获取db实例Core::memcached([$key='default',[$servers=array(),[$options=array()]]]) 获取memcached实例项目函数库一些项目的全局函数位于/src/libs/functions/global.php,该文件会被自动加载...

    php网络开发完全手册

    3.2.7 使用函数进行数据类型的强制 3.2.7 转换 57 3.3 小结 57 第4章 函数处理与数据引用 58 4.1 函数的定义与使用 58 4.1.1 函数的调用 58 4.1.2 用户自定义函数的编写 58 4.2 PHP常用函数 59 4.2.1 获得日期时间...

    PHP网络编程技术与实践 源码

    8.2.5 其他Session函数使用说明 8.3 本章小结 第9章 使用PHP生成静态页面 9.1 为什么要生成静态页面 9.2 静态技术介绍和使用 9.3 常见的模板技术模块 9.3.1 SMARTY模板技术 9.3.2 PHPLib模板技术 9.3.3 FastTemplate...

Global site tag (gtag.js) - Google Analytics