找到的图片是否在任何地方使用(Find whether an Image is used anywh

2019-09-29 17:27发布

在我SilverStripe 3.4环境我有一堆有一个附加的图像,例如不同的型号:

  • BlogPost has_one Image (通过silverstripe /博客)
  • Widget has_one Image (通过silverstripe /窗口小部件)
  • MyWidget has_one Image (自定义模块)

欲防止图像例如ID 123从如果它在任何上述的用于在CMS管理员被删除(作为例子 - 这应该是系统宽)。

有没有办法,我可以检查有相关的图片一次全系车型,通过说不定办法Image belongs_many_many查找什么?

Answer 1:

你会PROB需要装饰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;
    }

}


文章来源: Find whether an Image is used anywhere