удалить загруженный файл из массива идентификаторов, когда они будут удалены в Joomla? - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь удалить массив идентификаторов, и когда он будет удален, я хочу, чтобы загруженный рисунок, связанный с ним, также был удален с помощью unlink.Я использую joomla и mysql для компонента admin mvc в joomla.

Мой код для контроллера в удалении имеет следующий вид:

function remove()
 {
        $arrayIDs = JRequest::getVar ( 'cid', null, 'default', 'array' );
 //Reads cid as an array
        $model = & $this->getModel ( 'greetings' );
        jimport ( 'joomla.filesystem.file' );
        if (is_array ( $arrayIDs ) && count ( $arrayIDs ) > 0) {

            foreach ( $arrayIDs as $k => $id ) {

                $del = $model->deleteGreetings ( $arrayIDs );



                if ($del) {

                    $getdeleted = $model->getUploadpic ( $id );

                    $deletefile = JPATH_COMPONENT . DS . "uploads" . DS . $uploadedfile;

                    unlink ( $deletefile );

                }

            }
        }

        if ($arrayIDs === null) { //Make sure the cid parameter was in the request
            JError::raiseError ( 500, 'cid parameter missing from the request' );
        }

        $redirectTo = JRoute::_ ( 'index.php?option=' . JRequest::getVar ( 'option' ) );
        $this->setRedirect ( $redirectTo, 'Deleted...' );

    }

... и для модели мой код:

    function deleteGreetings($arrayIDs) {
        $query = "DELETE FROM #__greetings WHERE id IN (" . implode ( ',', $arrayIDs ) . ")";
        $db = $this->getDBO ();
        $db->setQuery ( $query );
        if (! $db->query ()) {
            $errorMessage = $this->getDBO ()->getErrorMsg ();
            JError::raiseError ( 500, 'Error deleting greetings: ' . $errorMessage );
        } else {
            return TRUE;
        }
    }

1 Ответ

1 голос
/ 15 июля 2011

В вашем коде есть несколько проблем:

  1. $uploadedfile никогда не объявляется, но используется для поиска пути к файлу.Я предполагаю, что это то же самое, что и $getdeleted.
  2. У вас есть цикл foreach вокруг элементов в вашем массиве, который будет подбирать каждый элемент по очереди.Однако ваша модель функции deleteGreetings занимает весь массив.Вы должны удалить этот вызов функции из вашего цикла, иначе он будет вызываться для каждого элемента в массиве.Вы хотите вызвать это только один раз.
  3. Только в конце вашего контроллера вы проверяете, является ли ваш параметр cid нулевым ... в чем смысл?Вы должны сначала проверить это, прежде чем пытаться запустить любой другой код.

Я бы сделал что-то вроде этого:

$arrayIDs = JRequest::getVar ( 'cid', null, 'default', 'array' );
if ($arrayIDs === null) { //Make sure the cid parameter was in the request
  JError::raiseError ( 500, 'cid parameter missing from the request' );
}
$model = & $this->getModel ( 'greetings' );
jimport ( 'joomla.filesystem.file' );
if (is_array ( $arrayIDs ) && count ( $arrayIDs ) > 0) {
  $del = $model->deleteGreetings ( $arrayIDs );
  // check this outside the loop, if it is inside you are checking it for 
  // each element in the array. Here we check once and then go forward.
  if ($del) {
    foreach ( $arrayIDs as $k => $id ) {
      $uploadedfile = $model->getUploadpic ( $id );
      $deletefile = JPATH_COMPONENT . DS . "uploads" . DS . $uploadedfile;
      JFile::delete($deletefile);
      //unlink ( $deletefile );
    }
  }
}
...