You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量处理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:手动调用扩展中的方法

如果需要手动控制逻辑,需先获取扩展实例,再调用方法:

  1. 确保扩展已正确配置到SiteTree类(在config.yml中添加):
SiteTree:
  extensions:
    - 你的扩展类名 # 例如:SearchContentExtension
  1. 修改任务代码:
foreach (SiteTree::get() as $item) {
    // 获取扩展实例
    $extension = $item->getExtension('你的扩展类名');
    if ($extension) {
        $the_text = $extension->collateSearchContent();
        $item->SearchContent = $the_text;
        $item->write();
    }
}

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:05:05