当我们学会前几章以后,我们已经可以完成一些基本的phalcon页面的设置,现在我们开始学习如何使用phalcon完成更多的功能
一、页面layout控制
我们已经学会的css和js布局,当我们希望controller某个action不受layout控制
比如,用户首页(/user/index)头部和底部样式(使用app/views/layouts/sepcial.volt)和其他用户页(/user/xxx)头部和底部样式(使用app/views/layouts/user.volt)需要区分开。
当我们遇到这种情况的时候,就可以使用渲染级别,如下图所示
这样就可以完成对特定页面的layout控制
二、controller变量输出与渲染
当我们在action中想输出某个变量到页面时,可以使用$this->view->变量名 = 变量的方式
比如我们想输出变量 test到页面/products/index
在前端(app/views/products/index.volt)中,使用{{ 变量名 }}的方式渲染
当我们变量输出为数组或者对象时,例如下图中articleList
我们可以使用for循环渲染数组中结果
输出
传递,session,cookie,全局变量等等
无论是get方式还是post方式都可以通过$this->request->getPost()方法获取参数值
用$this->request->isPost() 、 $this->request->isAjax()来判断是否是post传值或者ajax传值,用 $this->security->checkToken()来判断是否通过token验证(注意token验证的页面不能有动态刷新。比如客服插件,因为会动态刷新表单页面,将会导致通不过token验证),以上几种方法在登录注册中会常常用到
当表单传输文件时,还可能使用$this->request->hasFiles()来判断是否有文件传输,具体可以参考文档
路径参数在查询模块经常会用到,因为用户会保留页面查询结果,其原理跟get方式类似,但是在conroller中可以直接取值不用获取
如上图所示phalcon的路径为 http://域名/controller名称/action名称/参数1/参数2/参数3/…无限叠加
session,cookie以及全局变量不细讲,大家自行去看文档
页面跳转,当后台处理完数据后,会将用户跳转到不同的页面,使用this->response->redirect(‘/user/search/参数1/参数2’)
还有一种方式是$this->dispatcher->forward(),这种比较特殊,特殊原因在两点
1.页面url不变,页面重新渲染。例如我们在/products/search/页forward/index/index
2.不管在哪个页面,使用forward后,变量值都可以传递到新渲染的页面,比如我们在ProductsController的SearchAction中加入testParams变量,然后在/index/index.volt中渲染该变量
输出结果可以看到
上述方法可以构建封装之前我所说的提示跳转功能,也可以在特殊情况渲染特殊模板,以后用到的地方可能比较多
四、mysql查询语言
首先需要注意,mysql添加任何表都需要在app/models/中添加对应的模型!,比如添加article表后必须添加article模型
find和findFirst,find查询出来的是二维数组,findFirst查询出来的是一维数组,以下图为例
输出结果对比:
当然也可以设置多种查询条件,具体可以参考文档
当我们需要联表查询时,就必须使用phalcon复合查询
上图以UserBank为主表,左联Bank表和Region表,取消UserBank、Bank、Region三张表中数据
,当然也可以innerJoin(内联查询)rightJoin(右联查询)
这里标点符号不能错,模型大小写必须对应,查询字段必须存在,否则都会报错
复合查询时排序和限数写法和find不一样
还有重要一点,这样取出来的结果集二维对象,如果只取一行数据,在最下面加->getFirst()
如果想要将对象转为数组使用->toArray()即可
最后还有一种情况,将同一表联两次,比如我的地址省和市都需要联region表,如下图所示
在取出字段时,分别将RegionC和RegionP取出并重命名即可达到上述要求
下一章讲mysql集群和主从分离实现,memcached缓存实现