Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-08-2009 11:54:10

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Problèmes pour autoloader des modèles de modules

Bonjour,

J'ai un problème pour autoloader les modèles de mes modules (j'utilisais un version antérieur à la 1.8 de ZF et j'ai voulu migrer mon application). Pour le moment j'essais d'autoloader les modèles du module "Default" depuis le bootstrap mais sans succès (voir code ci-dessous).

J'ai une architecture comme suite (hébergeur oblige, l'index est à la racine) :

site
---application/
------bootstrap.php
------configs/
---------application.ini
------layouts/
------modules/
---------default/
------------config/
------------controllers/
---------------IndexController.php
------------forms/
------------models/
---------------Maclasse.php
------------services/
------------views/
---------module2/
---------etc./
---library/
------Zend/
---public/
------images/
------scripts/
------styles/
---tmp/
------cache/
------sessions/
------view_compiles/
index.php

le contenu de index.php :

Code:

<?php
// index.php
//
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

le contenu de application.ini :

Code:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0

includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "username"
resources.db.params.password = "password"
resources.db.params.dbname = "dbname"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction = "index"
resources.frontController.defaultModule = "default"

resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH "/layouts"

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

le contenu de bootstrap.php :

Code:

<?php
// application/bootstrap.php
//
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    public function run()
    {
        Zend_Registry::set('config', new Zend_Config($this->getOptions()));
        parent::run();
    }

    //ENVIONMENT
    protected function _initEnvironment()
    {
        error_reporting(E_ALL|E_STRICT);
        ini_set('display_errors', true);
        date_default_timezone_set('Europe/Zurich');
    }

    /**
    * Initialize data bases
    *
    * @return Zend_Db::factory
    */
    protected function _initDb()
    {
        //on charge notre fichier de configuration
        $config = new Zend_Config($this->getOptions());
        //On essaye de faire une connection a la base de donnee.
        try{
             $db = Zend_Db::factory($config->resources->db);
             //on test si la connection se fait
             $db->getConnection();
             $db->query("SET NAMES 'utf8'");
         }catch ( Exception $e ) {
             exit( $e -> getMessage() );
         }
         // on stock notre dbAdapter dans le registre
         Zend_Registry::set( 'dba', $db );
         return $db;
    }

    /**
    * Initialize session
    *
    * @return Zend_Session_Namespace
    */
    protected function _initSession()
    {
        // On initialise la session
        $session = new Zend_Session_Namespace('s_user', true);
        return $session;
    }

    /**
    * Initialize default Module
    *
    * @return Zend_Application_Module_Autoloader
    */
    protected function _initAutoloadDefaultModule()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath'  => APPLICATION_PATH . '/modules/default'));

        return $loader;
    }

    /**
     * Initialize view
     *
     * @return Zend_View
     */
    protected function _initView()
    {
        // Initialize view
        $view = new Zend_View();
        $view->doctype('XHTML1_STRICT');
        $view->setEncoding('UTF-8');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
        // Add it to the ViewRenderer
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $viewRenderer->setView($view);
        // Return it, so that it can be stored by the bootstrap
        return $view;
    }
}

J'ai un controlleur /site/application/modules/default/controllers/IndexController.php depuis lequel j'essais d'accéder à la classe /site/application/modules/default/models/Maclasse.php comme suite mais sans succès (le framework n'arrive pas à trouver la classe):

Code:

<?php
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->view->pageTitle = 'Titre de la page Site';
        $this->view->titre = 'Titre de Site sur la page';
        [b]//Si je commente la ligne ci-dessous, la page s'affiche bien
        Model_Maclasse::find(1)->getName();[/b]
        $this->view->message = "blabla...";

    }
}

Merci d'avance pour votre aide.

Dernière modification par Davjack (18-08-2009 13:02:40)

Hors ligne

 

#2 18-08-2009 12:01:08

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Problèmes pour autoloader des modèles de modules

essai en appelant ta class Default_Maclasse, avec models il va chercher dans default/models

Hors ligne

 

#3 18-08-2009 12:08:26

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Problèmes pour autoloader des modèles de modules

A force de faire des essais, j'ai oublié de modifié mon exemple...
Bootstrap:

Code:

...
    protected function _initAutoloadDefaultModule()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath'  => APPLICATION_PATH . '/modules/default'));

        return $loader;
    }
...

Et bien sûr... ça ne fonctionne pas avec un Model_Maclasse...

Hors ligne

 

#4 18-08-2009 12:25:08

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Problèmes pour autoloader des modèles de modules

ta classe Maclasse doit être dans le dossier Model sinon sa ne marchera pas, dans ton explication elle est à la racine de default

Hors ligne

 

#5 18-08-2009 12:28:06

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Problèmes pour autoloader des modèles de modules

Encore une faute de frappe de ma part mais elle est bien dans le répertoire models/

Hors ligne

 

#6 18-08-2009 14:48:27

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Problèmes pour autoloader des modèles de modules

chez moi je suis obligé de metre Default_Models_Maclasse sinon sa marche pas et ton fichier doit s'appeler Maclasse.php

Hors ligne

 

#7 21-08-2009 13:11:53

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Problèmes pour autoloader des modèles de modules

Mon fichier s'appelle bien Maclasse.php. Pour ce qui est de l'appel, je fais un Model_Maclasse (Model étant défini dans la classe Zend_Application_Module_Autoloader) et je ne mets pas de Default comme toi car mon namespace est ''. J'ai également essayé de mettre le namespace 'Default' et de charger ma classe avec Default_Model_Maclasse sans succès (toujours un class not found).
J'ai affiché le contenu de $loader avec Zend_Debug et apparemment tout est ok (les namespaces tels que Model apparaissent bien et leur chemin est correcte).
Je dois dire que je suis perdu là... sad

Hors ligne

 

#8 21-08-2009 14:58:11

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Problèmes pour autoloader des modèles de modules

Dans le contrôleur IndexController.php, j'ai fait un

Code:

$loader=Zend_Loader_Autoloader::getInstance();
Zend_Debug::dump($loader->getAutoloaders());

et tout les namespaces et chemins s'affichent bien.

Je ne comprend pas pourquoi si je fais en dessous du code susmentionné (le modèle Test1.php existe bien wink)

Code:

$test = new Model_Test1("un nom");
// J'ai également, en désespoir de cause, testé avec
//$test = new DefaultModel_Test1("un nom");
echo $test->getNom();

le système n'arrive pas à trouver la classe.

Dernière modification par Davjack (21-08-2009 14:59:42)

Hors ligne

 

#9 21-08-2009 15:22:04

Eureka
Membre
Date d'inscription: 18-07-2009
Messages: 81

Re: Problèmes pour autoloader des modèles de modules

Question basique dont je n'ai pas trouvé la réponse au fil des posts : ta classe, dans le fichier Test1.php s'appelle bien Model_Test1 ?

Hors ligne

 

#10 21-08-2009 15:26:43

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Problèmes pour autoloader des modèles de modules

Eureka, tu as trouvé! (et c'est le cas de le dire). Mes classes s'appellent comme le nom du fichier (avec la manière de charger les modèles sur les versions antérieures à la 1.8, ça allait très bien).
Je suis obligé de renommer tous mes modèles si j'ai bien compris? C'était le truc qui m'avais échappé apparemment.
En tout cas merci

Dernière modification par Davjack (21-08-2009 15:30:10)

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