查找图像是否在任何地方使用

时间:2016-06-29 20:48:04

标签: php silverstripe

在我的SilverStripe 3.4环境中,我有许多具有附加图像的不同模型,例如:

  • BlogPost has_one Image(通过silverstripe / blog)
  • Widget has_one Image(通过silverstripe / widgets)
  • MyWidget has_one Image(自定义模块)

我想阻止图片,例如ID 123将在CMS管理员中被删除,如果它在上述任何一个中使用(例如 - 这应该是系统范围的。)

有没有办法可以一次检查所有具有相关图像的模型,可能通过Image belongs_many_many查找或其他什么?

1 个答案:

答案 0 :(得分:3)

您可能需要通过Image子类装饰DataExtension,并使用自定义$belongs_to或可能onBeforeDelete()声明validate()静态数组

无论如何,在任何一个地方你都可以调用一个例程来检查你的数据库是否有必要的条件。您可以选择使用哪种方法 由您的系统中可能删除Image记录的方案决定(例如,您可能有一些自动化的非人工任务,您希望避免的方案被播放 - 因此您要避免validate()并使用onBeforeDelete()

喜欢这个(完全未经测试!)

class MyImageExtension extends DatExtension
{

    public function onBeforeDelete()
    {
        if (!$this->imagesExistThatShouldNotBeDeleted()) {
            parent::onBeforeDelete();
        }
    }

    /**
     * @return boolean True if images exist that shouldn't be deleted, false otherwise.
     */
    private function imagesExistThatShouldNotBeDeleted()
    {
        $owner = $this->getOwner();
        $dataObjectSubClasses = ClassInfo::getValidSubClasses('DataObject');
        $classesWithImageHasOne = [];
        foreach ($dataObjectSubClasses as $subClass) {
            if ($classHasOneImage = $subClass::create()->hasOneComponent('Image')) {
                $classesWithImageHasOne[] = $classHasOneImage;
            }
        }

        if (in_array($owner->class, $classesWithImageHasOne)) {
            return true;
        }

        return false;
    }

}