Модель обратного вызова до удаления - PullRequest
1 голос
/ 16 июля 2010

Я пытаюсь удалить изображения при удалении контейнера этих изображений с каскадной моделью: delete

Каскадирование работает нормально, но я не могу вернуть вызов модели afterDelete для правильной работы, поэтомуЯ могу удалить реальные файлы изображений при выполнении удаления.

function beforeDelete() {
    $containerId = $this->id;
    $numberOfImages = $this->RelatedImage->find('count', array('conditions' => array('RelatedImage.container_id' => 'containerId')));
    if ($numberOfImages > 0){   
        $relatedImages = $this->RelatedImage->find('all', array('conditions' => array('RelatedImage.container_id' => 'containerId')));
        foreach ($relatedImages as $image) {
            $myFile = WWW_ROOT . 'image' . $containerId . '_i' . $image['RelatedImage']['id']  . '.jpg';
            unlink($myFile);
            $myThumb = WWW_ROOT . 'img/' . $image['RelatedImage']['thumbnail'];
            unlink($myThumb);
        }
        return true;
    } else{
        return false;
    }
}

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

Ответы [ 2 ]

3 голосов
/ 16 июля 2010

Я бы сделал это следующим образом:

в beforeDelete получить данные изображений

function beforeDelete(){
  $relatedImages = $this->RelatedImage->find('all', array('conditions' => array('RelatedImage.container_id' => 'containerId')));
  $this->relatedImages = $relatedImages;
  $this->currentId = $this->id; //I am not sure if this is necessary
  return true;
}

, а затем в afterDelete (), как Оскар предлагает сделать фактическое удаление изображения:

function afterDelete(){
  $relatedImages = $this->relatedImages;
  $containerId = $this->currentId; //probably this could be just $this->id;
  foreach ($relatedImages as $image) {
        $myFile = WWW_ROOT . 'image' . $containerId . '_i' . $image['RelatedImage']['id']  . '.jpg';
        unlink($myFile);
        $myThumb = WWW_ROOT . 'img/' . $image['RelatedImage']['thumbnail'];
        unlink($myThumb);
    }
}

таким образом вы сохраняете, даже если модель не удаляет запись, вы будете удалять изображения, только если удаление действительно произошло.

HTH

1 голос
/ 16 июля 2010

Если модели связаны с hasMany / hasOne, при их удалении должны вызываться как RelatedImage :: beforeDelete (), так и RelatedImage :: afterDelete (). Попробуйте вместо этого поместить логику удаления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...