Les exemples de cet article décrivent l'utilisation de Zend Framework smarty. Partagez-le avec tout le monde pour référence, comme suit :
1. Introduction à Zend Framework
Zend Framework utilise la structure Model-View-Controller (MVC). Ceci est utilisé pour séparer votre programme en différentes parties, ce qui facilite le développement et la maintenance.
L'exécution de Zend Framework nécessite : PHP 5.1.4 (ou supérieur), le serveur web supporte la fonction mod_rewrite, cet exemple utilise Apache. Téléchargez Zend Framework depuis ici http://framework.zend.com/download, il existe deux formats : .zip ou .tar.gz.
2. Configuration du Zend Framework
1. Structure des répertoires
Bien que Zend Framework n'insiste pas sur l'utilisation d'une structure de répertoires standard, il existe toujours des structures de répertoires communes. Cette structure de répertoires suppose que vous avez un contrôle total sur la configuration d'Apache. (Ce qui suit utilise cette machine comme exemple. Vous devez apporter des modifications en fonction de votre propre situation. Le répertoire racine de mon serveur pointe vers le dossier Web)
Citation :
Web/
test /
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/ css
Nous avons séparé les fichiers de modèle, de vue et de contrôleur du programme en différents sous-répertoires. Les images, scripts et fichiers CSS pris en charge sont stockés dans divers sous-répertoires du répertoire webroot. Les fichiers Zend Framework téléchargés sont placés dans le répertoire de la bibliothèque. Si nous avons besoin d'autres fichiers de bibliothèque, ils peuvent être placés ici. Dans cet exemple, nous utilisons la technologie de modèle Smarty, nous devrions donc également placer le fichier de bibliothèque Smarty sous le fichier de bibliothèque !
2. Fichier de démarrage
1) Configuration.htaccess
Nous utilisons un fichier à entrée unique index.php pour accéder à notre programme, qui nous fournit le point central du programme pour toutes les pages et assurez-vous que l'environnement d'exécution est correctement configuré. Nous utilisons des fichiers .htaccess pour atteindre cet objectif. Ajoutez le fichier .htaccess dans le répertoire racine du test avec le contenu suivant :
RewriteEngine on RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php
2) Configurer. Apache
En même temps, nous devons également effectuer quelques réglages pour Apache et ouvrir le fichier de configuration Apache httpd.conf.
1. Recherchez la phrase "#LoadModule rewrite_module modules/mod_rewrite.so et supprimez le # devant !
2. Recherchez ensuite "AllowOverride None et remplacez-le par AllowOverride All, redémarrez Apache. il.
3. Le fichier de démarrage index.php
index.php est placé dans le répertoire racine de test Voici le contenu de 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) Description du fichier de démarrageZend Framework est conçu de telle manière que tous les fichiers doivent être inclus dans include_path. Nous incluons également notre répertoire models dans le chemin d'inclusion afin que nous puissions facilement charger nos classes de modèles plus tard. Tout d'abord, nous devons inclure Zend/Loader.php pour avoir accès à la classe Zend_Loader. Il existe des méthodes statiques dans la classe Zend_Loader qui nous permettent de charger d'autres classes Zend Framework, par exemple :Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass charge la classe nommée. Il est implémenté en convertissant les traits de soulignement en séparateurs de chemin et en ajoutant le suffixe .php à la fin. De cette façon, la classe Zend_Controller_Front sera chargée depuis Zend/Controller/font.php. Si vous utilisez la même convention de dénomination dans votre bibliothèque de classes, vous pouvez utiliser Zend_Loader::loadCass() pour les charger. Nous devons charger la classe de contrôleur et la classe de routage.
Le contrôleur frontal utilise des classes de routage pour mapper l'URL demandée à la fonction PHP correcte, puis affiche la page. Pour que le routage fonctionne, il doit déterminer quelle partie de l'URL est le chemin d'accès à index.php afin de pouvoir rechercher l'élément url après ce point.
Nous devons configurer le routeur frontal pour qu'il sache dans quel répertoire rechercher nos contrôleurs.
$frontController = Zend_Controller_Front::getInstance(); $frontController->setControllerDirectory('./application/controllers');
Le paramètre lève une exception, mais une fois que le serveur fonctionne réellement, nous ne devrions pas afficher de messages d'erreur à l'utilisateur.
$frontController->throwExceptions(true);
Parce que dans cet exemple nous utilisons la technologie de modèle Smarty. Nous fermons donc la vue fournie avec ZF lui-même. $frontController->setParam('noViewRenderer', true); Définit l'adresse de base pour faciliter la définition de l'URL pour un saut ultérieur. $frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);Ensuite, nous configurons Smarty. Tout d’abord, nous avons référencé la classe Smarty.class.php dans la bibliothèque de classes. Et son chemin est tracé de manière à ce que le gouvernement connaisse son emplacement. :
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);
Ici, nous utilisons le registre d'objets de ZF (Registry) pour stocker $view, afin qu'à tout moment du programme, nous puissions tous l'appellent pour effectuer des opérations. Zend_Registry::set('views', $views); Après le paramétrage, exécutez le programme. $frontController->dispatch();
À ce stade, si vous exécutez http://127.0.0.1/test pour tester. Vous trouverez une erreur similaire à Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' avec le message 'Invalid contrôleur spécifié (index)' dans... C'est parce que nous n'avons pas encore configuré notre programme.
3. Programme d'installation
在设置文件以前,理解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,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(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('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 framework框架的PHP程序设计有所帮助。
Pour des exemples plus détaillés d’utilisation intelligente du Zend Framework et des articles connexes, veuillez prêter attention au site Web PHP chinois !