2016-06-29 17 views
1

In meiner Silvers 3.4 Umgebung verwendet wird, habe ich eine Reihe von verschiedenen Modellen, die ein Bild angehängt haben, zum Beispiel:finden, ob ein Bild irgendwo

  • BlogPosthas_oneImage (via Silvers/Blog)
  • Widgethas_oneImage (via Silvers/widgets)
  • MyWidgethas_oneImage (benutzerdefinierte Modul)

Ich möchte ein Bild verhindern z. ID 123 wird im CMS-Admin gelöscht, wenn es in einem der obigen Fälle verwendet wird (als Beispiel - dies sollte systemweit sein).

Gibt es eine Möglichkeit, dass ich alle Modelle überprüfen kann, die ein verwandtes Bild auf einmal haben, vielleicht über eine Image belongs_many_many Suche oder etwas?

Antwort

3

Sie würden prob brauchen Image über eine DataExtension Unterklasse dekorieren und ein $belongs_to statisches Array mit einem benutzerdefinierten onBeforeDelete() oder möglicherweise validate() erklären.

Unabhängig davon, wo Sie eine Routine aufrufen würden, die Ihre Datenbank auf die erforderlichen Bedingungen überprüft. Welche Methode für die Verwendung von Sie verwenden, hängt von den Szenarios ab, unter denen ein Datensatz Image in Ihrem System gelöscht werden könnte (z. B. haben Sie möglicherweise automatisierte, nicht-menschliche Aufgaben, bei denen das Szenario vermieden wird, das Sie vermeiden möchten.) d validate() vermeiden und onBeforeDelete())

Etwas wie dieser (Totally ungetestet verwenden!)

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; 
    } 

} 
+0

Dank Russell. Angenommen, ich weiß nicht, wie viele Modelle ein Image haben werden, kann ich dies mit dem gleichen Konzept erreichen, wie du es beschrieben hast, oder müsste ich alle Beziehungen kennen, damit dieser Ansatz funktionieren kann? –

+0

Ich habe die "Lösung" nach Ihrer Frage aktualisiert. Hinweis: Die obige Lösung geht davon aus, dass 'Image' has_one für alle Klassen, die eine haben,' Image' genannt wird. Wenn Sie 'Image' subclassiert haben, müssen Sie den Aufruf von' DataObject :: hasOneComponent() 'beispielsweise mit' in_array() 'ändern. – theruss

+1

Sie können das Löschen nicht verhindern, indem Sie nicht 'parent :: onBeforeDelete(); 'aufrufen. Dies in einer 'DataExtension' zu tun, hat keinerlei Auswirkungen. Selbst dies in der Klasse selbst zu tun wäre schlecht, da es einen "broken onBeforeDelete" -Fehler auslösen würde. Ich denke, es wäre besser, stattdessen die 'canDelete'-Berechtigung zu überschreiben? Oder wirf einen Fehler in 'onBeforeDelete', wenn du hardcore gehen willst. – bummzack

Verwandte Themen