批量处理SiteTree项时调用collateSearchContent方法报错求助
问题:批量更新SiteTree的SearchContent字段时,提示找不到collateSearchContent方法
背景
我有一个用于设置搜索字段的SilverStripe扩展,代码如下:
public function onBeforeWrite(){ parent::onBeforeWrite(); $this->getOwner()->SearchContent = $this->collateSearchContent(); }
该扩展仅在新增或更新页面时生效。我希望遍历所有SiteTree项并批量设置SearchContent,于是在任务中编写了如下代码:
foreach (SiteTree::get() as $item) { $the_text = $item->collateSearchContent(); # 之前的写法:$item->getOwner()->SearchContent = $the_text; $item->SearchContent = $the_text; $item->write(); }
但运行时出现错误:
Caught exception: Object->__call(): the method 'collateSearchContent' does not exist on 'Page'
原因
collateSearchContent是扩展类中的自定义方法,并非SiteTree或Page类的原生方法。直接通过Page实例调用该方法,会因为扩展未正确关联到实例,或者调用方式错误导致找不到方法。
解决方案
方案1:利用扩展的onBeforeWrite钩子(推荐)
你的扩展已经在onBeforeWrite中实现了SearchContent的设置逻辑,因此批量处理时只需触发write()方法即可自动执行扩展逻辑,无需手动调用collateSearchContent:
foreach (SiteTree::get() as $item) { $item->write(); }
调用write()会触发onBeforeWrite事件,扩展中的代码会自动为每个SiteTree项生成并设置SearchContent。
方案2:手动调用扩展中的方法
如果需要手动控制逻辑,需先获取扩展实例,再调用方法:
- 确保扩展已正确配置到SiteTree类(在
config.yml中添加):
SiteTree: extensions: - 你的扩展类名 # 例如:SearchContentExtension
- 修改任务代码:
foreach (SiteTree::get() as $item) { // 获取扩展实例 $extension = $item->getExtension('你的扩展类名'); if ($extension) { $the_text = $extension->collateSearchContent(); $item->SearchContent = $the_text; $item->write(); } }
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

