ProcessWire Hook的使用及常用的重要API
一 Hook的使用
在site
目录下新建一个ready.php
文件,然后就可以在这个文件中愉快的hook了。
hook的构造函数
$wire->addHookAfter('Pages::saveReady(template=yourtemplate)', function($event) { $page = $event->arguments('page'); });
具体的更多参数参考官网:https://processwire.com/docs/modules/hooks/
二 常用的重要API
2.1 判断page是否有某字段
$page->hasField("field")
2.2 获得Repeater字段的Page
PW框架中repeater字段是个很独特的存在,它本身就是一个独立的page,以及它还有自己的template,所以在hook repeater数据动作的时候我们如果需要获取到它所在页面需要使用这个Api来获得:
$parent = $page->getForpage();
这里$parent
就是它所在的page
,当然如果repeater下面还有repeater也可以通过这个api先获取到上层repeater对象,然后再次使用这个api获得页面对象,如下例:
$page = $event->arguments('page'); $sf = $page->getForpage(); //this is a repeater page $parent = $sf->getForpage(); //this one is normal page
2.3 判断字段是否有改动
这是让我最意外的一个API,居然连字段数据改动都提供了,比如在save数据的时候判断标题是否有变化,只需要使用:
$page->isChanged("title")
2.4 信息的捕捉与输出
Hook中的saveReady
不管是在API中使用了save()这
样的方法保存数据还是在后台表单提交保存,它都能hook到,但是如果要输出信息只能在后台用$this->message("Hello World!");
来获得
2.5 判断页面是不是刚创建的
在hook中需要修改时(非创建)触发一些业务逻辑的处理,可以用到这个!$page->isNew()
作为条件判断
2.6 清除某个页面的缓存
需要使用系统核心模块PageRender
$pageRender = wire("modules")->get("PageRender"); $cacheFile = $pageRender->getCacheFile($p); $cacheFile->expireAll();