高阶篇
目录
通过对前两篇的学习,大家应该学会怎样创建一个简单得单表操作模型了!接下来,本文将为大家讲解更加高级的操作。
CURD
在开始高阶说明前,大家必须了解《GPPD》,否则会对本文一头雾水。模型管理,对于单表操作提供了如下请求类型:
请求类型 | 名称 |
---|---|
GET | index —— 列表页 action —— 新增/编辑页 |
POST | action —— 写入数据 |
PUT | action —— 更新数据 listsort —— 列表内容排序 |
DELETE | action—— 删除数据 |
上面提及的请求类型,已经囊括了CURD。具体实现的方式,请查阅对应目录的Content.class.php文件。
定制模板
有些时候我们需要对特定的模型显示特定的模板,如:某些表单我想隐藏,尽管我可以通过字段管理隐藏,但隐藏后数据会被覆写。这时候,需要用上定制模板功能了。下面示例用PESCMS TEAM(下称TEAM)中的用户编辑 模板来说明。
先来看看TEAM中的用户模型字段:
显然,在新增/编辑中,密码的值应该在表单输入框中处于留空状态。若调用默认的Content_action.php,在编辑下,处理过得密文将会留在输入框中。要避免这个问题,需要定制模板。
我们先在对应的主题目录下创建一个 User 目录。接着再创建一个 User_action.php 文件。我们访问 新增/编辑页,会出现一个空白页。这样就表示系统已经成功读取了模板文件。接下来在文件添加如下代码:
<?php include THEME_PATH . '/Content/Content_action_header.php' ?> <?php include THEME_PATH . '/Content/Content_action_hidden.php' ?> <?php include THEME_PATH . '/Content/Content_action_form.php' ?> <script> $(function(){ $("input[name=password]").val(''); }) </script> <?php include THEME_PATH . '/Content/Content_action_footer.php' ?>
我们在随机进入一个账号的编辑页,可以明确看到,密码编辑框的文本已经被留空了。
上面仅仅列出一个比较简单得例子,还有更多复杂的,但由于篇幅以及不同需求情景下,很难一一说清,因此各位请自行举一反三,或者通过阅读PESCMS系列软件源码获取对应的设计思路。
其次,官方建议各位阅读 Content_index.php和Content_action.php两个文件。而在定制列表中,可以直接输出循环遍历变量 $list的内容,因为定制列表中,基本不需要用到动态字段输出的方式,尽量减少复杂度。
继承控制器
除了可以定制模板外,我们还可以继承控制器。经过几次调整,现在版本的PESCMS智能表单类基本满足了日常的使用。下面将用几个实例为大家讲解。
用户模型添加查看用户信息页。
根据CURD表格中的方法可知,模型中并没有查看用户信息页的方法。若按照平常的开发模式,我们会在GET请求目录中创建User.class.php控制器。然后代码如下:
<?php namespace App\Team\GET; class User extends \Core\Controller\Controller { public function view(){ //...查看用户信息的业务代码 } }
若这么干,我们就破坏掉了智能表单中CURD GET方法的 index和action方法。现在访问上述两个方法,系统会报错,提示方法不存在。因此,我们要调整一下继承的策略:
class User extends \Core\Controller\Controller {
改为:
class User extends Content {
完整的示例代码:
<?php namespace App\Team\GET; class User extends Content { public function view(){ //...查看用户信息的业务代码 } }
现在在访问 index和action方法,发现熟悉的界面回来了,然后访问view方法,也正常!
因此,只要您当前的方法是基础模型创建而来的,那么控制器都建议继承Content类。
列表页添加筛选条件以及显示特定模板
由于智能表单是基础单表操作,默认的列表是会输出所有的内容。有时候列表页我们需要添加一下筛选条件,这时候我们需要进行一些继承操作。
首先呢,GET\Content.class.php提供了一些比较使用的属性声明。
$this->condition //用于组合SQL筛选条件 $this->param //结合SQL筛选条件中的参数绑定。具体请参考《预处理和安全》
<?php namespache App\Team\GET; clasee User extends Content { /** * $display 为false,则不调用默认的模板,用户手动指定模板;即不调用User_index.php。 */ public function index($display = false){ //示例代码 $this->condition .= ' AND user_id >1 AND user_group = :user_group';//组合筛选条件 $this->param['user_group'] = $this->g('group'); //绑定的参数, 此处不能声明为 $this->param = ['user_group' => $this->g('group') ]; 。因为这会覆盖在这代码前的数组内容。 parent::index($display); $this->display('user_test');//调用用户指定的模板 } }
通过上面的代码,现在index的方法执行了指定的筛选条件以及显示指定的模板。需要注意的是:parent::index($display);为非必要。如果您需要保留原有的核心方式,则在方法中保留,反之移除。
对于其他请求以及方法的定制、修改模式基本都一样,在这里官方不在详细介绍了。
总结
其实智能表单的内容不多,设计的核心是减少重复代码的编写。也许有不少地方设计不合理,但我们觉得目前这些不足都是有很简单得解决方案。我们相信大家在二次开发过程,基于智能表单的设计,将会减少很多重复的代码。同时,该功能也在不断完善,也许未来有一天会变得真正的智能化(自动产生代码)。