本文实例讲述了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的内容::
<"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(); "htmlcode">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:
<"htmlcode">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:
<"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 ))); "_blank" href="https://www.jb51.net/Special/546.htm">Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》希望本文所述对大家基于zend framework框架的PHP程序设计有所帮助。
华山资源网 Design By www.eoogi.com
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】