位置: 编程技术 - 正文

PHP的Yii框架中View视图的使用进阶(php框架symfony)

编辑:rootadmin

推荐整理分享PHP的Yii框架中View视图的使用进阶(php框架symfony),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php框架介绍,php yii框架,php的ci框架,php各个框架的优缺点,php框架的作用,php框架symfony,php框架symfony,php框架介绍,内容如对您有帮助,希望把文章链接给更多的朋友!

视图名

渲染视图时,可指定一个视图名或视图文件路径/别名,大多数情况下使用前者因为前者简洁灵活, 我们称用名字的视图为 视图名.

视图名可以依据以下规则到对应的视图文件路径:

视图名可省略文件扩展名,这种情况下使用 .php 作为扩展, 视图名 about 对应到 about.php 文件名;视图名以双斜杠 // 开头,对应的视图文件路径为 @app/views/ViewName, 也就是说视图文件在 yiibaseApplication::viewPath 路径下找, 例如 //site/about 对应到 @app/views/site/about.php。视图名以单斜杠/开始,视图文件路径以当前使用模块 的yiibaseModule::viewPath开始, 如果不存在模块,使用@app/views/ViewName开始,例如,如果当前模块为user, /user/create 对应成@app/modules/user/views/user/create.php, 如果不在模块中,/user/create对应@app/views/user/create.php。如果 yiibaseView::context 渲染视图 并且上下文实现了 yiibaseViewContextInterface, 视图文件路径由上下文的 yiibaseViewContextInterface::getViewPath() 开始, 这种主要用在控制器和小部件中渲染视图,例如 如果上下文为控制器SiteController,site/about 对应到 @app/views/site/about.php。如果视图渲染另一个视图,包含另一个视图文件的目录以当前视图的文件路径开始, 例如被视图@app/views/post/index.php 渲染的 item 对应到 @app/views/post/item。根据以上规则,在控制器中 appcontrollersPostController 调用 $this->render('view'), 实际上渲染@app/views/post/view.php 视图文件,当在该视图文件中调用 $this->render('_overview') 会渲染@app/views/post/_overview.php 视图文件。

视图中访问数据

在视图中有两种方式访问数据:推送和拉取。

推送方式是通过视图渲染方法的第二个参数传递数据,数据格式应为名称-值的数组, 视图渲染时,调用PHP extract() 方法将该数组转换为视图可访问的变量。 例如,如下控制器的渲染视图代码推送2个变量到 report 视图:$foo = 1 和 $bar = 2。

拉取方式可让视图从yiibaseView视图组件或其他对象中主动获得数据(如Yii::$app), 在视图中使用如下表达式$this->context可获取到控制器ID, 可让你在report视图中获取控制器的任意属性或方法,如以下代码获取控制器ID。

推送方式让视图更少依赖上下文对象,是视图获取数据优先使用方式, 缺点是需要手动构建数组,有些繁琐,在不同地方渲染时容易出错。

视图间共享数据

yiibaseView视图组件提供yiibaseView::params参数属性来让不同视图共享数据。

例如在about视图中,可使用如下代码指定当前breadcrumbs的当前部分。

在布局文件(也是一个视图)中,可使用依次加入到yiibaseView::params数组的值来 生成显示breadcrumbs:

布局

布局是一种特殊的视图,代表多个视图的公共部分,例如,大多数Web应用共享相同的页头和页尾, 在每个视图中重复相同的页头和页尾,更好的方式是将这些公共放到一个布局中, 渲染内容视图后在合适的地方嵌入到布局中。

创建布局

由于布局也是视图,它可像普通视图一样创建,布局默认存储在@app/views/layouts路径下, 模块中使用的布局应存储在yiibaseModule::basePath模块目录 下的views/layouts路径下,可配置yiibaseModule::layoutPath来自定义应用或模块的布局默认路径。

如下示例为一个布局大致内容,注意作为示例,简化了很多代码, 在实际中,你可能想添加更多内容,如头部标签,主菜单等。

如上所示,布局生成每个页面通用的HTML标签,在<body>标签中,打印$content变量, $content变量代表当yiibaseController::render()控制器渲染方法调用时传递到布局的内容视图渲染结果。

大多数视图应调用上述代码中的如下方法,这些方法触发关于渲染过程的事件, 这样其他地方注册的脚本和标签会添加到这些方法调用的地方。

yiibaseView::beginPage(): 该方法应在布局的开始处调用, 它触发表明页面开始的 yiibaseView::EVENT_BEGIN_PAGE 事件。 yiibaseView::endPage(): 该方法应在布局的结尾处调用, 它触发表明页面结尾的 yiibaseView::EVENT_END_PAGE 时间。 yiiwebView::head(): 该方法应在HTML页面的<head>标签中调用, 它生成一个占位符,在页面渲染结束时会被注册的头部HTML代码(如,link标签, meta标签)替换。 yiiwebView::beginBody(): 该方法应在<body>标签的开始处调用, 它触发 yiiwebView::EVENT_BEGIN_BODY 事件并生成一个占位符, 会被注册的HTML代码(如JavaScript)在页面主体开始处替换。 yiiwebView::endBody(): 该方法应在<body>标签的结尾处调用, 它触发 yiiwebView::EVENT_END_BODY 事件并生成一个占位符, 会被注册的HTML代码(如JavaScript)在页面主体结尾处替换。

布局中访问数据

在布局中可访问两个预定义变量:$this 和 $content,前者对应和普通视图类似的yiibaseView 视图组件 后者包含调用yiibaseController::render()方法渲染内容视图的结果。

如果想在布局中访问其他数据,必须使用视图中访问数据一节介绍的拉取方式, 如果想从内容视图中传递数据到布局,可使用视图间共享数据一节中的方法。

使用布局

如控制器中渲染一节描述,当控制器调用yiibaseController::render() 方法渲染视图时,会同时使用布局到渲染结果中,默认会使用@app/views/layouts/main.php布局文件。

可配置yiibaseApplication::layout 或 yiibaseController::layout 使用其他布局文件, 前者管理所有控制器的布局,后者覆盖前者来控制单个控制器布局。 例如,如下代码使 post 控制器渲染视图时使用 @app/views/layouts/post.php 作为布局文件, 假如layout 属性没改变,控制器默认使用 @app/views/layouts/main.php 作为布局文件。

对于模块中的控制器,可配置模块的 yiibaseModule::layout 属性指定布局文件应用到模块的所有控制器。

由于layout 可在不同层级(控制器、模块,应用)配置,在幕后Yii使用两步来决定控制器实际使用的布局。

第一步,它决定布局的值和上下文模块:

如果控制器的 yiibaseController::layout 属性不为空null,使用它作为布局的值, 控制器的 yiibaseController::module模块 作为上下文模块。如果 yiibaseController::layout 为空,从控制器的祖先模块(包括应用) 开始找 第一个yiibaseModule::layout 属性不为空的模块,使用该模块作为上下文模块, 并将它的yiibaseModule::layout 的值作为布局的值, 如果都没有找到,表示不使用布局。第二步,它决定第一步中布局的值和上下文模块对应到实际的布局文件,布局的值可为:

路径别名 (如 @app/views/layouts/main).绝对路径 (如 /main): 布局的值以斜杠开始,在应用的[[yiibaseApplication::layoutPath|layout path] 布局路径 中查找实际的布局文件,布局路径默认为 @app/views/layouts。相对路径 (如 main): 在上下文模块的yiibaseModule::layoutPath布局路径中查找实际的布局文件, 布局路径默认为yiibaseModule::basePath模块目录下的views/layouts 目录。布尔值 false: 不使用布局。布局的值没有包含文件扩展名,默认使用 .php作为扩展名。

嵌套布局

有时候你想嵌套一个布局到另一个,例如,在Web站点不同地方,想使用不同的布局, 同时这些布局共享相同的生成全局HTML5页面结构的基本布局,可以在子布局中调用 yiibaseView::beginContent() 和yiibaseView::endContent() 方法,如下所示:

如上所示,子布局内容应在 yiibaseView::beginContent() 和 yiibaseView::endContent() 方法之间,传给 yiibaseView::beginContent() 的参数指定父布局,父布局可为布局文件或别名。

PHP的Yii框架中View视图的使用进阶(php框架symfony)

使用以上方式可多层嵌套布局。

使用数据块

数据块可以在一个地方指定视图内容在另一个地方显示,通常和布局一起使用, 例如,可在内容视图中定义数据块在布局中显示它。

调用 yiibaseView::beginBlock() 和 yiibaseView::endBlock() 来定义数据块, 使用 $view->blocks[$blockID] 访问该数据块,其中 $blockID 为定义数据块时指定的唯一标识ID。

如下实例显示如何在内容视图中使用数据块让布局使用。

首先,在内容视图中定一个或多个数据块:

然后,在布局视图中,数据块可用的话会渲染数据块,如果数据未定义则显示一些默认内容。

使用视图组件

yiibaseView视图组件提供许多视图相关特性,可创建yiibaseView或它的子类实例来获取视图组件, 大多数情况下主要使用 view应用组件,可在应用配置中配置该组件, 如下所示:

视图组件提供如下实用的视图相关特性,每项详情会在独立章节中介绍:

主题: 允许为你的Web站点开发和修改主题; 片段缓存: 允许你在Web页面中缓存片段; 客户脚本处理: 支持CSS 和 JavaScript 注册和渲染; 资源包处理: 支持 资源包的注册和渲染; 模板引擎: 允许你使用其他模板引擎,如 Twig, Smarty。

开发Web页面时,也可能频繁使用以下实用的小特性。

设置页面标题

每个Web页面应有一个标题,正常情况下标题的标签显示在 布局中, 但是实际上标题大多由内容视图而不是布局来决定,为解决这个问题, yiiwebView 提供 yiiwebView::title 标题属性可让标题信息从内容视图传递到布局中。

为利用这个特性,在每个内容视图中设置页面标题,如下所示:

注册Meta元标签

Web页面通常需要生成各种元标签提供给不同的浏览器,如<head>中的页面标题,元标签通常在布局中生成。

如果想在内容视图中生成元标签,可在内容视图中调用yiiwebView::registerMetaTag()方法,如下所示:

以上代码会在视图组件中注册一个 "keywords" 元标签,在布局渲染后会渲染该注册的元标签, 然后,如下HTML代码会插入到布局中调用yiiwebView::head()方法处:

注意如果多次调用 yiiwebView::registerMetaTag() 方法,它会注册多个元标签,注册时不会检查是否重复。

为确保每种元标签只有一个,可在调用方法时指定键作为第二个参数, 例如,如下代码注册两次 "description" 元标签,但是只会渲染第二个。

注册链接标签

和 Meta标签 类似,链接标签有时很实用,如自定义网站图标,指定Rss订阅,或授权OpenID到其他服务器。 可以和元标签相似的方式调用yiiwebView::registerLinkTag(),例如,在内容视图中注册链接标签如下所示:

上述代码会转换成

和 yiiwebView::registerMetaTag() 类似, 调用yiiwebView::registerLinkTag() 指定键来避免生成重复链接标签。

视图事件

yiibaseView 视图组件会在视图渲染过程中触发几个事件, 可以在内容发送给终端用户前,响应这些事件来添加内容到视图中或调整渲染结果。

yiibaseView::EVENT_BEFORE_RENDER: 在控制器渲染文件开始时触发, 该事件可设置 yiibaseViewEvent::isValid 为 false 取消视图渲染。 yiibaseView::EVENT_AFTER_RENDER: 在布局中调用 yiibaseView::beginPage() 时触发, 该事件可获取yiibaseViewEvent::output的渲染结果,可修改该属性来修改渲染结果。 yiibaseView::EVENT_BEGIN_PAGE: 在布局调用 yiibaseView::beginPage() 时触发; yiibaseView::EVENT_END_PAGE: 在布局调用 yiibaseView::endPage() 是触发; yiiwebView::EVENT_BEGIN_BODY: 在布局调用 yiiwebView::beginBody() 时触发; yiiwebView::EVENT_END_BODY: 在布局调用 yiiwebView::endBody() 时触发。

例如,如下代码将当前日期添加到页面结尾处:

渲染静态页面

静态页面指的是大部分内容为静态的不需要控制器传递动态数据的Web页面。

可将HTML代码放置在视图中,在控制器中使用以下代码输出静态页面:

如果Web站点包含很多静态页面,多次重复相似的代码显得很繁琐, 为解决这个问题,可以使用一个在控制器中称为 yiiwebViewAction 的独立操作。 例如:

现在如果你在@app/views/site/pages目录下创建名为 about 的视图, 可通过如下rul显示该视图:

中 view 参数告知 yiiwebViewAction 操作请求哪个视图,然后操作在 @app/views/site/pages目录下寻找该视图,可配置 yiiwebViewAction::viewPrefix 修改搜索视图的目录。

最佳实践

视图负责将模型的数据展示用户想要的格式,总之,视图

应主要包含展示代码,如HTML, 和简单的PHP代码来控制、格式化和渲染数据; 不应包含执行数据查询代码,这种代码放在模型中; 应避免直接访问请求数据,如 $_GET, $_POST,这种应在控制器中执行, 如果需要请求数据,应由控制器推送到视图。 可读取模型属性,但不应修改它们。 为使模型更易于维护,避免创建太复杂或包含太多冗余代码的视图,可遵循以下方法达到这个目标: 使用 布局 来展示公共代码(如,页面头部、尾部); 将复杂的视图分成几个小视图,可使用上面描述的渲染方法将这些小视图渲染并组装成大视图; 创建并使用 小部件 作为视图的数据块; 创建并使用助手类在视图中转换和格式化数据。

PHP实现可自定义样式的分页类 本文实例为大家分享了PHP实现可自定义样式的分页类,供大家参考,具体内容如下php//namespaceComponent;/***-3-*@authorankang*/classPage{private$ShowPage;private$Coun

深入解析PHP的Yii框架中的缓存功能 数据缓存是指将一些PHP变量存储到缓存中,使用时再从缓存中取回。它也是更高级缓存特性的基础,例如查询缓存和内容缓存。如下代码是一个典型的

简介PHP的Yii框架中缓存的一些高级用法 页面缓存页面缓存指的是在服务器端缓存整个页面的内容。随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成。页面缓存由yiifiltersPa

标签: php框架symfony

本文链接地址:https://www.jiuchutong.com/biancheng/293314.html 转载请保留说明!

上一篇:PHP的Yii框架中创建视图和渲染视图的方法详解(php框架选择2021)

下一篇:PHP实现可自定义样式的分页类(php自定义字段)

  • 计提税额与实缴税额的区别是什么?
  • 商业写字楼
  • 增值税应交税费科目
  • 上年少计提工会经费本年怎么调整
  • 算税负是用含税的吗
  • 培训属于什么服务行业
  • 小企业今年怎么过
  • 预缴税款如何抵扣苗木款
  • 定额发票可以用旧的营业执照发票章吗
  • 个人出口货物到国外
  • 房地产公司环境
  • 投资公司的投资人叫什么
  • 新公司法注册资本认缴制
  • 社保上面的每月的缴费基数是什么意思?
  • 建筑业购买车辆怎么入账
  • 车辆购置税会计账务处理
  • 开一张增值税发票需要交哪些税
  • 该纳税人不属于经备案的二手车企业
  • 作废发票进项税怎么处理
  • 固定资产清理营业外收入交增值税吗
  • 增值税发票开票有误怎么办?
  • 出口收入转内销后汇率
  • 单位为员工报销的博士学费算什么费用
  • 工会经费怎么做账务处理
  • 进项构成比例是啥
  • 收到发票对方已红冲是否退回?
  • 华为matex3用什么芯片
  • 附加税的税率是多少2023年
  • 怎么简单快速的辨别是铝是锡
  • 损益类科目的借方是增加还是减少
  • 受托加工委托方销售产品
  • 关于工程材料的质量控制说法正确的是
  • 预收账款什么时候确认
  • 查补以前年度收入怎么做会计分录
  • 电脑fs0是什么
  • 我整理的邪恶铭刻所有卡牌及自制卡
  • 存货报废如何账务处理
  • 报销办公用品会计分录计入其他应付还是其他应收
  • 留抵税额进项构成比例
  • 一个简单安全的小故事
  • laravel创建model
  • Cookie 的 SameSite 属性
  • 递延所得税资产和所得税费用的关系
  • SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算的概念
  • 与下级往来账户贷方核算的内容有
  • SQLite3中的日期时间函数使用小结
  • dedecmsv6
  • 个人所得税隔月交么
  • 企业收到的
  • 已纳消费税扣除会计分录
  • 应收票据周转率怎么分析
  • 选用劳务派遣人员
  • 坏账收回所得税需要确认收入吗汇算清缴表如何填报
  • 小规模纳税人附加税减半征收
  • 销售配件模式
  • 航天金税服务费发票在哪打印
  • 环境检测费属于什么费用
  • 普票抵扣
  • winXP系统截图
  • 资源管理器操作教程
  • 苹果手机价格
  • LINUX操作系统的主要组成部分有
  • fedora win10
  • freebsd版本选择
  • freebsd 安装
  • win7网卡驱动怎么卸载
  • win10系统如何快速回到桌面
  • linux常用性能监控命令
  • win10系统自带浏览器在哪里
  • win7点开始一直跳闪
  • linux显示所有内容
  • 我的第二个姐姐用英语怎么说
  • css优化提高性能的方法有哪些
  • perl -p -i
  • JavaScript中数组长度的属性
  • 图片旋转鼠标键盘怎么弄
  • jquery遍历div子元素
  • javascript面向对象精要
  • 税务风险科是干什么的
  • 消费税包装物押金和增值税一致吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设