Silverstripe 博客 - DataExtension 以使用幻灯片放映覆盖特色图像

Silverstripe Blog - DataExtension to Override FeaturedImage with Slideshow

我目前正在尝试用幻灯片替换 silverstripe 博客上的单个 "FeaturedImage"。原来的BlogPost.php是这样的:

class BlogPost extends Page {
    private static $has_one = array(
        'FeaturedImage' => 'Image',
    );
}

我创建了以下名为 BlogPostExtension.php 的文件,并在我的主 config.yml 中用它扩展了 BlogPost(BlogImage 是一个数据对象,带有 has_one 图像、元信息和必需的关系)

class BlogPostExtension extends DataExtension {
    private static $has_many = array(
        'Images' => 'BlogImage.Post',
    );
    public function FeaturedImage(){
        if($r = $this->owner->Images()->first()){
            if($r->Image()->ID>0){
                return $r->Image() ;
            }
        }
        return false ;
    }
}

我希望 FeaturedImage 函数能够优雅地降低 BlogPost 上旧的 has_one 关系,而不是在我的幻灯片放映中提供第一张图片。不幸的是,这没有用。我还尝试将 FeaturedImage 函数命名为 "getFeaturedImage" 但没有成功。

任何人都可以建议我如何实现我的目标吗?我是否需要删除我的 DataExtension 中原来的 has_one 关系,如果需要,我如何在不修改核心文件的情况下实现这一点?

您采用的方法很有趣,但您需要采用不同的方法来解决此问题。扩展扩展了一个 DataObject,不一定要覆盖它。

我建议将 FeaturedImageID 设置为 onBeforeWrite() 中的第一个图像 ID。为了可用性起见,您可能还想调用 updateCMSFields() 并删除 FeaturedImage 字段。

像这样的东西将是您想要的东西的良好开端:

class BlogPostExtension extends DataExtension {
    private static $has_many = array(
        'Images' => 'BlogImage.Post',
    );
    public function onBeforeWrite(){
        if($r = $this->owner->Images()->first()){
            if($r->Image()->ID > 0){
                $this->owner->FeaturedImageID = $r->Image()->ID ;
            }
        }
    }
}