Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-07-2008 23:09:08

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

[Résolu] redirection vers ErrorController en gardant l'URL intact

Bonjour,

J'ai eu beau cherché dans le forum, je n'ai pas trouvé de piste.  J'ai déjà en place un contrôlleur pour mes erreurs qui attrape les mauvais URL.  Donc, si je fais /asdasdasd, c'est bon. Il affiche la page 404 avec mon layout (j'utilise Zend_Layout)

Ce que j'aimerais faire, c'est qu'à l'interception d'un erreur majeur (exemple : mauvais ID dans l'URL), afficher la page d'erreur, sans rediriger.

Ce que je pensais était d'instancier le contrôlleur erreur, mais sans succès.  J,ai aussi essayé de forcer le render de la page d'erreur.  Le render de mon script d'erreur fonctionne, mais sans le layout.  Ce que j'aimerais c'est d'avoir le layout.

Quelqu'un a une idée??

Merci

Dernière modification par Mr.MoOx (28-07-2008 09:36:32)

Hors ligne

 

#2 26-07-2008 10:27:40

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

Hello,

Si tu gères ton ErrorController comme dans cet article, tu gardes ton url intact.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 27-07-2008 17:12:54

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

Bonjour,

Oui, j'ai implanter mon contrôlleur erreur pour attraper les erreurs lors du dispatch.  Ce que je veux faire, c'est afficher la page d'erreur (avec le layout) quand une action d'un autre controlleur génère une erreur majeure.

Donc, par exemple, disons que dans mon contrôlleur Article, l'action index valide si le numéro de l'article existe.
Si le numéro n'existe pas, je voudrais afficher la page d'erreur, mais en gardant l'URL intact.

Code:

class ArticleController extends Zend_Controller_Action 
{
    public function indexAction()
    {
         $articleID = $this->_getParam('article');

         ......
         //si article non valide, afficher page d'erreur
         if (!$notValideArticle) {
               INSTANCE DU ERRORCONTROLLER??????? COMMENT FAIRE????????
               $this->view->render();
               exit;
         }
    }


}

Dernière modification par zudre (27-07-2008 17:13:39)

Hors ligne

 

#4 27-07-2008 17:39:14

Mat
Membre
Lieu: Clermont-Ferrand
Date d'inscription: 20-07-2008
Messages: 15
Site web

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

Code:

throw new Exception('article non valide');

Ton controlleur d'erreur devrait recuperer l'exception et afficher la page d'erreur sans changer d'url.

Hors ligne

 

#5 27-07-2008 18:02:26

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

Et moi qui me compliquais la vie..... j'ai jamais pensé à ça! :-O
Merci!

Hors ligne

 

#6 13-08-2008 16:48:43

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

j'aurais une petite question, si l'on souhaite générer une 404 et non tombé dans le cas du défaut, comment faut il faire ?

lors du switch sur le type d'exception on a

Code:

switch ($this->_exception->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                 self::$httpCode = 404;
                self::$errorMessage = 'Page introuvable';
            break;
            ...
            default:
                 self::$httpCode = 500;
                 self::$errorMessage = 'Erreur inconnue';
            break;

Ce que j'aimerais c'est rajouter un cas pour le 404:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_PERSO:

et lancer l'exception, voila ce que j'ai essayé:
throw new Exception(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_PERSO);

une idée ?

Hors ligne

 

#7 13-08-2008 19:25:16

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

Humm!  Bonne question.
Je n'ai pas regardé comment assigner le $this->_exception->type.

Je vais regarder ça de mon côté.

Hors ligne

 

#8 14-08-2008 14:10:17

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

pour l'instant après quelque recherche j'ai toujours pas trouvé.

Et de ton coté ?

Hors ligne

 

#9 15-08-2008 18:42:03

cliknet
Membre
Date d'inscription: 22-11-2007
Messages: 12

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

Bonjour,

bucheron a écrit:

Ce que j'aimerais c'est rajouter un cas pour le 404:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_PERSO:

et lancer l'exception, voila ce que j'ai essayé:
throw new Exception(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_PERSO);

une idée ?

Le type d’erreur est défini par le code d’erreur dans ErrorHandler.



Voici un exemple qui pourra sûrement t’aider
Dans  …\library\Zend\Controller\Plugin\ErrorHandler.php (faire une copie du fichier avant de le transformer)

Code:

const EXCEPTION_INVALIDE_ACTION = 'EXCEPTION_INVALIDE_ACTION';

A la ligne 231 on a :

Code:

switch ($exceptionType) {
                case 'Zend_Controller_Dispatcher_Exception':
                    $error->type = self::EXCEPTION_NO_CONTROLLER;
                    break;
                case 'Zend_Controller_Action_Exception':
                    if (404 == $exception->getCode()) {
                        $error->type = self::EXCEPTION_NO_ACTION;
                    }else {
                        $error->type = self::EXCEPTION_OTHER;
                    }
                    break;
                    default:
                    $error->type = self::EXCEPTION_OTHER;
                    break;
            }

On rajoute :
                    elseif(405 == $exception->getCode()){
                      $error->type = self::EXCEPTION_INVALIDE_ACTION;
                    }

Code:

switch ($exceptionType) {
                case 'Zend_Controller_Dispatcher_Exception':
                    $error->type = self::EXCEPTION_NO_CONTROLLER;
                    break;
                case 'Zend_Controller_Action_Exception':
                    if (404 == $exception->getCode()) {
                        $error->type = self::EXCEPTION_NO_ACTION;
                    }
                    elseif(405 == $exception->getCode()){
                      $error->type = self::EXCEPTION_INVALIDE_ACTION;
                    } else {
                        $error->type = self::EXCEPTION_OTHER;
                    }
                    break;
                    default:
                    $error->type = self::EXCEPTION_OTHER;
                    break;

Pour faire un test on va dériver le contrôleur d’action et redéfinir la méthode __call() avec un code erreur '405'
\library\MesPLugins\action.php


Code:

<?php
class MesPLugins_Controller_Action extends Zend_Controller_Action
{    
    public function __call($method, $args)    
    {
        $action = $this->getRequest()->getActionName();
        if ('Action' == substr($method, -6)) 
        {            
            
            throw new Zend_Controller_Action_Exception(sprintf('Action : (%s)
            appelé par __call() est introuvable', $action), 405);
        }        

            
    }
}

class IndexController extends MesPLugins_Controller_Action

Code:

 class IndexController extends MesPLugins_Controller_Action 
{
    public function indexAction() 
    {
        // TODO  IndexController::indexAction() 
        
    }
}

Ensuite on passe au fichier ErrorController.php juste pour le temps du test on rajoute

echo $errors->exception->getCode();
echo $errors->type;


En tapant dans la bar d’adresse une action bidon
http://localhost/Zf_Tuto /index/actionBidon

le type et le code d’erreur sont  bien : 405 EXCEPTION_INVALIDE_ACTION


Source ErrorController.php

Code:

<?php

/**
 * ErrorController 
 * 
 * @author pierre
 * @version 1.01
 */

//require_once 'Zend/Controller/Action.php';

class ErrorController extends Zend_Controller_Action
{
    private static $errorMessage;
    
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');
        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_INVALIDE_ACTION:           
                $this->getResponse()->setRawHeader('HTTP/1.1 404 non trouvé');
                $this->view->title = 'Page Web introuvable ';
                self::$errorMessage = "La page que vous tentez d'accéder n'existe pas ou peut-être 
                 a t-elle été; enlevé";
                
                break;
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER:
                switch (get_class($errors->exception)) 
                {
                    case 'Zend_View_Exception' :
                        self::$errorMessage = 'Erreur de traitement d\'une vue';
                    break;
                    case 'Zend_Db_Exception' :
                        self::$errorMessage = 'Erreur de traitement dans la base de données';
                    break;
                    case 'Metier_Exception' :
                        self::$errorMessage = $errors->exception->getMessage();
                    break;
                    default:
                        self::$errorMessage = 'Erreur inconnue';
                    break;
                }
               
            default:
                $this->view->title = 'Application Error';
                break;
        }
     $reponse = $this->getResponse()->appendbody(self::$errorMessage,'error');  
     $errorVue = sprintf('<hr>DEBUG INFOS :<br />Exception de type: <em>%s</em> <br />
         %s<br /> envoyée dans %s à la ligne %d <hr>',
        get_class($errors->exception),
         $errors->exception->getMessage(),
         $errors->exception->getFile(),
         $errors->exception->getLine());
                   
        $this->view->message =  $reponse;
        $this->view->erreur = $errorVue;
        
          /*******[code/type Erreur]********/
        echo $errors->exception->getCode();
        echo $errors->type;                        
        /**********************************/                        
    }
}

Bon code A+.

Dernière modification par cliknet (15-08-2008 18:55:30)

Hors ligne

 

#10 16-08-2008 15:46:31

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: [Résolu] redirection vers ErrorController en gardant l'URL intact

inpeccable, ça marche niquel merci.

Par contre n'y a t'il pas un autre moyen de définir la constante et de rajouter le test case au niveau du plugin ?
Car si je fais une mise à jour du framework, et que je ne m'en souviens plus cela risque de poser un problème.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages