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();

Post Comment