【精品】zend framework(可编辑.ppt

上传人:1595****071 文档编号:86274536 上传时间:2023-04-14 格式:PPT 页数:86 大小:1.43MB
返回 下载 相关 举报
【精品】zend framework(可编辑.ppt_第1页
第1页 / 共86页
【精品】zend framework(可编辑.ppt_第2页
第2页 / 共86页
点击查看更多>>
资源描述

《【精品】zend framework(可编辑.ppt》由会员分享,可在线阅读,更多相关《【精品】zend framework(可编辑.ppt(86页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Zend Framework主要内容p什么是框架pPHP开发是否需要框架p如何使用框架进行PHP开发nZendFramework简介n分别使用传统方式和ZendFramework开发一个文章管理发布系统p细节问题nMVC,数据库,模板,权限控制,AJAX等什么是框架?p框架,即Framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。注意,框架体现了程序的设计思想,但又不只是规划性的东西,它已经实现了部份核心代码。p简单说就是使用别人搭好的舞台,你来做表演,但你要按照一定的规则。p框架一般是成熟的,不断升级的软件。PHP开发是否需要框架使用框架的好处p面向对象开发,

2、有成熟的设计思想可以借鉴pMVC分层,避免业务层与表现层混合,有利于后续开发p有固定的程序结构和编码规范,代码易分享,有利于团队协作MVC绝大部份PHP框架以MVC模式为基础来划分结构:p模型(Model):就是封装数据和所有基于对这些数据的操作。业务层p视图(View):就是封装的是对数据显示,即用户界面。表现层p控制器(Controller):就是封装外界作用于模型的操作和对数据流向的控制等。ZFZF内部内部p控制器ControllerController“肥大”问题,拆分ZF提供的控制器“Module”功能,可以把ArticleController.php拆分成一个目录下的多个文件art

3、icle=new Article();public function listAction()$articles=$this-article-fetchAll($where,$order);$this-view-articles=$articles;echo$this-view-render($this-tplDir.articleList.php);public function editAction()?p模型Modelinsert($data);catch(PDOException$e)echo Exception caught:$e-getMessage()n;exit;?Zend_D

4、b_Table类似于大家常用的mysql.class.php,但更强大,默认绑定了数据表,各种查询方法,大部份情况下不用写sql;使用PDO,更加安全。p视图View访问方式pZendFrameworkhttp:/ IndexController extends Zend_Controller_Actionfunction indexAction()echo in IndexController:indexAction();function addAction()echo in IndexController:addAction();function editAction()echo in I

5、ndexController:editAction();function deleteAction()echo in IndexController:deleteAction();?ppublicfunctionnoRouteAction()$this-_redirect(/);例如,在FooController.php不存在的条件下,访问/foo/bar就会执行noRouteAction()。但是访问/index/foo仍会出错,因为foo是action,而不是controller.添加视图p添加视图文件,这些文件就是模板文件,视图允许我们把显示页面的代码从action中分离出来。这些模板文

6、件必须使用action名来定义,扩展名使用phtml,保存在以下目录中zf-tutorial/application/views/scripts/index/index.phtmlzf-tutorial/application/views/scripts/index/add.phtmlzf-tutorial/application/views/scripts/index/edit.phtmlzf-tutorial/application/views/scripts/index/delete.phtml设置视图pZF的视图叫Zend_View,是用来在MVC模式中处理View(视图)部份的一个类

7、。也就是说它用来使视图部份的代码与Model及Controller分离。它提供了helper,outputfilter,variableescaping等几个功能组件。pZend_View的初始化用法:$view=newZend_View();$view-setScriptPath(/path/to/view_files);echo$view-render(viewScript.php);使用控制器初始化视图p使用Zend_View主要有两步:n1.你的Controller建立一个Zend_View实例,并将需要的变量传递给它;n2.Controller告诉Zend_View显示一个特定的视图

8、,生成View输出的内容。p初始化视图nview:视图属性n通知Zend_View对象在views/scripts/controllername目录中查找显示脚本,然后显示与动作名称相同,扩展名为.phtml的显示脚本即显示的视图文件名为views/scripts/controllername/actionname.phtml,pIndexController.phpview-title=“我的图书馆我的图书馆”;/给给view属性添加属性添加title属性属性function addAction()$this-view-title=“添加新的图书添加新的图书”;/?编辑视图文件pindex.

9、phtmlescape($this-title);?escape($this-title);?共同的HTML代码p在我们的视图里有许多相同的HTML代码,因此我们使用Zend_Layout组件来解决这个问题,Zend_Layout允许我们将相同的头部和尾部代码移到独立的布局显示脚本中。确定布局保存位置:nzf-tutorial/appliaction/layouts/layout.phtmln清空index.phtml、add.phtml启用Zend_Layoutpindex.phpZend_Layout:startMvc(array(layoutPath=./application/layo

10、uts);/dispath()-启动之前添加启用Zend_Layoutplayout.phtmlescape($this-title);?escape($this-title);?layout()-content;?风格p为了使我们的网站更为美观,要定位CSS文件,因为URL并不是指向正确的根目录,这需要创建自己的视图辅助函数baseUrl(),它通过收集请求对象的相关信息使我们可以得到不知道的URL,并把它传递给视图视图助手p在你的视图脚本中,经常需要执行某些特定的复杂的函数,例如,格式化日期,生成表单对象,或者显示action的链接等等。你可以使用助手类来完成这些工作。p视图辅助类n保存在

11、application/views/helpers文件夹中n文件名为Helpername.php(文件名第一个字母大写)n视图辅助类名必须是Zend_View_Helper_Helpername形式(每个单词第一个字母大写)n在这个类中,必须有一个名为helpername()的函数(函数名第一个字母小写)BaseUrl.phpgetBaseUrl();?添加样式playout.phtmllinkrel=stylesheettype=text/cssmedia=screenhref=baseUrl();?/css/site.css/ppublic/css/site.cssbody,htmlmar

12、gin:05px;font-family:Verdana,sans-serif;h1font-size:1.4em;color:#008000;数据库p我们已将程序的控制与视图分离开来了,继续我们的例子,接下来是存取数据库。p我们将利用ZF提供的Zend_Db_Table类,该类是ZF的表模块,可以来进行查找、插入、修改和删除数据库表中的记录。连接数据库pZend_Db_Adapter是ZF的数据库抽象层API。基于PDO,你可以使用它连接和处理多种数据库,包括:SQLServer,MySql,SQLite等等。p针对不同的数据库实例化一个Zend_Db_Adapter对象,需要将adapte

13、r的名字和描述数据库连接的参数数组作为参数,静态调用Zend_Db:factory()方法。什么是PDOpPHPDataObject(PDO)是PHP一个扩展.它定义了一个简便持久访问数据库的方法.我们可以方便地使用一组定义好的函数来访问每个实现了PDO的数据库.PDO提供了一组访问数据库的抽象方法,也就是说,不论访问何种类型的数据库,我们只用同样名称的方法访问就可以了,这样就大大简便了数据库操作。PDO安装(参考)pextension=pdo.sopextension=pdo_MySQL.sopextension=php_pdo.dllextension=php_pdo_firebird.d

14、llextension=php_pdo_informix.dllextension=php_pdo_mssql.dllextension=php_pdo_mysql.dllextension=php_pdo_oci.dllextension=php_pdo_oci8.dllextension=php_pdo_odbc.dllextension=php_pdo_pgsql.dllextension=php_pdo_sqlite.dll127.0.0.1,username=root,password=root,dbname=bookdb);$db=Zend_Db:factory(PDO_MYSQL

15、,$params);/为所有的Zend_Db_Table对象设定默认的adapterrequire_onceZend/Db/Table.php;Zend_Db_Table:setDefaultAdapter($db);?初始化数据库连接配置文件p为了访问数据库,必须先配置使用的数据库及登录数据库的用户名密码等信息,把这些信息保存在配置文件中,更便于以后的更新,配置文件存放在application目录下,或者存在在单独目录中application/configp使用Zend_Config来提供灵活的面向对象访问配置文件,配置文件可以是PHP数组、一个INI文件或者XML文件。config.ini

16、generaldb.adapter=PDO_MYSQLdb.params.host=localhostdb.params.username=rootdb.params.password=rootdb.params.dbname=bookdbdb.params.charset=gb2312Zend_Configp在index.php中添加/loadconfiguration$config=newZend_Config_Ini(./application/config.ini,general);$registry=Zend_Registry:getInstance();$registry-set(

17、config,$config);/setupdatabase$db=Zend_Db:factory($config-db);$db-query(SETNAMES.$config-db-params-charset.);Zend_Db_Table:setDefaultAdapter($db);p/loadconfigurationn构造Zend_Config_Ini和Zend_Registry对象n读取config.ini配置文件中“general”节中的数据n保存$config对象到$registry对象中,留以后其他地方使用p/setupdatabasen创建Zend_Db对象,并读取配置信

18、息n设置操作数据库字符集n通过Zend_Db对象的静态方法将db注册到Zend_Db_Table中模型p现在该是考虑模型的时候了。记住,模型是用来处理程序的核心议题(即所谓的“商业规则”businessrules)p管理我们的图书是我们要考虑的业务核心,使用Zend_Db_Table类来完成这个功能,由于它是抽象类,所以我们继承它来创建管理图书的数据库模型Zend_Db_TablepZend_Db_Table是ZendFramework的表模块。它通过zend_db_adapter连接到数据库,为数据库模式检查表对象,并对该表进行操作和查询。pZend_DB_Table为抽象类,所以不能直接实

19、例化,只能先继承该类,然后实例化子类扩展Zend_Db_Tablep模型根据操作的数据库来创建n类名:使用的数据库表名n属性:设置$_name属性为要操作的表名p存放路径:napplicationmodelsBooks.php数据库操作p插入数据/*insertbook(id,name,title)values(201,alex,PHP)*/$books=newBooks();$data=array(id=201,name=alex,title=PHP);$id=$books-insert($data);/返回插入数据行号p更新数据/*updatebookssetname=alex0018wh

20、ereid=201*/$books=newBooks();$db=$books-getAdapter();$set=array(name=alex0018);$where=$db-quoteInto(id=?,201);$row_affected=$books-update($set,$where);/返回更新行数p删除数据/*deletefrombookswherename=alex0018*/$books=newBooks();$db=$books-getAdapter();$where=$db-quoteInto(name=?,alex0018);$row_affected=$books

21、-delete($where);/返回删除行数Zend_Db_Table_Rowp该类不能实例化,只能通过调用Zend_Db_Table:find()方法或者Zend_Db_Table:fetchRow()做为结果数据返回过来,一旦得到对象还可以进行记录值的修改等操作。p取回一条记录和修改一条记录$books=newBooks();/从表中取回的结果数据是一个Zend_Db_Table_Row对象$row=$books-fetchRow(name=alex);/$row现在是一个带有多种公有属性的Zend_Db_Table_Row对象/thatmaptotablecolumns:/$row-i

22、d=201/$row-name=alex/$row-title=PHP/$row-save();保存修改,但不能修改主键p设置查询条件取回一条记录/*select*frombookswheretitle=PHPandname=alexorderbyid*/$books=newBooks();$db=$books-getAdapter();$where=$db-quoteInto(title=?,PHP).$db-quoteInto(andname=?,alex);$order=id;$row=$books-fetchRow($where,$order);/返回满足条件的第一行数据的Zend_D

23、b_Table_Row对象.Zend_Db_Table_RowsetpZend_Db_Table_Rowset是Zend_Db_Table_Row对象集合的迭代器。通常来说,你不可以自己实例化该对象,而是通过调用Zend_Db_Table:find()方法或者fetchAll()方法将Zend_Db_Table_Rowset作为结果数据返回过来,接下来就可以遍历Zend_Db_Table_Row对象集合并进行修改p根据主键查找数据$books=newBooks();/*select*frombookswhereid=201*/$rows=$books-find(201);/*select*fr

24、ombookswhereidin(201,202,203,)*/$rows=$books-find(array(201,202,203);/返回满足条件的Zend_Db_Table_Rowset对象$rows=$books-fetchAll();/返回所有的记录p取回多条记录$books=newBooks();$db=$books-getAdapter();/*select*frombookswheretitle=PHPorderbyidlimit10offset20*/$where=$db-quoteInto(title=?,PHP);$order=id;$count=10;$offset=

25、20;$rowset=$books-fetchAll($where,$order,$count,$offset);/返回满足条件的数据的Zend_Db_Table_Rowset对象程序核心部分p显示图书列表p添加图书p编辑图书p删除图书显示图书列表p控制器functionindexAction()$this-view-title=我的图书馆;$books=newBooks();$this-view-books=$books-fetchAll();p视图:applicationviewsscriptsindexindex.phtmlahref=url(array(controller=index

26、,action=add);?添加图书TitleName booksas$book):?escape($book-title);?escape($book-name);?ahref=url(array(controller=index,action=edit,id=$book-id);?编辑ahref=url(array(controller=index,action=delete,id=$book-id);?删除p样式:public/css/site.css/*Table*/thtext-align:left;td,thpadding-right:5px;添加图书p添加图书包括两个工

27、作n显示一个表单供用户输入详细的图书信息n处理提交的表单,将图书信息保存到数据库中p使用Zend_Form来完成这个工作,Zend_Form组件可以用来创建输入表单并对用户的输入信息进行验证。我们引入一个新的继承自Zend_Form的模型类BookForm来定义该表单Zend_Formp获取用户数据的最简单方式就是使用表单,ZF提供Zend_Form可以完成复杂的验证并在表单验证失败时在表单中显示错误信息。pZend_Form附带了:按钮、复选框、隐藏、图片、多选框、密码、单选、重置、提交、文本、文本域等元素,内置的Zend_Form_Element类允许您创建自己的元素papplicatio

28、n/models/BookForm.php一个简单的表单require_onceZend_Form.php;$form=newZend_Form(array(method=post,elements=array(name=array(text,array(required=true,label=Name,validators=array(alpha),age=array(text,array(required=true,label=Name,validators=array(digits),submit=array(submit,array(label=send);setName(book);

29、/$id=new Zend_Form_Element_Hidden(id);$id=new Zend_Form_Element_Text(id);$id-setLabel(Id)-setRequired(true)-addFilter(StripTags)-addFilter(StringTrim)-addValidator(NotEmpty);$name=new Zend_Form_Element_Text(name);$name-setLabel(Name)-setRequired(true)-addFilter(StripTags)-addFilter(StringTrim)-addVa

30、lidator(NotEmpty);$title=new Zend_Form_Element_Text(title);$title-setLabel(Title)-setRequired(true)-addFilter(StripTags)-addFilter(StringTrim)-addValidator(NotEmpty);$submit=new Zend_Form_Element_Submit(submit);$submit-setAttrib(id,submitbutton);$this-addElements(array($id,$name,$title,$submit);?p在B

31、ookForm的构造函数中,我们创建了包括四个元素的表单:id,name,title和submit按钮。每个元素都设置了不同的属性,包括要显示的文本标签。p对于文本元素,我们增加了两个过滤器,StripTags和StringTrim,它们分别用来删除不必要的HTML标记和不必要的空格。我们还将它们设置为必需的字段,通过添加一个NotEmpty验证器来保证用户确实输入了我们需要的信息。p现在我们需要显示这个表单,并能在表单提交后进行处理。这可以通过addAction()来实现p控制器控制器function addAction()/part1$this-view-title=添加图书添加图书;$f

32、orm=new BookForm();$form-submit-setLabel(Add);$this-view-form=$form;/part2if($this-_request-isPost()$formData=$this-_request-getPost();if($form-isValid($formData)/part3$books=new Books();$row=$books-createRow();$row-id=$form-getValue(id);$row-name=$form-getValue(name);$row-title=$form-getValue(title

33、);$row-save();$this-_redirect(/);else/part4$form-populate($formData);pPart1:创建一个BookForm的实例,提交按钮标签改为“Add”,然后将$form保存到视图中去,以便以后显示它。pPart2:使用请求对象的isPost()判断表单是否为提交状态,再使用getPost()从请求对象中获取表单提交的数据,然后用isValid()来验证表单是否有效。pPart3:如果表单有效,创建一个新的Books对象,使用createRow()来生成一条新记录,然后填充数据,最后保存到数据库中,保存完成后使用控制器的_redirec

34、t()重定向到主页上。pPart4:如果表单无效,则将用户输入的数据重新添回表单重新显示给用户。p视图:applicationviewsscriptsindexadd.phtmlform;?修改图书信息p类似添加图书p控制器控制器function editAction()$this-view-title=编辑图书编辑图书;$form=new BookForm();$form-submit-setLabel(Save);$this-view-form=$form;if($this-_request-isPost()$formData=$this-_request-getPost();if($fo

35、rm-isValid($formData)/part2$books=new Books();$id=(int)$form-getValue(id);$row=$books-fetchRow(id=.$id);$row-name=$form-getValue(name);$row-title=$form-getValue(title);$row-save();$this-_redirect(/);else$form-populate($formData);else/part1 books id is expected in$paramsid$id=(int)$this-_request-getP

36、aram(id,0);if($id 0)$books=new Books();$book=$books-fetchRow(id=.$id);$form-populate($book-toArray();pPart1:如果请求不是POST,那么将执行这个填充过程,它通过模型从数据库中获取记录的值。我们可以使用Zend_Db_Table_Row类的成员函数toArray()来直接填充表单。pPart2:最后我们需要将数据重新写回数据库的相应记录。这可以通过先获取相应记录,再保存该记录的方式来实现。p视图:applicationviewsscriptsindexedit.phtmlform;?删除图

37、书p在主页的图书列表中每本图书都有一个删除该图书的链接,当点击该链接时,相应的图书记录就会被删除,但这样做是错误的。请再回顾我一下我们的HTTP规范,对于不可逆的动作我们不应该使用GET而应使用POST。p当用户点击删除链接时我们应该显示一个确认表单,只有在用户选择了“是”的时候我们才做这个删除操作。p控制器控制器function deleteAction()$this-view-title=删除图书删除图书;if($this-_request-isPost()$id=(int)$this-_request-getPost(id);$del=$this-_request-getPost(del

38、);if($del=Yes&$id 0)$books=new Books();$where=id=.$id;$books-delete($where);$this-_redirect(/);else$id=(int)$this-_request-getParam(id);if($id 0)$books=new Books();$this-view-book=$books-fetchRow(id=.$id);p视图:applicationviewsscriptsindexdelete.phtmlbook):?Areyousurethatyouwanttodeleteescape($this-bo

39、ok-title);?byescape($this-book-name);?formaction=url(array(action=delete);?method=postinputtype=hiddenname=idvalue=book-id;?/Cannotfindbook.备注p如果index/index之外的动作出现问题,通常是因为路由类不能确定你的网站在哪个子目录下。这通常是由于网站的url与web根目录的路径不同。p如果默认的代码不能工作,你应该将$baseURL设置成你的服务器的正确路径p你 应 该 将/mysubdir/zf-tutorial/public替换成访问index.

40、php的正确的路径。p例如:访问index.php的路径是nhttp:/localhost/ralle/zf-tutorial/public/index.php,那么$baseUrl就是/ralle/zf-tutorial/publicindex.php/setupcontroller$frontController=Zend_Controller_Front:getInstance();$frontController-throwExceptions(true);$frontController-setControllerDirectory(./application/controllers

41、);$frontController-setBaseUrl(/mysubdir/zf-tutorial/public);Zend_Layout:startMvc(array(layoutPath=./application/layouts);整合Smartyp在index.php中p。pincludelibs/Smarty.class.php;pp$views=newSmarty();p$views-left_delimiter=right_delimiter=;p$views-compile_dir=./views/smarty/templates_c;p$views-cache_dir=.

42、/views/smarty/cache;p$views-template_dir=./views/smarty/templates;ppZend_Registry:set(views,$views);p。在控制器中pclassindexControllerextendsZend_Controller_Actionpvar$views;pfunctioninit()p$this-views=Zend_Registry:get(views);ppfunctionindexAction()p$this-views-assign(data,helloworld);p$this-views-display(demo.tpl);pp谢谢

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁