Silverstripe Blog - 使用幻灯片显示覆盖FeaturedImage的DataExtension

时间:2016-02-17 12:06:43

标签: silverstripe

我目前正在尝试更换单个" FeaturedImage"在silverstripe博客上播放幻灯片。最初的BlogPost.php看起来像这样:

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

我已经在我的主config.yml中创建了以下名为BlogPostExtension.php的文件和扩展的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关系,如果是这样,如何在不修改核心文件的情况下实现此目的?

1 个答案:

答案 0 :(得分:1)

您采取了有趣的方法,但您需要采取不同的方法来解决此问题。扩展扩展了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 ;
            }
        }
    }
}