2010-07-16 2 views
1

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

Каскадирования работает отлично, но я не могу получить модель обратного вызова 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.

ответ

3

Я хотел бы сделать это таким образом:

в 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(), как Oscar предложить сделать фактическое удаление изображения:

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

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

Смежные вопросы