Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
<?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 :
[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 :
<?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):
<?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
essai en appelant ta class Default_Maclasse, avec models il va chercher dans default/models
Hors ligne
A force de faire des essais, j'ai oublié de modifié mon exemple...
Bootstrap:
... 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
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
Encore une faute de frappe de ma part mais elle est bien dans le répertoire models/
Hors ligne
chez moi je suis obligé de metre Default_Models_Maclasse sinon sa marche pas et ton fichier doit s'appeler Maclasse.php
Hors ligne
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à...
Hors ligne
Dans le contrôleur IndexController.php, j'ai fait un
$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 )
$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
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
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
Pages: 1