【发布时间】:2016-02-17 12:06:43
【问题描述】:
我目前正在尝试用幻灯片替换 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 关系,如果需要,如何在不修改核心文件的情况下实现此目的?
【问题讨论】:
-
您的 Image 类是否对 BlogPost/Page/SiteTree 有一个 has_one? has_many 需要另一侧的对应物(has_one)。以这种关系扩展图像/文件,或者我会说使用 many_many。
-
确实如此,但这与我在这里提出的问题完全无关。关系在示例中的唯一原因是显示我正在尝试使用它下面的函数实现的目标。
-
我在原帖中添加了一些额外内容,希望这能让我更清楚我想要实现的目标。
-
我不知道如何取消设置扩展上的关系。出于好奇,你的 has_many 关系上的点符号应该做什么?为什么你的吸气剂需要这个?为什么你不能直接
return $this->owner->Images()->first(); -
首先,点符号确保 silverstripe 更新目标对象上返回的 has_one 关系的正确 id。例如,如果我有一个具有多个 has_one => 页面关系的对象。
标签: silverstripe