在我SilverStripe 3.4环境我有一堆有一个附加的图像,例如不同的型号:
-
BlogPost
has_one
Image
(通过silverstripe /博客) -
Widget
has_one
Image
(通过silverstripe /窗口小部件) -
MyWidget
has_one
Image
(自定义模块)
欲防止图像例如ID 123从如果它在任何上述的用于在CMS管理员被删除(作为例子 - 这应该是系统宽)。
有没有办法,我可以检查有相关的图片一次全系车型,通过说不定办法Image belongs_many_many
查找什么?
你会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;
}
}