本文实例讲述了Zend Framework smarty用法。分享给大家供大家参考,具体如下:

一、Zend Framework简介

Zend Framework使用模型-视图-控制器(Model-View-Controller(MVC))结构。这个用来把你的程序分离成不同部分使得开发和维护变得容易。

运行Zend Framework需要:PHP 5.1.4 (或更高) 、Web 服务器支持 mod_rewrite功能,本实例采用Apache。 从这里http://framework.zend.com/download下载 Zend Framework,有两种格式.zip或者.tar.gz。

二、Zend Framework的配置

1、目录结构

虽然Zend Framework 没有强求使用一个标准的目录结构,但是还是有一些通用的目录结构。这个目录结构假设你完全控制Apache 的配置。(下面以本机做例子,各位需根据自己的情况进行更改,我的服务器的根目录指向的是Web文件夹)

引用:

Web/
test/
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/css

我们已经把程序中的模型、视图和控制器的文件分离到不同的子目录中。支持的图像,脚本和CSS 文件被存放在webroot 目录下的不同子目录中。下载的Zend Framework 文件放在 library 目录下。如果我们还需要其他库文件,都可以放在这里。在这个实例中,我们使用到了Smarty模版技术,所以Smarty 的库文件我们也应该放在library文件下!

2、启动文件

1) 配置.htaccess

我们使用单一的入口文件index.php来对我们的程序进行访问,这给我们提供了程序中所有页面的中心点并确保运行环境配置正确。我们用.htaccess 文件来实现这个目的,添加.htaccess 文件在test 的根目录中,内容如下:

RewriteEngine on
RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php

2)配置Apache
与此同时,我们还需要对apache进行一些设置,打开apache的配置文件 httpd.conf。

1、找到“#LoadModule rewrite_module modules/mod_rewrite.so 这句话,把前面的#去掉!

2、然后再找到“AllowOverride None 改成AllowOverride All,重新启动apache即可。

3、启动文件index.php
index.php放在test的根目录下,下面是index.php的内容::

<?php 
//打开错误提示
error_reporting(E_ALL|E_STRICT); 
//设定时区
date_default_timezone_set('Asia/Shanghai'); 
//指明引用文件的路径
set_include_path('.' .
PATH_SEPARATOR . './library/'.
PATH_SEPARATOR . './webapp/models/'.
PATH_SEPARATOR . get_include_path());
//必须手动加载Loader.php
include "Zend/Loader.php"; 
//自动加载类,使用时,直接实例化使用
function __autoload($class){
Zend_Loader::loadClass($class);
}
//getInstance()方法用来获取前端控制器实例
$frontController = Zend_Controller_Front::getInstance(); 
//设定前端路由器的工作目录
$frontController->setControllerDirectory(array("default"=>'./webapp/controllers')); 
//抛出异常
$frontController->throwExceptions(true); 
//设置基地址,方便以后url的跳转用户,.注意,区分大小写!
$frontController->setBaseUrl('/test'); 
//使用smarty模版需关闭本身的视图助手. 
$frontController->setParam('noViewRenderer', true); 
// 关闭错误提示,发生请求错误时候,转到ErrorController的errorAction控制器
//$frontController->throwExceptions(false);
//对。。进行注册
Zend_Registry::set('font', $frontController);
//------------配置Smarty模版 ----------------
include 'Smarty/Smarty.class.php'; 
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = './webapp/templates_c';
$views->cache_dir = './webapp/templates_c/cache_c';
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
} 
$views->register_block('dynamic','smarty_block_dynamic',false);
Zend_Registry::set('views', $views);
//开始运行程序
$frontController->dispatch(); 
?>

4)启动文件说明

Zend Framework 是这样设计的,所有的文件必须包含在 include_path 中。我们也把我们的模型目录包含在 include path 中,这样我们以后就能很容易加载我们的模型类。一开始,我们必须 include Zend/Loader.php,这样我们就能访问Zend_Loader 类,在Zend_Loader 类中有静态方法使我们能够加载其他Zend Framework 类,例如:

Zend_Loader::loadClass('Zend_Controller_Front');

Zend_Loader::loadClass 加载已经命名的类。它是把下划线转换成路径隔离符来实现的,并在最后加上.php 后缀。这样,类Zend_Controller_Front 将从Zend/Controller/font.php 加载。如果你在你的类库里使用相同的命名规则,就可以用Zend_Loader::loadCass()来加载它们。我们需要加载控制器类和路由类。

前端控制器用路由类来映射请求的 URL 到正确的 PHP 函数,然后显示页面。为了能使路由工作,需要解决 URL 的哪一部分是指向index.php 的路径,这样它就可以在那个点后面寻找url 元素。

我们需要配置前端路由器,这样它就知道从哪个目录里找出我们的控制器。

$frontController = Zend_Controller_Front::getInstance(); 
$frontController->setControllerDirectory('./application/controllers');

设置抛出异常,但是在服务器真正工作以后,我们不应该显示错误信息给用户看。

$frontController->throwExceptions(true);

由于在本实例中我们使用Smarty模版技术。所以我们关闭ZF本身自带的view。$frontController->setParam('noViewRenderer', true);设置基地址,方便以后设置url来进行跳转。$frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);接下来,我们对Smarty进行设置。首先我们在类库中引用了Smarty.class.php这个类。并且对它的路径进行了设置,以便让ZF知道它的位置。:

include 'Smarty/Smarty.class.php'; 
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = './webapp/templates_c';
$views->cache_dir = './webapp/templates_c/cache_c';
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
} 
$views->register_block('dynamic','smarty_block_dynamic',false);

在这里,我们用ZF的对象注册表(Registry)来对$view来进行存贮,这样,在程序的任何对方,我们都可以调用它来进行操作。Zend_Registry::set('views', $views);设置好了以后,运行程序。$frontController->dispatch();

这个时候,你如果运行http://127.0.0.1/test 来进行测试。会发现有个错误类似 Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in…这个是因为我们还没有设置好我们程序。

3、设置程序

在设置文件以前,理解Zend Framework 如何组织页面很重要。每个应用程序的页面叫做 action ,许多 action 组成控制器。例如,对于这样一个格式的 URL http://localhost/test/news/view/id/1 来说,控制器是news, action 是view,后面的id和1,分别是往这个actionView传递的参数和值。

Zend Framework 控制器把 index 作为一个缺省的action 而保留为特别的action。这样,对于http://localhost/test/news/ 这样的url,在news控制器里的 index action将被执行。Zend Framework 也保留了一个缺省的控制器,也叫做index。这样,http://localhost/test/ 将执行 index控制器下的 action index。

4、设置控制器

现在可以设置控制器了。在Zend Framework 里,控制器是一个必需被叫做{Controller name}Controller 的类。注意{Controller name}必需以大写字母开头。并且,这个类必须在叫做{Controller name}Controller.php这样的文件中,这个文件还必需在特定的控制器目录中。强调一下,{Controller name}必需以大写字母开头并其他字母一定是小写。每个action是在控制器类里的public 函数,名字必需是{action name}Action。在这里,{action name}应该以小写字母开头。这样在文件 test/webapp/controllers/IndexController.php 里我们的控制器类叫做 IndexController,位置:test/webapp/controllers/IndexController.php:

<?php 
class IndexController extends Zend_Controller_Action 
{ 
function init()
{
} 
function indexAction() 
{ 
} 
function addAction() 
{ 
} 
} 
?>

我们现在有三个我们想使用的action,直到我们设置好视图,它们才工作。其中function init是个特殊的函数,简单的说,它就是在controller中的构造函数时调用的函数。

每个action的 URL 如下:

http://localhost/test/ in IndexController::indexAction()
http://localhost/test/index/add in IndexController::addAction()

现在,我们在程序里有个能工作的路由器和每个页面的 action。

5、设置视图

因为本实例使用的的是Smarty模版,所以和ZF本身的View视图在实现过程中,稍微有点区别!下面我直接介绍在ZF里是任何使用Smarty的。在使用Smarty之前,我们应该先取出在index.php里定义的$view,并且定义好,需要在模版显示的变量。:

class IndexController extends Zend_Controller_Action 
{ 
var $views; /*模板对象*/
var $data; /*传递模版变量的对象*/
function init()
{
//拿回注册过的对象
$this->views = Zend_Registry::get('views'); 
} 
function indexAction() 
{ 
//定义模版显示的变量 
$data[`title′]=〞hello world〞;
//传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display('index/index.tpl'); 
} 
function addAction() 
{ 
} 
}

下面我们开始做视图文件,它们的位置是test/webapp/templates/index/index.tpl:

代码:

{$title}

这个时候,输入http://127.0.0.1/test看看。应该会出现“hello world 了。

这样,一个简单的实例就完成了。下面我们结合Xmlrpc技术来实现一个稍微复杂一点的实例!

三、XMLRPC

1、什么是XMLRPC

XMLRPC,顾名思义,就是应用了XML技术的RPC。那么什么是XML和RPC了?

RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算 ,是为了提高各个分立机器的“互操作性 而发明出来的技术。

XML和RPC一样也是一个东西的缩写,这个东西就是eXtensible Markup Language,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(<>)括来括去的那种语言,比如说HTML。XML的可扩展性也体现在它只定义了语言的格式,而并没有定义过多的关键字,也就是通常所说的标记(Tag),所以用户可以自由地选择定义标记。它的这种自由和简单的语法规则也使得它广为流传,用来表示各种数据。

2、在ZF中使用XMLRPC

1)创建IndexController.php

下面我们来完成一个实例,为了方便起见,就不建立新的Controller,把刚才我们建立的IndexController修改一下,就能使用了!另外我们还需要建立一个XMLRPC的服务端程序。位置在WEB服务器的根目录上(在本机中,也就是在test文件的上级目录中,取名为1.php),由于XMLRPC使用到了类库,我们还需要下载libphpxmlrpc放在library文件夹下!

文件位置:test/webapp/controller/IndexController.php:

class IndexController extends Zend_Controller_Action 
{
var $views; /*模板对象*/
var $data; /*传递模版变量的对象*/
public function init()
{
//拿回注册过的对象
$this->views = Zend_Registry::get('views'); 
$this->font = Zend_Registry::get('font'); 
//得到基地址 
$this->baseurl=$this->font->getBaseUrl();
}
function indexAction() 
{ 
@include "libphpxmlrpc/xmlrpc.inc";
@include "libphpxmlrpc/xmlrpcs.inc"; 
if (isset($_POST['var1']) && isset($_POST['var2'])) 
{ 
//创建客户端
$client = new xmlrpc_client('http://127.0.0.1/1.php');
//创建一个实例
@ $msg = new xmlrpcmsg("add", array(
new xmlrpcval($_POST['var1'], "int"),
new xmlrpcval($_POST['var2'], "int")));
//发送信息,
$response=$client->send($xmlrpc_message);,服务器返回xmlrpcresp的一个实例
$retval = $client->send($msg);
if ($retval->faultCode()) 
{
print_r("发生一个错误: "); 
print_r("原因: " . htmlspecialchars($retval->faultString())); 
} 
else 
{
//$retval->value()获取应答的xmlrpcval(也就是服务器端返回的结果),
$retval->value()->scalarval();得到描述应答结果的PHP变量
$sum = $retval->value()->scalarval();
}
}
@$data['var1']=$_POST['var1'];
@$data['var2']=$_POST['var2'];
@$data['sum']=$sum; 
@$data[`action′]= "$this->baseurl/index/"; 
//构造完整的url给模版 
$time=date("Y-m-d H:i:s")
@$data['url']="$this->baseurl/index/add/id/$sum/time/$time"; 
/传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display('index/index.tpl'); 
} 
function addAction() 
{ 
$data['title']="实验一下"; 
//得到传递的值 
$id=$this->_request->getParam("id");
$time=$this->_request->getParam("time"); 
$data['id']="$id";
$data['time']="$time";
$this->views->assign($data);
$this->views->display('index/add.tpl'); 
}
}

2)创建显示模版文件

位置:test/webapp/templates/index/index.tpl:

hello,下面演示的是利用Xmlrpc调用远程服务器方法的实例!并且我们把得到的结果传递到另外的一个函数中去!

代码:

{if $sum}
点一下看看!
{/if}

位置: test/webapp/templates/index/add.tpl:

现在是{$time}
{$title}你刚才传递的是 {$id}

3)创建XMLRPC服务器端程序

位置:web/1.php:

<?php
@include ("libphpxmlrpc/xmlrpc.inc");
@include ("libphpxmlrpc/xmlrpcs.inc");
if ($_SERVER['REQUEST_METHOD'] != 'POST')
{
exit(0);
}
$add_sig = array(array($xmlrpcString, $xmlrpcInt, $xmlrpcInt));
$add_doc = "Add the two integer together";
function add($params)
{
//引入用户错误代码值
global $xmlrpcerruser;
//返回一个PHP数组
$val = php_xmlrpc_decode($params);
$ret = $val[0]   $val[1];
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}
//创建一个xmlrpc_server的实例:
$server = new xmlrpc_server(array(
"add" => array(
"function" => "add",
"signature" => $add_sig,
"docstring" => $add_doc
)));
?>

OK,现在打开http;//127.0.0.1/test/看看。刚才建立的那个XMLRPC应该已经建立起来了,输入数字,测试一下吧!

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于zend framework框架的PHP程序设计有所帮助。

Zend Framework+smarty用法实例详解的更多相关文章

  1. ios – 黑客入侵MFMessageComposeViewController

    2)如何找出实际的messageSend方法及其实现的类?

  2. ios – 在设备上构建和运行时,仅将嵌入式框架与其他动态框架链接失败

    TL;博士将您的嵌入式框架与其他框架链接,并且不将其他框架与您的应用程序链接,导致Build&在设备上运行.描述:建立:我的设置非常简单(Swift2.3&XcodeXcode8.0;Build版本8S162m):>使用Carthage(0.17.2)我用xcodebuild8.0和TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3carthagebui

  3. ios – Xcode 7.1 PrototypeTools链接器错误(仅限模拟器)

    我正在尝试使用Xcode7.1在iOS模拟器中运行我的应用程序,但我收到链接器错误.这是错误:clang:错误:链接器命令失败,退出代码为1这似乎是一个新问题,因为我在升级到新的Xcode之前没有它.我在Google上搜索过,但是这个问题几乎没有相关主题.有趣的是,该应用程序在设备上运行良好.我已经尝试重置模拟器并再次清洁/建造,但两者都没有奏效.有没有其他人遇到过这个问题,你能提供什么建议吗?

  4. ios – iPhone崩溃日志不能正确地符号化并且是双重间隔的

    任何建议超过欢迎.谢谢.解决方法当这件事发生在我身上时,它只是我通过电子邮件收到的日志.如果我记得,至少有一些是在.msg文件中,我不得不把它们拿出来.它可能是Exchange编码更改.如果你显示不可见的字符,你可能会看到每个字符之间的东西.您可以找到并替换它们以删除它们或更改编辑器中的编码.

  5. 如何使用iOS上的BluetoothManager.framework私有API发送和接收数据

    这些天我正在开展一个项目,我们需要将非MFI蓝牙设备连接到iPhone,并且该设备不支持成为BLE外围设备客户端,因此我们必须在经典蓝牙上执行此操作.我设法使用BluetoothManager.framework与demoprojectBeeTee的指南配对并将设备连接到iPhone但我不知道如何发送和recv数据,我在类转储标头中找不到API.似乎答案在于这三个结构:BTAccessoryMan

  6. ios – 如何存档包含自定义框架的应用程序?

    我有一个我创建的xcode框架项目,我可以编译成一个myframework.framework文件.编译之后,我将这个框架拖到我应用程序的Frameworks项目文件夹中,然后利用框架中的类,将适当的import语句添加到需要它的任何类;这允许我的应用程序成功编译与在框架中定义的类的引用.要使应用程序成功部署到我的设备,我还将我的自定义框架添加到我的目标的“嵌入式二进制文件”部分.有了这一切,我可

  7. ios – Xcode无法找到strip-frameworks.sh目录

    谢谢!

  8. ios – Iphone / Ipad在缩放时崩溃

    i=hUb1GHJ6有没有人有什么可能出错的线索?解决方法我们正在做很多调试,我们终于找到了一个解决方案.我们有一个“跳过导航”链接,只有在您的键盘上按“标签”时才显示.这最初设置为“text-indent:-10000px”.这可能导致视口宽度超过10000像素,然后导致手机使用太多内存,然后最终崩溃.我们已经通过删除这个CSS规则来解决这个问题,所以blush.no不会崩溃那么多了.Iphone仍然有内存泄漏的问题,直到他们解决这个问题,网站有时会崩溃,但不会像以前那样接近.

  9. 在客户端获取iOS Universal Framework的版本号

    这可能不限于iOSUniversalFrameworks,而是所有xxx.framework文件.然而,我似乎找不到如何获取当前版本和客户端应用程序中构建框架的文档.在一个应用程序中,您可以使用以下内容:这将为您提供存储在应用程序的Info.plist中的当前信息.但是我们如何找到一个框架的信息.在我的情况下,具体是嵌入式框架.解决方法我发现苹果在Xcode6中支持的新的CocoaTouch框架为

  10. 在快速iOS应用程序中使用FBSDK的问题

    我正在使用FBSDK在swift中编写一个iOS8应用程序,以允许用户登录到我的应用程序.到目前为止,我已经使用Bridging-Header.h文件在swift中使用FBSDKv3.25成功实现了登录功能,并根据FB开发者网站上的说明更新了info.plist.现在我想制作一个应用程序到FBSDKv4.01,但是当我按照同样的过程将其集成到我的应用程序中时,我会收到以下错误:最明显的事情是最后一个错误,表示桥接头无法找到,但它是在同一个地方,因为当我使用FBSDK3.25?

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部