CakePHP | Usuwanie załączników podczas pracy z Media Plugin w CakePHP

Podczas pracy z CakePHP, każdy na pewno korzystał z różnych dodatków - component, plugin itp. Jednym z lepszych pluginów jest Media. Służy on do obsługi przesyłania plików, tworzenia miniaturek ze zdjęć. Moduł jest dobrze konfigurowalny i stosunkowo łatwy w obsłudze.

Korzystam z niego codziennie, ponieważ znacząco skraca czas pracy jaki jest potrzebny na przygotowanie różnych modułów na stronę. Powiedzmy, że trzeba przygotować moduł do przechowywania załączników - przesyłamy plik i podajemy jakąś nazwę dla niego. Przesyłanie pliku odbywa się już automatycznie, zapis do bazy informacji o pliku też jest automatyczny. Więcej informacji o Media będzie dostępne w innym artykule.

Problem jaki się często pojawiał to usuwanie załączników wraz z usuwaniem rekordów z bazy danych. Do rozwiązania potrzebna jest modyfikacja modelu.

var $actsAs = array( 'Media.Transfer', 'Media.Coupler', 'Tree' );

Najpierw musi być informacja, że korzystamy z Media oraz że korzystamy z Transfer i Coupler, tym razem nie chcemy Generator. Powyższy zapis informuje, że będziemy pliki przesyłać a nie generować miniaturki dla grafik, więc potem interesuje nas folder transfer w folderze media. Kolejnym krokiem jest dodanie funkcji beforeDelete, któraz zostaje wywołana tuż przed usuwaniem rekordu z bazy danych.

public function beforeDelete($cascade = true) {   if (!$cascade) {      return true;   }    $result = $this->find('first', array(      'conditions' => array($this->primaryKey => $this->id),      'fields' => array('dirname', 'basename'),      'recursive' => -1   ));   if (empty($result['nazwa_modelu']['basename'])) {      return true;   }    $pattern = MEDIA_FILTER . "*/";   $pattern .= $result[$this->alias]['dirname'] . '/';   $pattern .= pathinfo($result[$this->alias]['basename'], PATHINFO_FILENAME);    $files = glob("{$pattern}.*");    $name = Mime_Type::guessName($result[$this->alias]['basename']);    foreach ($files as $file) {      $File = new File($file);       if (!$File->delete()) {         return false;      }   }   return true; }

Powyższy kod zapewnia, że wraz z rekordem zostanie usunięty z serwera powiązany plik. Co natomiast w przypadku, gdy chcemy usunąć rekord do którego nie został przypisany żaden plik? W takiej sytuacji "włączy" się instrukcja warunkowa:

if (empty($result['Download']['basename'])) {   return true;}

Jeżeli pole informujące o nazwie pliku jest puste, zostaje zwrócone TRUE, więc pozwalamy usunąć rekord z bazy danych, tym samym nie przejmujemy się usuwaniem plików w dalszej części funkcji.

Kontakt