2016-07-06 1 views
3

Ища в this question я придумал следующее решение, которое вызывается из canDelete() в качестве расширения File:Найти, если признакам изображение на странице изменилось

protected function isFileInUse() 
{ 
    $owner = $this->getOwner(); 
    $dataObjectSubClasses = ClassInfo::subclassesFor('DataObject'); 
    $classesWithFileHasOne = []; 
    foreach ($dataObjectSubClasses as $subClass) { 
     $hasOnes = array_flip($subClass::create()->hasOne()); 
     if (array_key_exists($owner->class, $hasOnes)) { 
      $classesWithFileHasOne[$subClass] = $hasOnes[$owner->class]; 
     } 
    } 

    $threshold = (Director::get_current_page()->class == 'AssetAdmin') ? 1 : 2; 
    $uses = 0; 
    foreach ($classesWithFileHasOne as $class => $relation) { 
     $uses += count($class::get()->filter("{$relation}ID", $this->owner->ID)); 
     if ($uses >= $threshold) { 
      return true; 
     } 
    } 

    return false; 
} 

Существует один крайний случай я не могу получить вокруг, хотя. Если, скажем, выбранное изображение изменяется в сообщении в блоге, тогда, если есть одно другое использование одного и того же изображения, то при таком подходе он все равно позволит его удалить. Это происходит потому, что до тех пор, пока страница не будет сохранена, текущее изменение не учитывает использование изображения.

Порог установлен по-разному на страницах CMS и Media Manager, чтобы позволить удалять изображение с той страницы, которая его использует.

Есть ли способ, с помощью которого я могу получить доступ к содержащейся странице (или другому элементу - мы используем Elemental) из моего расширения файла, чтобы узнать, изменилось ли связанное с ним изображение?

ответ

2

Это решение, которое я в конечном итоге придумал. Я не совсем доволен необходимостью проверки запроса, но не вижу другого решения:

public function canDelete($member = null) 
{ 
    return !$this->isFileInUse(); 
} 

/** 
* Check if the file is in use anywhere on the site 
* @return bool True if the file is in use 
*/ 
protected function isFileInUse() 
{ 
    $owner = $this->getOwner(); 
    $dataObjectSubClasses = ClassInfo::subclassesFor('DataObject'); 
    $classesWithFileHasOne = []; 
    foreach ($dataObjectSubClasses as $subClass) { 
     $hasOnes = array_flip($subClass::create()->hasOne()); 
     if (array_key_exists($owner->class, $hasOnes)) { 
      $classesWithFileHasOne[$subClass] = $hasOnes[$owner->class]; 
     } 
    } 

    $threshold = ($this->isAssetAdmin() || ($this->isFileAttach($classesWithFileHasOne))) ? 1 : 2; 

    $uses = 0; 
    foreach ($classesWithFileHasOne as $class => $relation) { 
     $uses += count($class::get()->filter("{$relation}ID", $this->owner->ID)); 
     if ($uses >= $threshold) { 
      return true; 
     } 
    } 

    return false; 
} 

/** 
* Are we in the asset manager rather than editing a Page or Element? 
* @return bool 
*/ 
protected function isAssetAdmin() 
{ 
    return 'AssetAdmin' === Director::get_current_page()->class; 
} 

/** 
* Is the current action attaching a file to a field that we're interested in? 
* @param array $classesWithFileHasOne Classes with a relationship we're interested in and the name of the 
*          relevant field 
* @return bool 
*/ 
protected function isFileAttach($classesWithFileHasOne) 
{ 
    $controller = Controller::curr(); 
    $field = $controller->request->allParams()['FieldName']; 
    return (preg_match('/attach$/', $controller->requestParams['url']) && 
     ($controller->action == 'EditForm') 
     && (in_array($field, array_values($classesWithFileHasOne)))); 
} 
Смежные вопросы