Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-12-2010 17:50:28

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Impossible d'accéder à mes models

Bonjour,

J'ai un petit problème avec Zend je n'arrive pas à accéder à mes Modele car dans mon application.
Je ne sais pas comment débugguer pour voir où Zend va chercher mes models. j'ai une application pour module mais avec le même répertoire pour mes modele.

Bootstrap.php :

Code:

<?php #coding: utf-8
// Step 1: APPLICATION CONSTANTS - Set the constants to use in this application.
// These constants are accessible throughout the application, even in ini
// files. We optionally set APPLICATION_PATH here in case our entry point
// isn't index.php (e.g., if required from our test suite or a script).
require_once 'constant.inc.php';


/**
 * bootstrap ancêtre
 * @todo à partir de ZF 1.10, faire hériter de Zend_Application_Bootstrap_Bootstrap
 * @package exposehome
 * @subpackage kernel
 * @category bootstrap
 * @author ECAROT
 *
 */
abstract class Bootstrap
{
    /**
     * @var Zend_Controller_Front
     */
    protected static $_frontController = null;

    /**
     * @var Zend_Registry
     */
    protected static $_registry = null;

    /**
     * mise en place d'un système de cache
     * @access private
     */
    protected static function _setupCache()
    {
       /* if (! is_dir(GRC_TEMP_DIR)) {
            mkdir(GRC_TEMP_DIR);
        }


        self::$_registry->set('cache', $cache);*/
    }

    /**
     * Set up autoloading
     */
    static protected function _autoload()
    {
        require_once 'Zend/Loader/Autoloader.php';
        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->setFallbackAutoloader(true);

        //Configure l'autoload pour inclure le module portail_citoyen et le module portail_accueil

        new Zend_Application_Module_Autoloader(
            array(
                'namespace' => 'Portaildta_',
                'basePath'  => dirname(__FILE__) . '/modules/portaildta',
                'resourceTypes' => array(
                    'library' => array(
                        'path'      => 'library/',
                        'namespace' => 'Library'
                    ),
                    'models' => array(
                        'path'      => 'models/',
                        'namespace' => 'Model' /* sans 's' */
                    )
                )
            )
        );
    }


    /**
     * @param string $config_file_path
     * @param string $section
     * @access private
     * @return Zend_Config_Ini
     */
    protected static function _setupConfig($configFilePath, $section)
    {
        // CONFIGURATION - Setup the configuration object
        // The Zend_Config_Ini component will parse the ini file, and resolve all of
        // the values for the given section.  Here we will be using the section name
        // that corresponds to the APP's Environment
        return new Zend_Config_Ini($configFilePath, $section);
    }

    /**
     *
     */
    /*protected static function _setupDatabase()
    {
        $db = Zend_Db::factory(Zend_Registry::get('configuration')->database);
        Zend_Db_Table::setDefaultAdapter($db);

        //$db = Zend_Db::factory($configuration->database);
        //Zend_Db_Table_Abstract::setDefaultAdapter($db);
        //self::$_registry->set('dbAdapter', $db);
    }
    */


    /**
     * mise en place de la "ZFDebug toolbar"
     */
    protected static function _setupDebug()
    {
        // seulement si on est en mode "development"
        if (APPLICATION_ENV != 'development') {
            return;
        }

        // et seulement si on n'est pas sous IE
        // (car message d'erreur javascript si on est sous IE)
        $req = new Zend_Controller_Request_Http();
        $ua = $req->getServer('HTTP_USER_AGENT');
        unset($req);
        // NB : possible d'utiliser $browser = get_browser(null, true); mais nécessite un browscap.ini
        if ((strpos($ua, 'Chrome') === false)
            and (strpos($ua, 'Firefox') === false)
            and (strpos($ua, 'Opera') === false)) {
            return;
        }

        // toutes les conditions sont réunies, mise en place de la toolbar
        $options = array(
            'jquery_path' => '/js/jquery.js',
            'plugins' => array(
                'Variables',
                'Html',
                 /*'Database' => array('adapter' => array('standard' => $db)),*/
                   'File' => array('basePath' => APPLICATION_PATH),
                   'Memory',
                   'Time',
                   'Registry',
                   /*'Cache' => array('backend' => $cache->getBackend()), */
                   'Exception'
            )
        );

        $debugBar = new ZFDebug_Controller_Plugin_Debug($options);
        self::$_frontController->registerPlugin($debugBar);
    }

    /**
     * démarrage du MVC
     * @param $configuration Zend_Config_Ini
     * @access private
     */
    protected static function _setupLayout($configuration)
    {
        //$layout_path['pluginClass'] = 'WinWinweb_Layout_Controller_Plugin_Layout';
        Zend_Layout::startMvc($configuration);
    }

    /**
     * définit le système de log
     * @param string $file
     */
    protected static function _setupLogger($file)
    {
        $logger = new Zend_Log();
        // pour déraciner le log (écrire nulle part):
        //$logger->addWriter(new Zend_Log_Writer_Null());
        //$logger->addWriter(new Zend_Log_Writer_Firebug());
        $logger->addWriter(new Zend_Log_Writer_Stream($file));

        // choix du niveau de debuggage
        $logLevel = intval(Zend_Registry::get('configuration')->logLevel);
        $logger->addFilter(new Zend_Log_Filter_Priority($logLevel));
        /*
        EMERG  0 : Urgence : le système est inutilisable
        ALERT  1 : Alerte: une mesure corrective doit être prise immédiatement
        CRIT   2 : Critique : états critiques
        ERR    3 : Erreur: états d'erreur
        WARN   4 : Avertissement: états d'avertissement
        NOTICE 5 : Notice: normal mais état significatif
        INFO   6 : Information: messages d'informations
        DEBUG  7 : Debug: messages de déboguages
        */
        //$log->setEventItem('Memory used', memory_get_usage());
        self::$_registry->set('logger', $logger);
        unset($logger);
    }

    /**
     * mise en place de l'environnement nécessaire à l'exécution
     * @access private
     */
    protected static function _setupRegistry()
    {
        self::$_registry = Zend_Registry::getInstance();
    }

    /**
     * mise en place des routes
     * @access private
     */
    protected static function _setupRoute()
    {
        /* @var $router Zend_Controller_Router_Rewrite */
        $router = self::$_frontController->getRouter();
    }
}

Bootstrappda.php :

Code:

<?php #coding: utf-8
require_once APPLICATION_PATH . '/Bootstrap.php';

/**
 *
 * @package portailDTA
 * @subpackage kernel
 * @category bootstrap
 * @author ECAROT
 *
 */
class bootstrapPortaildta extends Bootstrap
{
    static public function run()
    {
        //self::setupEnvironment();

        self::_prepare();

        try {

            // mettre cette ligne pour que ErrorController fasse son job
            // si cette ligne est commentée, c'est le catch ci-dessous qui sera fait
            self::$_frontController->throwExceptions(false);

            // Dispatch the request using the front controller.
            // The front controller is a singleton, and should be setup by now. We
            // will grab an instance and call dispatch() on it, which dispatches the
            // current request.
            self::$_frontController->dispatch();

        } catch(Exception $exception) {

            echo $exception->getMessage();
            
            echo "<html><body><center>"
                   . "Une exeption a été soulevé par le bootstrap de l'application.";
            if (defined('APPLICATION_ENV')
                && APPLICATION_ENV != 'production'
            ) {
                echo "<br /><br />" . $exception->getMessage() . "<br />"
                   . "<div align='left'>Trace pile d'execution:"
                   . "<pre>" . $exception->getTraceAsString() . "</pre></div>";
            }
            echo '</center></body></html>';
            exit(1);
        }

    }

    /**
     * minimum syndical pour lancer des tests unitaires sur des objets de l'application
     */
    static public function runForUnitTests()
    {
        self::_prepare();
    }

    /**
     *
     */
    protected static function _prepare()
    {
        parent::_autoload();

        //Config du registry
        parent::_setupRegistry();

        //Config du fichier de config :)
        /* @var $config Zend_Config_Ini */
        $iniConfig = parent::_setupConfig(APPLICATION_PATH . '/config/config.ini', APPLICATION_ENV);
        parent::$_registry->set('configuration', $iniConfig);

        //Mise en place du controller principal
        self::_setupFrontController(
            array(
                //'default'     => APPLICATION_PATH . '/modules/portailexposehome/controllers',
                'portaildta' => APPLICATION_PATH . '/modules/portaildta/controllers'
            )
        );


        //Mise en place des routes
        parent::_setupRoute();

        //Mise en place du layout
        /* @var $config Zend_Config_Ini */
        $config = new Zend_Config_Ini(APPLICATION_PATH . '/config/config.ini', 'layoutPortailDta');
        parent::_setupLayout($config);
        unset($config);

        parent::_setupDebug();
    }

    /**
     *
     * @param unknown_type $controllersPath
     */
    protected static function _setupFrontController($controllersPath)
    {
        // FRONT CONTROLLER - 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.

        self::$_frontController = Zend_Controller_Front::getInstance();
        //self::$_frontController->setRequest(new Zend_Controller_Request_Http());
        self::$_frontController->throwExceptions(true);
        //self::$_frontController->returnResponse(true);

        // CONTROLLER DIRECTORY SETUP - Point the front controller to your action
        // controller directory.
        self::$_frontController->setControllerDirectory($controllersPath);

        self::$_frontController->setDefaultModule('portaildta');
        self::$_frontController->setDefaultControllerName('index');
        self::$_frontController->setDefaultAction('test');

        //self::$_frontController->setParam('registry', self::$_registry);
        self::$_frontController->setParam('context', 'portaildta');

        // APPLICATION ENVIRONMENT - Set the current environment.
        self::$_frontController->setParam('env', APPLICATION_ENV);

    }
}

Index.php :

Code:

<?php
/**
 * loader de l'appli dta
 *
 *
 * @package dta
 * @subpackage kernel
 */
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application/'));

set_include_path(
    realpath(APPLICATION_PATH . '/../library')
    . PATH_SEPARATOR .
    realpath(APPLICATION_PATH . '/models')
    . PATH_SEPARATOR .
    get_include_path()
);

// Define application environment
// voir le virtual host, pour mettre par exemple :
// SetEnv APPLICATION_ENV development
// s'il n'y en a pas, alors la ligne ci-dessous sera prise en compte
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));


require_once APPLICATION_PATH . '/Bootstrapdta.php';

bootstrapPortaildta::run();

Personne.php :

Code:

<?php
class Model_Personne extends Zend_Db_Table {
    protected $_name = 'PERSONNE';
    
    private function getPersonnesAll() {
        return $this->fetchAll()->toArray();
    }

    private function getPersonneNom($name = '') {
        return $this->fetchAll()->toArray(array('nom_personne = ?'=> $name));
    }
}

IndexController.php :

Code:

<?php
class IndexController extends Zend_Controller_Action
{
    public function init() {
        $this->view->headTitle('Socialisme Citoyen');
    }
     
    public function testAction()
    {
        /*$loader = Zend_Loader_Autoloader::getInstance();
        die( print_r( $loader->getAutoloaders() ));*/
        $model = new Model_Personne();
        $this->view->test = "ESSAI 1";
    }
}

J'obtiens :
Fatal error: Class 'Model_Personne' not found in /var/www/DTA/application/modules/portaildta/controllers/IndexController.php on line 12

Je ne sais pas pourquoi il ne veut pas aller les chercher au bon endroit...


Merci d'avance les amis.

Bonne journée

Hors ligne

 

#2 29-12-2010 12:51:53

Toto
Nouveau membre
Date d'inscription: 29-12-2010
Messages: 3

Re: Impossible d'accéder à mes models

Je pense qu'il y a un souci dans le path que tu as déclaré pour 'models' dans le Boostrap :

Code:

                'resourceTypes' => array(
                    'library' => array(
                        'path'      => 'library/',
                        'namespace' => 'Library'
                    ),
                    'models' => array(
                        'path'      => 'models/',
                        'namespace' => 'Model' /* sans 's' */
                    )

Là, ZF cherche le dossier 'models' au même niveau que le dossier 'library', je ne pense pas que ce soit le cas dans ton appli smile En gros, je crois que tu as oublié un APPLICATION_PATH sur ce morceau : 'path'  => 'models/',

Dernière modification par Toto (29-12-2010 12:55:09)

Hors ligne

 

#3 29-12-2010 14:38:59

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Re: Impossible d'accéder à mes models

Alors en fait j'ai modifié comme ceci :

Code:

new Zend_Application_Module_Autoloader(
            array(
                'namespace' => 'Portaildta_',
                'basePath'  => dirname(__FILE__) . '/modules/portaildta',
                'resourceTypes' => array(
                    'library' => array(
                        'path'      => 'library/',
                        'namespace' => 'Library'
                    ),
                    'models' => array(
                        'path'      => APPLICATION_PATH.'/models/',
                        'namespace' => 'Model' /* sans 's' */
                    )
                )
            )
        );

Et lorsque j'affiche mes path comme ceci :

Code:

$loader = Zend_Loader_Autoloader::getInstance();
die( print_r( $loader->getAutoloaders() ));

J'obtiens :

Code:

Array ( [0] => Zend_Application_Module_Autoloader Object ( [_basePath:protected] => /var/www/DTA/application/modules/portaildta [_components:protected] => Array ( [Portaildta_Library] => /var/www/DTA/application/modules/portaildta/library [Portaildta_Model] => /var/www/DTA/application/modules/portaildta/models [Portaildta_Model_DbTable] => /var/www/DTA/application/modules/portaildta/models/DbTable [Portaildta_Model_Mapper] => /var/www/DTA/application/modules/portaildta/models/mappers [Portaildta_Form] => /var/www/DTA/application/modules/portaildta/forms [Portaildta_Plugin] => /var/www/DTA/application/modules/portaildta/plugins [Portaildta_Service] => /var/www/DTA/application/modules/portaildta/services [Portaildta_View_Helper] => /var/www/DTA/application/modules/portaildta/views/helpers [Portaildta_View_Filter] => /var/www/DTA/application/modules/portaildta/views/filters ) [_defaultResourceType:protected] => model [_namespace:protected] => Portaildta [_resourceTypes:protected] => Array ( [library] => Array ( [namespace] => Portaildta_Library [path] => /var/www/DTA/application/modules/portaildta/library ) [models] => Array ( [namespace] => Portaildta_Model [path] => /var/www/DTA/application/modules/portaildta//var/www/DTA/application/models ) [dbtable] => Array ( [namespace] => Portaildta_Model_DbTable [path] => /var/www/DTA/application/modules/portaildta/models/DbTable ) [mappers] => Array ( [namespace] => Portaildta_Model_Mapper [path] => /var/www/DTA/application/modules/portaildta/models/mappers ) [form] => Array ( [namespace] => Portaildta_Form [path] => /var/www/DTA/application/modules/portaildta/forms ) [model] => Array ( [namespace] => Portaildta_Model [path] => /var/www/DTA/application/modules/portaildta/models ) [plugin] => Array ( [namespace] => Portaildta_Plugin [path] => /var/www/DTA/application/modules/portaildta/plugins ) [service] => Array ( [namespace] => Portaildta_Service [path] => /var/www/DTA/application/modules/portaildta/services ) [viewhelper] => Array ( [namespace] => Portaildta_View_Helper [path] => /var/www/DTA/application/modules/portaildta/views/helpers ) [viewfilter] => Array ( [namespace] => Portaildta_View_Filter [path] => /var/www/DTA/application/modules/portaildta/views/filters ) ) ) ) 1

Mais il ne veut toujours pas et je ne comprend pas pourquoi il définit plusieurs "Portaildta_Model" dans getAutoloaders().

Pour vous aidezà m'aider un peu plus voiçi mon arborescence :

Code:

+application

++config
++languages
++layouts
++models
++-Personne.php
++modules
+++portaildta
++++controllers
++++forms
++++views


+library

+public

Voilà j'ai un dossier models/ commun à tout mes modules. Mes modèles ont ce nom par exemple: Model_Personne
J’appelle alors mon modèle Personne.php dans mon dossier models. Je ne comprend pas pourquoi cela ne fonctionne pas sad

Merci d'avance toto wink

Hors ligne

 

#4 30-12-2010 07:07:55

Toto
Nouveau membre
Date d'inscription: 29-12-2010
Messages: 3

Re: Impossible d'accéder à mes models

C'est parce que tu as défini un namespace et un basepath. Du coup, il préfixe toutes tes ressources avec ce namespace et ce path, et ça donne des chemins bizarres comme celui-ci : "/var/www/DTA/application/modules/portaildta//var/www/DTA/application/models" (remarque la répétition de "/var/www/DTA/application").
D'ailleurs, si tu regardes bien, le path de "library" n'est pas bon non plus smile Il faudrait séparer la déclaration du module et celle des dossiers communs. Je ne sais pas comment on fait ça, je n'ai pas encore trop touché aux loaders big_smile

edit : en fait, d'après cette page : http://framework.zend.com/manual/en/lea … urces.html c'est simple. Il suffit de déclarer un Zend_Loader_Autoloader_Resource pour les ressources, un objet de type Zend_Application_Module_Autoloader est réservé à la déclaration d'un module smile

Dernière modification par Toto (30-12-2010 07:14:01)

Hors ligne

 

#5 30-12-2010 10:57:20

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Re: Impossible d'accéder à mes models

En réalité j'ai 2 modules : PortailDta et portailAdmin. Ces deux modules doivent pouvoir utiliser les modèles commun à toute mon application et pas seulement au module. Même quand je déplace mon dossier models dans mon module cela ne fonctionne pas et je ne sais pas pourquoi...

Je suis complètement perdu. Je suis entrain de voir pour l'autoloader comme tu l'a indiqué. Si tu veut d'autre information demande moi.

C'est gentil à toi de m'aider de si bonne heure :p

Hors ligne

 

#6 30-12-2010 11:03:42

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Re: Impossible d'accéder à mes models

Et en plus quand je pense avoir bien fait il me soulève une erreur bizarre qui n'arrive pas avant... :

Code:

Invalid controller specified (error)
Une exeption a été soulevé par le bootstrap de l'application.

Invalid controller specified (error)
Trace pile d'execution:
#0 /var/www/ZF/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /var/www/DTA/application/Bootstrapdta.php(30): Zend_Controller_Front->dispatch()
#2 /var/www/DTA/public/portaildta/index.php(29): bootstrapPortaildta::run()
#3 {main}

Pourtant je suis dans le bon controller et ma bonne action.
J'écris ce code pour obtenir cette erreur :

Code:

<?php
class IndexController extends Zend_Controller_Action
{
    public function init() {
        $this->view->headTitle('Socialisme Citoyen');
    }
     
    public function testAction()
    {
        /*$loader = Zend_Loader_Autoloader::getInstance();
        die( print_r( $loader->getAutoloaders() ));*/
        $model = new ZFDta_Model_Personne();
        $this->view->test = "ESSAI 1";
    }
}

C'est vraiment louche... Il m'arrive toujours des bizarreries dans zend smile

Hors ligne

 

#7 30-12-2010 12:06:15

Toto
Nouveau membre
Date d'inscription: 29-12-2010
Messages: 3

Re: Impossible d'accéder à mes models

Je débute sous Zend et je ne pourrais pas t'aider beaucoup mais voilà une piste : http://framework.zend.com/wiki/display/ … d+Problems Apparemment, c'est parce que tu n'as pas d'ErrorController :p


ps : je suis en GMT+04 donc il n'était pas si tôt chez moi big_smile

edit (faudrait que j'arrête avec les edit :x) : tu peux aussi rajouter ça dans ton _setupFrontController : "$this->_frontController->setParam('noErrorHandler', TRUE);" De toute façon, le meilleur moyen de vérifier ça c'est de tester.

Dernière modification par Toto (30-12-2010 12:09:45)

Hors ligne

 

#8 30-12-2010 14:13:28

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Re: Impossible d'accéder à mes models

Le problème est résolu, il fallait créer un controlleur ErrorController et un script de vue error/error.phtml

Merci à toi toto

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