【问题标题】:Silverstripe Blog - DataExtension to Override FeaturedImage with SlideshowSilverstripe 博客 - DataExtension 用幻灯片覆盖 FeaturedImage
【发布时间】: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


【解决方案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 ;
            }
        }
    }
}

【讨论】:

  • 这个问题是BlogPost onBeforeWrite 在有很多关系被编辑时不会被调用。可以添加、重新排序或删除图像而不调用 onBeforeWrite
  • Cheers Flamer,我已经删除了不需要的字段等,我刚刚发布了与我的问题相关的代码以保持简单。正如 3dgoo 所说,如果我想在添加/订购图像时保持更新,我需要让 BlogImage 在他们的 BlogPost 上调用 write(),但除此之外,这是一个很好的解决方案。你确实让我走上了一条更好的道路,非常感谢。
  • Flamer,我已经实施了您的建议,并且效果很好。唯一的缺点是,如果用户添加、删除或重新排序图像以更新旧的 has_one 为 FeaturedImage,用户必须记住保存页面。我只是在 BlogImages 网格上方的 LiteralField 中放了一条粗体 HTML 消息,以提醒用户这样做。再次感谢。
  • 公平一点,你可以在BlogImage->onAfterWrite() 上做类似的事情来触发BlogPost 保存,然后用户就不需要记住保存BlogPost :)
  • 我确实尝试过,但没有成功,我也没有时间调查原因。我假设网格字段没有调用 write() 出于某种原因。这个周末我可能应该调查一下。
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多