浅议PHP程序开发中的模板选择

 更新时间:2016年11月25日 17:35  点击:1418

关于PHP的模板的确是一个说起来轻易做起来麻烦的事情。随便一数大概有20种以上的选择,光pear里面就包含了5中不同的模板,实在让人头疼。

千万不要人云亦云的说这个好那个不好,选择模板之前最好先应该搞清楚模板的真正目的是什么? 简单地说,模板的核心目的就是一个 team work。主要的作用方式有两种:

1、分离HTML和PHP使网页设计师和PHP程序员合作更加愉快。

2、分离显示逻辑和事物逻辑,使得核心事务逻辑的变更和应用程序的扩展更加轻易和灵活,也就是说使得程序员之间合作更加愉快。(这一点经常被人们忽视或者误解,总以为把PHP从HTML中弄出去就叫分离显示逻辑和事物逻辑了,假如这样当初又何苦让PHP和html 混在一起呢?)

搞清楚这个模板的真正目的是什么,就轻易做出正确的选择了。

假如只有你一个php程序员但是需要和其他的网页设计人员一起协同工作,那么选择能够分离HTML和PHP的模板就可以了,phplib (现在似乎集成到 Pear 里面了 http://pear.php.net/package/HTML_Template_PHPLIB)或者

FastTemplate 都是这样的东西,很简单轻易上手。

假如你的网站界面比较丑陋并且主要由程序员来完成,但是功能比较复杂更需要强大的扩展功能,需要分离各个层次包括显示逻辑,那么不要用什么非凡的东西,PHP本身就是最好的模板了。要注重的是在这种情况下,你要非常认真的设计你的程序,始终记住要分离的不是PHP和 html 而是事务逻辑(business logic )和显示逻辑(presentation logic)。这也是为什么我一直对于Smarty 这种东西非常的抵触, 因为这个 Smarty 的语法太复杂了太强大了, 几乎重新发明了一种脚本语言东西, (即使是PHP的程序员也要重新学习它)。更让人费解的是 这种脚本 越是强大,越轻易让人将事务逻辑(business logic )和显示逻辑(presentation logic)混在一起, 破坏了模板的初衷。

假如你既想HTML和PHP分离,得到更好的视觉设计,又想整个系统有非常强大的扩展能力能够适应html,xml,wml各种界面,而且不用去学习复杂的语法的同时提供较高的运行效率,那么这就是一个相当有挑战性的问题了。坏消息是目前还没有一个成熟的模板真正能够达到这样的要求,好消息是完成这样的一个模板并不是很难,假如你尝试过Zope或者是ColdFusion就会发现这种模板的影子,

(wact http://wact.sourceforge.net/ 和 phptal http://phptal.sourceforge.net/ 就是在向这个方向发展,应该很有前途)。

模板和数据的结合(模板的调用)方式主要有两种:推的方式和拉的方式。

推的方式是用PHP将数据推给模板,就是说需要程序员明确地为模板中的每一个变量赋值,将他们绑起来。

而拉的方式则像把php 和 html 混在一起一样,模板种的变量主动把数据拽进来。

说到模板就不能不提到另外两种东西:

phphtmllib 和 quickform(http://pear.php.net/package/HTML_QuickForm) 这两种东西是用传统的方式来通过各种页面构件来完成HTML的页面的 整个页面的构造完全把握再程序员手里,也许很多编写过传统GUI桌面程序的程序员更喜欢这种方式。

更加漂亮的方案

假如做商业软件的话,Flash应该是更漂亮的方案(别搞错了,别以为就你知道php支持ming 和swf库可以动态生成 Flash,我说的不是这个。) 我要说的是支持Flash Remoting 的方案,这种东西才是真正有意义的PHP和flash的结合。由视觉设计师完成flash部分,PHP 程序员通过 flash remoting 的方式将 数据发送到 flash 做成的客户端中。

目前有两种方案:

AMFPHP

http://www.amfphp.org/

由于Macromedia Flash Remoting 传输数据时 使用的是一种特有的更加高效数据格式, 所以AMFPHP通过分析数据格式,在服务器端构造了相应的php类来接收,解析和编码这些数据从而达到交换信息的功能(就像Samba一样,应该属于一种 Hacking 吧)。

PHPObject

http://ghostwire.com/resources/phpobject/

PHPObject 则采用了另外一种方法,通过在flash中嵌入一些actionscript的组件通过开放的格式soap来传送数据。


//退出登录
function popLogout()
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}
$this->sendCommand("QUIT");
$this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
return true;
}

//获取是否在线
function getIsOnline()
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}
$this->sendCommand("NOOP");
$this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
return true;
}

//获取邮件数量和字节数(返回数组)
function getMailSum($intReturnType=2)
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}
$this->sendCommand("STAT");
$strLineResponse = $this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
if ($intReturnType==1)
{
return $this->strResponse;
}
else
{
$arrResponse = explode(" ", $this->strResponse);
if (!is_array($arrResponse) || count($arrResponse)<=0)
{
$this->setMessage('STAT command response message is error', 2006);
return false;
}
return array($arrResponse[1], $arrResponse[2]);
}
}

//获取指定邮件得Session Id
function getMailSessId($intMailId, $intReturnType=2)
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}

模板能够改善网站的结构。本文阐述如何通过PHP 4的一个新功能和模板类,在由大量静态HTML页面构成的网站中巧妙地运用模板控制页面布局。

提纲:
===================================

分离功能和布局


避免页面元素重复


静态网站的模板框架

===================================
分离功能和布局

   首先我们来看看应用模板的两个主要目的:

分离功能(PHP)和布局(HTML)


避免页面元素重复

   第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP脚本,同时另一组设计人员设计HTML和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含PHP代码的文件,无需关心页面的外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面的PHP代码。
   假如你曾经看过几个关于PHP模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。这种网站可以拥有如下模板文件:

<!-- main.htm -->
<html>
<head><title>模板示例</title></head>
<body>
<table><tr><td>{HEADER}</td></tr>
<tr><td>{LEFTNAV}</td><td>{CONTENT}</td></tr>
</table>
</body></html>

<!-- header.htm -->
<img src="sitelogo.jpg">

<!-- leftnav.htm -->
<br><a href="foo">Foo</a>
<br><a href="bar">Bar</a>
   可以看出页面如何由这些模板构造而成:main模板控制着整个页面的布局;header模板和leftnav模板控制着页面的公共元素。花括号“{}”里面的标识符是内容占位符。使用模板最主要的好处在于界面设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布局。界面设计者可以用任何普通HTML编辑器或者可视化工具编辑这些页面,因为这些文件都只包含HTML代码,没有任何PHP代码。
  PHP代码全部保存到单独的文件中,这个文件也就是由页面URL实际调用的文件。Web服务器通过PHP引擎解析该文件,然后把结果返回给浏览器。一般地,PHP代码总是动态地生成页面内容,比如查询数据库或者执行某种计算等。下面是一个例子:


<?php
// example.php
require('class.FastTemplate.php');
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav' => 'leftnav.htm' ) );

// 此处的PHP代码设置$content使其包含合适的页面内容

方法一:

<?php
$GoTo="index.php";// 假如这里的目标链接取自数据库就实现了动态转向
header(sprintf("Location: %s", $GoTo));
?>

方法二:

<?php echo "<script>window.location ="$PHP_SELF";</script>";?>


方法三:

<?php echo "<META HTTP-EQUIV="Refresh" CONTENT="0;URL=index.php">";?>

笔者前段接了一个项目,其中包含了一个用户注册系统,用到了密码找回功能,简单整理一下,写点心得。

首先,我们假定你已经有了一个用户注册系统。其中用户表可能如下:

create table member(
id int unsigned not null auto_incremtnt,
username………………
passwords char(32) not null,
email varchar(100) not null,
……………………………..
);

现在讨论的焦点不是数据库设计,我们主要谈密码找回。

我们可以选择的密码找回方案可能有以下几种:
1. 用户预设找回密码问题,并且提供找回密码答案。
2. 用户通过email 找回密码
..........................

第一种方案或许是个很好的解决方案,但我们这次并不选择此方案,其中的种种原因,也不在本讨论之内。我们用第二种方案作为本次的主要讨论对象。

那么我们开始吧。

第二种方案的其中好处是:
1. 注册用户必须提供正确的邮箱,否则将不能使用系统所提供的密码重设功能。
2. 必须由该用户通过邮箱确认。
这可能对企业来说,是件好事。企业总是费劲心思的想得到用户真实的具体信息,以便进行有针对性的邮件列表服务。这也是这次开发用户要求这样做的一个主要原因。

我们可能会在login界面提供一个链接,或者在login失败后提供一个链接。链接名当然你可以自己定义了,我定义的是:忘了密码,需要找回吗?

当用户点击找加密码时,我们会提供一个input表单。让用户输入用户名(假如是login失败后,我们可以用session填充表单内容)。用户点击提交后,我们开始我们的密码重设功能流程。

我们可能会创建这样一个文件 send_reset_pass_mail.php。这个文件主要负责产生一个通过GET方法传递的字符串,并且将其发送出去。

代码可能如下:
PHP代码:
<?php
/**
* 我们假设你已经在config.inc.php文件里配置好了你的sql信息,mail信息
*/
require_once('config.inc.php');

/**
* 你需要一下sendmail类来进行邮件发送,我们也假设你已经配置好,并且能正发送邮件
*/
require_once('sendMail.inc.php');

/**
* 首先我们执行查询,得到此用户的相关信息
* 你不要告诉我你不知道$_POST['username']是怎么得到的,假如是这样,我郁闷一下你。
* 我使用了adodb的类,并且已经在配置文件中声明过
*/
$username = trim($_POST['username']);

$sql = "select email,passwords from member where username = '".trim($_POST['username'])."'";
$userInfo = $db->FetchRow($sql);

$user_pass = $userInfo['passwords'];
$user_email = $userInfo['email'];

/**
* OK,一些需要的东西我们都有了,看来得进行下步操作了
* 现在让我们产生一个经过md5加密码过的字符串,先不要问为什么,等会再告诉你
*/

$x = md5($username.' '.$passwords);
//现在我们可以发送邮件给用户了。当然,我们还得需要另一个密码重设程序 resetUserPass.php
$String = base64_encode($username.".".$x);

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • 深入解析WordPress中加载模板的get_template_part函数

    这篇文章主要介绍了WordPress中加载模板的get_template_part函数,其中重点讲解了其函数钩子的使用,需要的朋友可以参考下...2016-01-14
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
  • mysql配置模板(my-*.cnf)参数详细说明

    mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 微信小程序实现点击导航条切换页面

    这篇文章主要为大家详细介绍了微信小程序实现点击导航条切换页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-19
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 微信小程序实现canvas分享朋友圈海报

    这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29