2014-02-19 2 views
0

Я пытаюсь реализовать dropzone.js в своем приложении CakePHP. Пока все прошло хорошо. За исключением случаев, когда я получаю сообщение об ошибке, отображается вся страница ошибок HTML, а не отображается. Который превращается в кучу HTML-кода, не совсем читаемый и потому что окно с ошибкой становится настолько большим, что я не могу нажать кнопку «удалить». Смотрите рисунок ниже:Ошибка CakePHP Dropzone.js Ajax

Как только я получаю сообщение об ошибке: enter image description here

Когда я парить коробку, после получения ошибки: enter image description here

Я знаю, что причина в том, что dropzone.js признает ошибку из-за 500 заголовка страницы Ajax (я бросаю исключение, если что-то пойдет не так). И CakePHP отображает полный макет для 500 страниц ошибок. Поэтому мне не удается просто просмотреть ошибку в одной строке. И мне действительно нужен заголовок 500, потому что еще dropzone.js думает, что все пошло хорошо ....

Итак, мой вопрос: возможно ли НЕ отображать 500-макет ошибок при получении ошибки 500 в рамках определенного метода контроллера ? Я не хочу полностью отключать рендеринг макетов 500. Только для страниц AJAX.

public function admin_add($slug = null) { 
    if(!$slug || !$client = $this->Video->Client->find('first', array('conditions' => array('slug' => $slug)))) { 
     throw new NotFoundException(__('Invalid client')); 
    } 

    if ($this->request->is('post')) { 

     // If request contains files, continue 
     if (!empty($_FILES)) { 
      // Get slug from URL 
      $slug = substr($this->referer(), strrpos($this->referer(), '/')+1); 

      // Create new folder for the movies if it doesn't exist already 
      if (!file_exists(WWW_ROOT.'/files/'.$slug)) { 
       mkdir(WWW_ROOT.'/files/'.$slug, 0777, true); 
      } 

      $tempFile = $_FILES['file']['tmp_name']; 
      $targetPath = '/files/'.$slug.'/'; 
      $targetFile = $targetPath. $_FILES['file']['name']; 

      // Create variable filename without the extension 
      $fileWithoutExt = preg_replace("/\\.[^.\\s]{3,4}$/", "", $_FILES['file']['name']); 

      // Add file to Video array 
      $video['Video'] = array('video' => $targetFile, 'screenshot' => '/files/'.$slug.'/screenshots/'.$fileWithoutExt.'.jpg', 'client_id' => $client['Client']['id']); 
      // unset($video); 
      // Try moving the file to their final directory 
      if(!move_uploaded_file($tempFile, WWW_ROOT.$targetFile)) { 
       throw new NotFoundException(__('Move image to "'.WWW_ROOT.$targetPath.'" failed')); 
      } 

      // Create new folder for the screenshots if it doesn't exist already 
      if (!file_exists(WWW_ROOT.'/files/'.$slug.'/screenshots/')) { 
       mkdir(WWW_ROOT.'/files/'.$slug.'/screenshots/', 0777, true); 
      } 

      // Try saving video to Video table in the database 
      if(!$this->Video->save($video)){ 
       throw new NotFoundException(__('Failed connecting client with "'.$targetFile.'" in the database')); 
      } 
     } 
     $this->Session->setFlash(__('Videos successfully uploaded'), 'default', array(), 'success'); 
     $this->redirect($this->referer()); 
    } 
    $title_for_layout = $client['Client']['name']; 
    $this->set(compact('title_for_layout', 'client')); 
} 
+0

короткий ответ: ДА, это возможно. если вы предоставите больше исходного кода, мы можем предоставить более конкретные рекомендации. – Vadim

+0

Хорошо, я отправлю метод CakePHP для добавления загрузок dropzone.js в базу данных (эта функция также создает исключения и, следовательно, 500 ошибок) завтра, как только я нахожусь в офисе. –

+0

Voila, см. Выше. –

ответ

0
  1. Вы можете изменить настраивали код состояния с использованием statusCode метод CakeResponse класса. Что-то вроде этого: $this->response->statusCode(404);
  2. Неправильно использовать NotFoundException, чтобы вернуть код статуса http. По крайней мере, вы можете создать свое собственное исключение приложения

Пожалуйста, проверьте Creating your own application exceptions

Вы легко определить один исключение:

class MissingWidgetException extends CakeException {}; 

И после этого вы можете использовать его и отправить HTTP код статуса который вам нужен Creating custom status codes:

throw new MissingWidgetHelperException('Its not here', 501); 

501 - код состояния http.

Надеюсь, это поможет найти правильное решение.

+0

Спасибо! Пока все идет хорошо. Кроме того, я признаю, что мне действительно нужна ошибка 500, чтобы предотвратить dropzone.js от завершения загрузки. Он останавливается только при ошибке 500. Итак, есть ли возможность создать один настраиваемый макет 500 только для текущего метода управления? Я могу изменить 500.ctp в Ошибки, но я хочу, чтобы макет для других методов контроллера .... –

+1

500 ошибка, это просто сервер, возвращающий http-код состояния 500, так что вы можете использовать '$ this-> response-> statusCode (500); 'и сделать то, что вам действительно нужно. Подробнее о том, как вернуть код состояния http, вы можете найти здесь: http://stackoverflow.com/questions/1100867/how-do-you-specify-an-http-status-code-in-cakephp/20757644 – Vadim

+0

Хорошо ! Это работает довольно хорошо, теперь :) Я больше не получаю огромную кучу кода :) Спасибо за вашу помощь! –