Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#26 18-06-2008 22:18:06

Akis
Membre
Date d'inscription: 29-03-2008
Messages: 86
Site web

Re: [Zend_Translate][1.5]ZF et le multilingue : multiple questions

Comment faire pour récupérer la langue qu'il y a dans l'url dans le bootstrap ?

Pour avoir directement le site dans la bonne langue en fonction de l'url, je pensais faire ceci :

Code:

$locale = new Zend_Locale(self::$frontController->getRequest()->getParam("language","en"));

(En créant bien un object request que j'affecte à mon frontcontroller)

Mais ça m'affiche tjs la langue Anglais comme il n'arrive pas à récupérer le paramètre...

Comment je peux faire svp ?

Hors ligne

 

#27 05-12-2008 14:50:41

dquintard
Membre
Date d'inscription: 16-09-2008
Messages: 18

Re: [Zend_Translate][1.5]ZF et le multilingue : multiple questions

Bonjour,
Je cherche a garder des urls classiques du type : http://localhost/page.php
Ma problématique principale est de gérer différents noms de page qui pointent vers le même controller (pour la gestion multilingue par exemple) :

Code:

http://localhost/inscription.php => InscriptionController
http://localhost/registration.php => InscriptionController

J'ai trouvé une solution ci dessous et qui permet de gérer les pages 404:

voici mon index.php:

Code:

<?php
$bootstrap = true;   
  
// Step 2: Perform application-specific setup   
// This allows you to setup the MVC environment to utilize. Later you can re-use this file for testing your applications   
//require '../application/frontControler.php';    
require '../application/bootstrap.php';    

// *************************************
// démarrage de la boucle de dispatching
// *************************************
$frontController->dispatch();
?>

voici mon bootstrap.php:

Code:

if (isset($bootstrap) && $bootstrap) {    
    // Step 1b: Add our {{library}} directory to the include path so that PHP can find the Zend Framework classes.   
    set_include_path(dirname(__FILE__).'/../../library' . PATH_SEPARATOR .
    dirname(__FILE__) . PATH_SEPARATOR .
    dirname(__FILE__).'/modules/default/models' . PATH_SEPARATOR .
    dirname(__FILE__).'/modules/default/models/DAO' . PATH_SEPARATOR .
    dirname(__FILE__).'/modules/default/models/phpmailer' . PATH_SEPARATOR .
    dirname(__FILE__).'/modules/tchat/models' . PATH_SEPARATOR .
    get_include_path());

    // Step 1c: Set up autoload.   
    // This is a nifty trick that allows ZF to load classes automatically so that you don't have to litter your   
    // code with 'include' or 'require' statements.   
    require_once "Zend/Loader.php";   
    Zend_Loader::registerAutoload();
}

// Step 2: Get the front controller.  
// The Zend_Front_Controller class implements the Singleton pattern, which is a design pattern used to ensure  
// there is only one instance of Zend_Front_Controller created on each request.  
// Controller init
Zend_Loader::loadClass('Zend_Controller_Front');
$frontController = Zend_Controller_Front::getInstance();

// enregistrement du plugin dans index.php
$frontController->registerPlugin(new Initializer('development'));
?>

et mon plugin Initializer.php:

Code:

<?php
class Initializer extends Zend_Controller_Plugin_Abstract {
    
    public function __construct ($env = 'production') {
        // la date 
        date_default_timezone_set('Europe/Paris');

        Zend_Controller_Front::getInstance()->setParam('noErrorHandler',false);

        // On indique l'endroit où sont placés les contrôleurs
        Zend_Controller_Front::getInstance()->addModuleDirectory(dirname(__FILE__).'/modules');

        // Set a variable in the front controller indicating the current environment --   
        // commonly one of development, staging, testing, production, but wholly   
        // dependent on your organization and site's needs.   
        Zend_Controller_Front::getInstance()->setParam('env', 'development');

        // désactivation de Zend_View pour pouvoir utiliser phpBB2  
        Zend_Controller_Front::getInstance()->setParam("noViewRenderer",true);
    }
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        // Gestion des controllers à appeler en fonction des paramètres de l'url
    
//la methode Page::getKey extrait le nom de la page et matche avec un fichier de config pour trouver le nom du controller associé
        $controllerReel = Page::getKey($_SERVER["REQUEST_URI"]); ex: http://localhost/registration.php retourne 'inscription'
        
        $request->setControllerName($controllerReel);

        $dispatcher = Zend_Controller_Front::getInstance()
                                                ->getDispatcher();

        if($dispatcher->isDispatchable($request)) {
            //echo "DISPATCHABLE<br>";            
        } else {
            //echo "NON DISPATCHABLE<br>";
            $request->setControllerName("error404");
            $request->setActionName("index");
        }
        $request->setDispatched(true);
    }
}
?>

Ma seconde problématique est de gérer TOUTES les exceptions et non uniquement les erreurs 404.
J'ai donc utilisé le tutoriel de Julien Pauli en créant le controller suivant:

Code:

<?php
class ErrorController extends Zend_Controller_Action
{
    private $_exception;
    private static $errorMessage;
    private static $httpCode;
    
    public function preDispatch()
    {
        $this->_helper->viewRenderer->setNoRender(true); // ne rend aucune vue automatiquement
        $this->_exception = $this->_getParam('error_handler');
        $this->_response->clearBody(); // on vide le contenu de la réponse
        $this->_response->append('error',null); // on ajoute un segment 'error' dans la réponse
        
        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;
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER:
                switch (get_class($this->_exception->exception)) {
                    case 'Zend_View_Exception' :
                        self::$httpCode = 500;
                        self::$errorMessage = 'Erreur de traitement d\'une vue';
                    break;
                    case 'Zend_Db_Exception' :
                        self::$httpCode = 503;
                        self::$errorMessage = 'Erreur de traitement dans la base de données';
                    break;
                    case 'Metier_Exception' :
                        self::$httpCode = 200;
                        self::$errorMessage = $this->_exception->exception->getMessage();
                    break;
                    case 'Autre_Exception' :
                        self::$httpCode = 500;
                        self::$errorMessage = 'Exemple avec une "autre exception"';
                    break;
                    default:
                        self::$httpCode = 500;
                        self::$errorMessage = 'Erreur inconnue';
                    break;
                }
            break;
        }
        
    }
    
    public function errorAction()
    {
        $this->getResponse()->setHttpResponseCode(self::$httpCode);
        $this->_errorMessage .= sprintf("<p>%s</p>",self::$errorMessage);
    }
    
    public function postDispatch()
    {
        $this->getResponse()->appendbody($this->_errorMessage,'error');
        $this->getResponse()->appendbody('<a href="javascript:history.back()">retour</a>','error');
        //if (Zend_Registry::get('config')->debug == 'true') {
            $message = sprintf('<hr>DEBUG INFOS :<br /><strong>Exception de type <em>%s</em> <u>%s</u> envoyée dans %s à la ligne %d </strong> <p>Stack Trace : %s </p><hr>',
                                get_class($this->_exception->exception),
                                $this->_exception->exception->getMessage(),
                                $this->_exception->exception->getFile(),
                                $this->_exception->exception->getLine(),
                                Zend_Debug::dump($this->_exception->exception,null,false)
                               );
            $this->getResponse()->append('debug',$message);
        //}
    }
}
?>

Mon fichier index devient:

Code:

<?php
$bootstrap = true;
include(dirname(__FILE__)."/../application/bootstrap.php");

try {
    $frontController->dispatch(); // dispatche !
} catch(Exception $e){
    echo "ERREUR dispatching :<br>";
    echo $e->getMessage();
}
?>

Je modifie la méthode predispatch de mon plugin Initializer:

Code:

<?php
....
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        // Gestion des controllers à appeler en fonction des paramètres de l'url
        //la methode Page::getKey extrait le nom de la page et matche avec un fichier de config pour trouver le nom du controller associé

        $controllerReel = Page::getKey($_SERVER["REQUEST_URI"]); ex: http://localhost/registration.php retourne 'inscription'
        
        //$request->setControllerName($controllerReel);
        $request->setControllerName("existepas");

    }
...
?>

Mais dans ce cas de figure le traitement effectué dans ma méthode preDispatch empêche la capture des erreurs par ErrorController.
Si je supprime la methode predispach, la gestion des exceptions fonctionne a nouveau mais alors je ne sais pas ou placer la coeur de mon traitement à savoir:

Code:

$controllerReel = Page::getKey($_SERVER["REQUEST_URI"]); ex: http://localhost/registration.php retourne 'inscription'
$request->setControllerName($controllerReel);

Je ne sais pas comment faire.
Je me dis qu'il faut agir sur l'objet Request avant l'appel de la méthode predispatch.
J'ai lu qu'on pouvait "sous classer" l'objet Zend_Controller_Request_Abstract (http://framework.zend.com/manual/fr/zen … quest.html) alors voici ce que j'ai réalisé sans succès dans mon fichier index.php:

Code:

<?php
$bootstrap = true;
include(dirname(__FILE__)."/../application/bootstrap.php");

$myControllerRequest = new MyControllerRequest();
$controllerReel = Page::getKey($_SERVER["REQUEST_URI"]); ex: http://localhost/registration.php retourne 'inscription'
$myControllerRequest->setControllerName($controllerReel);
try {
    $frontController->dispatch($myControllerRequest); // dispatche !
} catch(Exception $e){
    echo "ERREUR dispatching :<br>";
    echo $e->getMessage();
}
?>

Code:

<?php
class MyControllerRequest extends Zend_Controller_Request_Abstract
{
    /**
     * Controller
     * @var string
     */
    protected $_controller;

    /**
     * Set the controller name to use
     *
     * @param string $value
     * @return Zend_Controller_Request_Abstract
     */
    public function setControllerName($value)
    {
        $this->_controller = $value;
        return $this;
    }
}
?>

Ca ne fonctionne toujours pas.
Pouvez vous me dire si cette méthode est la bonne ou si je dois faire autrement?

Merci de votre aide.

Dernière modification par dquintard (05-12-2008 15:29:33)

Hors ligne

 

#28 05-12-2008 14:57:00

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Translate][1.5]ZF et le multilingue : multiple questions

Par pitié, utilise les balises bbcode 'code' !!


----
Gruiiik !

Hors ligne

 

#29 05-12-2008 15:25:35

dquintard
Membre
Date d'inscription: 16-09-2008
Messages: 18

Re: [Zend_Translate][1.5]ZF et le multilingue : multiple questions

nORKy a écrit:

Par pitié, utilise les balises bbcode 'code' !!

C'est fait!
Désolé je n'ai pas l'habitude de poster dans des forums

Hors ligne

 

#30 05-12-2008 16:12:10

dquintard
Membre
Date d'inscription: 16-09-2008
Messages: 18

Re: [Zend_Translate][1.5]ZF et le multilingue : multiple questions

Ma seconde problématique est de gérer TOUTES les exceptions et non uniquement les erreurs 404.
J'ai donc utilisé le tutoriel de Julien Pauli en créant le controller suivant:

Je modifie la méthode predispatch de mon plugin Initializer:

Code:

<?php
....
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        // Gestion des controllers à appeler en fonction des paramètres de l'url
        //la methode Page::getKey extrait le nom de la page et matche avec un fichier de config pour trouver le nom du controller associé

        $controllerReel = Page::getKey($_SERVER["REQUEST_URI"]); ex: http://localhost/registration.php retourne 'inscription'
        
        //$request->setControllerName($controllerReel);
        $request->setControllerName("existepas");

    }
...
?>

Mais dans ce cas de figure le traitement effectué dans ma méthode preDispatch empêche la capture des erreurs par ErrorController.

J'ai trouvé la solution pour que ErrorController fonctionne.
Il y avait un pb lors de la boucle de dispatching.
Voici la méthode predispatch correcte:

Code:

<?php
....
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
$controllerName = $request->getControllerName();
if($controllerName!="error") {
// Gestion des controllers à appeler en fonction des paramètres de l'url
        //la methode Page::getKey extrait le nom de la page et matche avec un fichier de config pour trouver le nom du controller associé

        $controllerReel = Page::getKey($_SERVER["REQUEST_URI"]); ex: http://localhost/registration.php retourne 'inscription'
        
        $request->setControllerName($controllerReel);
}
    }
...
?>

En espérant que ca puisse servir à qqun....

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