Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-10-2012 10:43:27

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

[Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

Bonjour,

J'ai un soucis avec mon projet ZF. Je cherche à ajouter les modèles sur mon projet (qui sert juste de projet d'apprentissage).

Le soucis c'est que ZF n'arrive pas à le trouver. J'ai le droit à un beau message d'erreur lorsque j'essaye d'instancier mon modèle comme quoi il n'a pas trouvé la classe.

J'essaye d'instancier TCompagnie dans PieceController via :

Code:

[lang=php]public function allCompagnies(){
    $table_compagnie = new TCompagnie();
    return $table_compagnie->fetchAll();
}

Mon modèle TCompagnie :

Code:

[lang=php]<?php

class Models_TCompagnie extends Zend_Db_Table_Abstract{
    protected $_name="compagnie";
    protected $_primary="id";
}

?>

Message d'erreur :
Fatal error: Class 'TPiece' not found in /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php on line 125 Call Stack: 0.0002 340300 1. {main}() /home/shimrra/Bureau/workspace/festival/public/index.php:0 0.0490 4060748 2. Zend_Application->run() /home/shimrra/Bureau/workspace/festival/public/index.php:21 0.0490 4060748 3. Bootstrap->run() /home/shimrra/Bureau/workspace/festival/library/Zend/Application.php:366 0.0491 4060860 4. Zend_Application_Bootstrap_Bootstrap->run() /home/shimrra/Bureau/workspace/festival/application/Bootstrap.php:5 0.0492 4061096 5. Zend_Controller_Front->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Application/Bootstrap/Bootstrap.php:97 0.0621 5081016 6. Zend_Controller_Dispatcher_Standard->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Front.php:954 0.0681 5447640 7. Zend_Controller_Action->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Dispatcher/Standard.php:308 0.0682 5453668 8. PieceController->modifierAction() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Action.php:516 0.0714 5455252 9. PieceController->allCompagnies() /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php:38

Si je fais un include du fichier l'instanciation fonctionne. Je ne comprends pas pourquoi l'autoload ne se fait pas alors que dans le cas du tuto que je suis cela se réalise sans aucun ajout particulier.

Arborescence de mon projet :

festival/
  application/
    config/
      application.ini
    controllers/
      CompagnieController.php
      ErrorController.php
      IndexController.php
      MenuController.php
      PieceController.php
    layouts/
      error.phtml
      footer.phtml
      layout.phtml
    models/
      TCompagnie.php
      TPiece.php
    views/Des dossiers par vues
    Bootstrap.php
  library/
  public/
    index.php

Edit:
j'ai ajouté : set_include_path(APPLICATION_PATH. '/models' . PATH_SEPARATOR . get_include_path()); dans mon index.php (dans le dossier public) mais sans aucun changement, il n'arrive toujours pas à charger ma classe.


Merci d'avance.
Shimrra

Dernière modification par Shimrra (09-10-2012 13:21:08)

Hors ligne

 

#2 05-10-2012 12:32:21

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

bonjour,
si la classe TCompagnie n'est jamais chargée c'est parce qu’elle ne respecte pas les conventions de nommage de ZF .l'espace de nom représentant application/models/TCompagnie.php sera :

Code:

[lang=php]
//application/models/TCompagnie.php
<?php

class Application_Model_TCompagnie extends Zend_Db_Table_Abstract{
    protected $_name="compagnie";
    protected $_primary="id";
}

?>

Dernière modification par amiss (05-10-2012 12:35:54)

Hors ligne

 

#3 05-10-2012 13:20:47

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

Je viens d'essayer (j'avais déjà essayé), mais aucune différence toujours l'erreur :

Code:

Fatal error: Class 'Application_Model_TCompagnie' not found in /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php on line 126

Call Stack:
    0.0032     339948   1. {main}() /home/shimrra/Bureau/workspace/festival/public/index.php:0
    0.1129    4060528   2. Zend_Application-&gt;run() /home/shimrra/Bureau/workspace/festival/public/index.php:21
    0.1129    4060528   3. Bootstrap-&gt;run() /home/shimrra/Bureau/workspace/festival/library/Zend/Application.php:366
    0.1130    4060640   4. Zend_Application_Bootstrap_Bootstrap-&gt;run() /home/shimrra/Bureau/workspace/festival/application/Bootstrap.php:5
    0.1131    4060876   5. Zend_Controller_Front-&gt;dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Application/Bootstrap/Bootstrap.php:97
    0.1332    5080744   6. Zend_Controller_Dispatcher_Standard-&gt;dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Front.php:954
    0.1437    5446932   7. Zend_Controller_Action-&gt;dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Dispatcher/Standard.php:308
    0.1438    5452960   8. PieceController-&gt;modifierAction() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Action.php:516
    0.1439    5453344   9. PieceController-&gt;allCompagnies() /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php:78

Mon prof qui nous a fait des vidéos de cours sur ZF dit dans sa vidéo qu'il n'y a pas de nommage particulier pour les models. Suffit de mettre un nom et de l'instancier mais perso ça fonctionne pas.

J'ai essayé d'utiliser Zend_Loader_Autoloader_Resource pour rajouter un dossier où aller chercher la classe mais rien n'y fait hmm

Dernière modification par Shimrra (05-10-2012 13:28:01)

Hors ligne

 

#4 05-10-2012 13:42:45

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

on aimerait voir tes fichiers bootstrap, application.ini et public/index.php

Hors ligne

 

#5 05-10-2012 13:48:20

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

Mon bootstrap :

Code:

[lang=php]
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{
    public function run(){
        Zend_Registry::set('showmenu', false);
        parent::run();
    }

    /**
    * Charge un nouvel namespace pour une nouvelle library
    * @return: void
    **/
    
    protected function _initLibraryFestival(){
        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->registerNamespace('Festival_');
    }
    
    protected function _initSession(){
        $session = new Zend_Session_Namespace('festival', true);
        return $session;
    }
    

    
    protected function _initConfig(){
        $zf_config= new Zend_Config($this->getOptions(), true);
        Zend_Registry::set('config', $zf_config);
    }
    
    public function _initErrorHandler(){
        $errorHandler = new Zend_Controller_Plugin_ErrorHandler();
        $errorHandler->setErrorHandler(array('controller'=>'error', 'action'=>'index'));
        $this->bootstrap('frontController')->frontcontroller->registerPlugin($errorHandler);
    }
    
    public function _initDb(){
        $database = Zend_Db::factory(Zend_Registry::get('config')->database);
        $database->query('SET NAMES UTF8');
        Zend_Db_Table_Abstract::setDefaultAdapter($database);
         Zend_Registry::set('db', $database);
    }
}

Mon application.ini :

Code:

[production]
includePaths.library         = LIBRARY_PATH
bootstrap.path                 = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class                = "Bootstrap"

// configurer la ressource controller
resources.frontController.controllerDirectory         = APPLICATION_PATH "/controllers"
resources.frontController.defaultControllerName     = "index"
resources.frontController.defaultAction             = "index"

// configurer la ressource layout
resources.layout.layoutPath    = APPLICATION_PATH "/layouts"

//erreurs php
phpSettings.display_errors     = 0
phpSettings.display_startup_errors = 0

//config base de données sql
database.adapter            = pdo_mysql
database.params.host         = localhost
database.params.dbname         = ZF_test
database.params.username     = root
database.params.password     = mysql

[development : production]

//erreurs php
phpSettings.display_errors     = 1
phpSettings.display_startup_errors = 1

mon index.php :

Code:

[lang=php]
<?php

defined ('APPLICATION_PATH') || define('APPLICATION_PATH',realpath(dirname(__FILE__) . '/../application'));

defined ('LIBRARY_PATH') || define('LIBRARY_PATH',realpath(dirname(__FILE__) . '/../library'));

defined ('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

//on modifie le path de php
set_include_path(implode(PATH_SEPARATOR, array(realpath(LIBRARY_PATH), get_include_path())));

//on a besoin de zen app pour lancer l'application
require_once('Zend/Application.php');

//on lance la session
require_once('Zend/Session.php');
Zend_Session::start();

//on créer l'application, on lance le bootstrap et l'application
$application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/application.ini');
$application->bootstrap()->run();

Hors ligne

 

#6 05-10-2012 15:45:03

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

J'ai résolu le soucis. Mon problème venait d'un manque dans le fichier application.ini. J'ai ajouté :

appnamespace = "Application"

Il doit surement y avoir un nom par défaut qui n'est pas Application. Par contre ce que je ne comprends pas, c'est que mon prof nous dit dans la vidéo qu'on a aucune règle a respecter lors de la création des models hmm

Hors ligne

 

#7 08-10-2012 14:27:39

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

j'avoue ne pas avoir le loisir d'écrire à la la main le fichier de configuration application.ini car j'ai toujours utilisé zend tools(en ligne de commande ou avec netbeans ) qui génère la structure de base d'un projet zend.
Par ailleurs il est inutile de rédefinir la méthode _initDb de Boostrap car tu l'a déjà fait dans le fichier de config(application.ini).

Le namesapce "Application" est attribué de manière arbitraire tu peux donner n'importe quel nom.Par contre le nommage des modèles, controllers... doivent respecter les conventions de nommage de zend(cf. la doc de ZF) auquel cas tes classes modèles ne seront jamais chargées.

Hors ligne

 

#8 09-10-2012 13:20:11

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

Ok, c'est bien ce qui me semblait après avoir cherché sur le net. Il faudra que je contactes la personne ayant fait le tutoriel pour lui indiquer son erreur.

Merci pour l'aide. Je passe le sujet en résolu.

Par contre je ne comprends pas ta réponse au sujet de mon _initDb. J'instancie une connexion à la base de données pour la réutiliser plus tard. Le fais de fournir en arguments dans application.ini les données de connexions suffit à lancer une connexion ?

Dernière modification par Shimrra (09-10-2012 13:24:14)

Hors ligne

 

#9 09-10-2012 16:21:21

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

la redéfinition de _initDB() était pratiquée pour les anciennes versions de zf (<1.8) mais avec les versions récentes plus besoin de créer(avec à la méthode factory) un objet de connexion à la BD car tout est déjà fait dans le fichier de configuration.

dans application.ini il suffit juste de respecter la syntaxe comme ceci:

Code:

 ; connexion à la bd
 resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = mysql
resources.db.params.dbname = Zf_test
resources.db.params.charset = "utf8"

Hors ligne

 

#10 10-10-2012 09:52:27

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

Et tu accèdes comment à la variable contenant l'objet de connexion du coup ? via une méthode ?

Hors ligne

 

#11 10-10-2012 12:29:06

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

l'objet de connexion $db t'en auras pas besoin .Il y a un bon tuto  de robe allen sur developpez.com qui répond bien à ta préoccupation:


débuter avec ZF 1.10

Dernière modification par amiss (10-10-2012 12:30:09)

Hors ligne

 

#12 10-10-2012 17:37:03

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

Merci pour le lien, je l'avais parcourus pour mon soucis avec les models justement ^^. Si j'ai bien compris, vu qu'on passe par des modèles en héritant de Zend_Db_Table_Abstract, on a pas à gérer la connexion, vu qu'on passe par une syntaxe/méthodes de zend, c'est zend qui gère tout ça ?

Hors ligne

 

#13 12-10-2012 17:21:06

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

oui on a pas besoin de gérer la connexion avec la BD.En effet lors de l’instanciation du modèle (classe fille de Zend_Db_Table_Abstract), une connexion avec la BD est créée entraînant de fait le mapping entre le modèle et sa table correspondante.En plus pour effectuer des requêtes à la bd depuis le modèle on procède par la variable this.Ex: $this->fetch(...),$this->insert(...)...

Dernière modification par amiss (12-10-2012 17:22:17)

Hors ligne

 

#14 12-10-2012 18:13:20

Shimrra
Membre
Date d'inscription: 05-10-2012
Messages: 19

Re: [Resolu][Zend_Db_Table_Abstract][1.12.0] Charger un modèle

okey. merci beaucoup pour toutes ces infos. smile

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