2012-08-05 4 views
11

Voglio visualizzare la pagina di errore 404 per che ho fatto il file error404.php nella mia cartella protetta/vista/sistema.YII come gestire la pagina di errore 404 personalizzata insieme ad altre pagine di errore

Per impostazione predefinita ho Sitecontroller e la funzione azione di errore, come di seguito

public function actionError() 
{ 
    if($error=Yii::app()->errorHandler->error) 
    { 

     if(Yii::app()->request->isAjaxRequest) 
      echo $error['message']; 
     else 
      $this->render('error', $error); 
    } 
} 

all'interno di configurazione principale file, viene definito come

'errorHandler'=>array(
     // use 'site/error' action to display errors 
     'errorAction'=>'site/error', 
    ), 

il mio problema è che ho bisogno di personalizzare solo 404 pagina che conteneva, resto dell'errore ho bisogno di gestire il modo in cui viene gestito dalla funzione di errore del sitecontroller. Ma non sono riuscito a trovare un modo per farlo. Se supponiamo che io rimuovo 'ErrorAction' => 'sito/error', dalla configurazione principale allora Mostrano l'errore 404 chiamando

 throw new CHttpException(404, 'Page not found'); 

ma facendo che posso vedere solo la pagina senza layout di anche altri errori personalizzati sono trattati come 404 mentre non lo sono. Ho letto il manuale molte volte ma non riesco ancora a risolverlo.

risposta

9

utilizzare questo codice per actionError:

$app = Yii::app(); 
if($error = $app->errorHandler->error->code) 
{ 
    if($app->request->isAjaxRequest) 
     echo $error['message']; 
    else 
     $this->render('error' . ($this->getViewFile('error' . $error) ? $error : ''), $error); 
} 

In vista/Area per creare error404.php per errori 404 e error.php per il resto.

oppure è possibile definire param nella configurazione per gli errori che ti piace di gestire in modo diverso e controllare il codice di errore contro di essa:

$app = Yii::app(); 
if($error = $app->errorHandler->error->code) 
{ 
    if(Yii::app()->request->isAjaxRequest) 
     echo $error['message']; 
    else  
     $this->render('error' . (in_array($error, $app->params[ 'customErrorPages' ]) ? $error : ''), $error); 
} 

gestore degli errori funziona così: quando HttpException nascono, componente controllerà se c'è qualche valore nella proprietà errorAction e se ce ne sono, eseguirà l'azione di questo controller. Se non c'è un valore impostato per la proprietà errorAction, verrà visualizzata la visualizzazione degli errori dalla cartella di sistema. Quindi non è necessario mescolare le viste di errore dalla cartella di visualizzazione del sistema e dalla cartella di visualizzazione del controllore.

+0

ho dovuto cambiarlo in questo 'if ($ error = Yii :: app() -> errorHandler-> errore ['code']) '' error-> code' era dandomi errori. Anche 'getViewFile' mi sta dando questo errore. 'CWebApplication e i suoi comportamenti non hanno un metodo o chiusura chiamato" getViewFile ". (/Applications/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266) 'Qualche idea? – user2636556

+0

il messaggio di errore per 'error-> code' è' Avviso: cercando di ottenere la proprietà di non-oggetto in /Applications/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php sulla riga 48' @ Boris – user2636556

+0

You sono giusti. Non esiste un metodo getViewFile nella classe app. Dovrebbe chiamare il metodo del controler: $ this-> getViewFile (...) –

3

Ogni volta che si verificano errori, viene chiamato l'errore di azione in siteController. puoi personalizzare il percorso dell'errore in quell'azione, puoi fare qualcosa del genere:

if(404==Yii::app()->errorHandler->error->code){ 
    //go to custome error page 
else 
    //code default error.php 
+0

significa indicare se la condizione di altrimenti altro all'interno della visualizzazione di errore e quindi aggiungere le visualizzazioni parziali di conseguenza? (Ho pensato che dovrebbe essere un automatico se sto usando error404.php all'interno della directory di sistema. ??? – wolvorinePk

+0

sì .. Non sono sicuro che funzioni con automatico ... vedere gli aggiornamenti. – bingjie2680

+0

in tutorial e aggiornamento del documento che ha Non ho abbastanza informazioni a riguardo, ho bisogno di gestire gli errori di default e il mio errore di personalizzazione per le pagine 404 o 405 personalizzate. Per questo ho aggiunto error404.php nella mia directory di sistema e per gestire gli errori di default sto usando il file di configurazione interno il nuovo controller controller di sistema, ma in qualche modo non funziona nel modo in cui io voglio – wolvorinePk

1

Non puoi farlo con .htaccess? Personalmente creo una cartella "errori" con tutti i file html php che contengono i messaggi di errore e modificano .htaccess per chiamare quelle pagine incontrando l'errore.

Link:

http://www.javascriptkit.com/howto/htaccess2.shtml

http://www.addedbytes.com/for-beginners/error-documents-for-beginners/

Esempi:

creare un file .htaccess nella directory si desidera che le pagine di errore per essere chiamati e nel testo file, scrivere la seguente riga:

supponendo che ci sia una pagina chiamata 404.html nella stessa directory, quando viene generato un errore 404 pagina non trovata, verrà chiamata la pagina 404.html.

Le stesse opere con altri codici di errore:

ErrorDocument 500  /500error.html 

assumendo un errore 500 è stato creato e un file 500error.html esiste nella stessa directory.

+0

so che ho fatto usando htaccess ma sto imparando YII e il mio sistema ha richiesto che io debba usarlo tramite yii. Gentilmente se avete qualche idea su come fare che usando yii perché anche il suo tutorial è molto vago e non offre affatto una vista più ampia. Aiutami ragazzi ... – wolvorinePk

1

Nelle ultime versioni del quadro (sto lavorando con 1.14) utilizzare:

Yii::app()->errorHandler->error['code'] 

perché errore è un array.