首頁  >  文章  >  php教程  >  Zend Framework+smarty用法實例詳解

Zend Framework+smarty用法實例詳解

高洛峰
高洛峰原創
2016-12-26 16:01:331110瀏覽

本文實例講述了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 
/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(&#39;Asia/Shanghai&#39;);
//指明引用文件的路径
set_include_path(&#39;.&#39; .
PATH_SEPARATOR . &#39;./library/&#39;.
PATH_SEPARATOR . &#39;./webapp/models/&#39;.
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"=>&#39;./webapp/controllers&#39;));
//抛出异常
$frontController->throwExceptions(true);
//设置基地址,方便以后url的跳转用户,.注意,区分大小写!
$frontController->setBaseUrl(&#39;/test&#39;);
//使用smarty模版需关闭本身的视图助手.
$frontController->setParam(&#39;noViewRenderer&#39;, true);
// 关闭错误提示,发生请求错误时候,转到ErrorController的errorAction控制器
//$frontController->throwExceptions(false);
//对。。进行注册
Zend_Registry::set(&#39;font&#39;, $frontController);
//------------配置Smarty模版 ----------------
include &#39;Smarty/Smarty.class.php&#39;;
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = &#39;./webapp/templates_c&#39;;
$views->cache_dir = &#39;./webapp/templates_c/cache_c&#39;;
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block(&#39;dynamic&#39;,&#39;smarty_block_dynamic&#39;,false);
Zend_Registry::set(&#39;views&#39;, $views);
//开始运行程序
$frontController->dispatch();
?>

   

4)啟動檔案說明

Zend Framework 是這樣設計的,所有的檔案必須包含在include_path 中。我們也把我們的模型目錄包含在 include path 中,這樣我們以後就能輕鬆載入我們的模型類別。一開始,我們必須include Zend/Loader.php,這樣我們就能訪問Zend_Loader 類,在Zend_Loader 類中有靜態方法使我們能夠加載其他Zend Framework 類,例如:

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;);

   

已經命名的類別。它是把下劃線轉換成路徑隔離符來實現的,並在最後加上.php 後綴。這樣,類別Zend_Controller_Front 將從Zend/Controller/font.php 載入。如果你在你的類別庫裡使用相同的命名規則,你可以用Zend_Loader::loadCass()來載入它們。我們需要載入控制器類別和路由類別。

前端控制器以路由類別來對應請求的 URL 到正確的 PHP 函數,然後顯示頁面。為了能讓路由運作,需要解決 URL 的哪一部分是指向index.php 的路徑,這樣它就可以在那點後面尋找url 元素。

我們需要設定前端路由器,這樣它就知道從哪個目錄找出我們的控制器。

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

   

設定拋出異常,但是在伺服器真正工作以後,我們不應該顯示錯誤訊息給使用者看。

 
$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 &#39;Smarty/Smarty.class.php&#39;;
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = &#39;./webapp/templates_c&#39;;
$views->cache_dir = &#39;./webapp/templates_c/cache_c&#39;;
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block(&#39;dynamic&#39;,&#39;smarty_block_dynamic&#39;,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(&#39;views&#39;);
}
function indexAction()
{
//定义模版显示的变量
$data[`title′]=〞hello world〞;
//传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display(&#39;index/index.tpl&#39;);
}
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,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(a8093152e673feb7aba1828c43532094)括来括去的那种语言,比如说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(&#39;views&#39;);
$this->font = Zend_Registry::get(&#39;font&#39;);
//得到基地址
$this->baseurl=$this->font->getBaseUrl();
}
function indexAction()
{
@include "libphpxmlrpc/xmlrpc.inc";
@include "libphpxmlrpc/xmlrpcs.inc";
if (isset($_POST[&#39;var1&#39;]) && isset($_POST[&#39;var2&#39;]))
{
//创建客户端
$client = new xmlrpc_client(&#39;http://127.0.0.1/1.php&#39;);
//创建一个实例
@ $msg = new xmlrpcmsg("add", array(
new xmlrpcval($_POST[&#39;var1&#39;], "int"),
new xmlrpcval($_POST[&#39;var2&#39;], "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[&#39;var1&#39;]=$_POST[&#39;var1&#39;];
@$data[&#39;var2&#39;]=$_POST[&#39;var2&#39;];
@$data[&#39;sum&#39;]=$sum;
@$data[`action′]= "$this->baseurl/index/";
//构造完整的url给模版
$time=date("Y-m-d H:i:s")
@$data[&#39;url&#39;]="$this->baseurl/index/add/id/$sum/time/$time";
/传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display(&#39;index/index.tpl&#39;);
}
function addAction()
{
$data[&#39;title&#39;]="实验一下";
//得到传递的值
$id=$this->_request->getParam("id");
$time=$this->_request->getParam("time");
$data[&#39;id&#39;]="$id";
$data[&#39;time&#39;]="$time";
$this->views->assign($data);
$this->views->display(&#39;index/add.tpl&#39;);
}
}

   

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[&#39;REQUEST_METHOD&#39;] != &#39;POST&#39;)
{
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 framework框架的PHP程序设计有所帮助。

更多Zend Framework+smarty用法實例詳解相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn