Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-09-2010 02:46:50

JohnNada
Membre
Date d'inscription: 18-07-2010
Messages: 11

Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Bonjour à tous !

Apprenant ZEND j'ai beaucoup parcouru ce forum qui m'a toujours été d'une grande aide, et je dois dire que j ai toujours trouvé réponse a mes problemes.

Mais la je suis face a un probleme de taille , j espere que quelqu'un peut m'aider !!!!!!!!

Je vous explique.

Je suis en architecture modulaire classique Backend / Frontend. Tout fonctionne tres bien en local.
Je viens d'installer mon site sur un serveur cloud 1 and 1 distant (oui je sais...), l'appli semble fonctionner au départ.

Mais gros problème, l'autoloader ne fonctionne pour AUCUN FORMULAIRE !!! Il n'en trouve aucun.

Grosso modo mon architecture est :

application /

      / modules

          / backend
              / controllers
              / models
              / views
              / forms

         / frontend
              / controllers
              / models
              / views
              / forms

      / controllers
      / models
      / views
      / forms

Voici le type de message d'erreur que j'ai :


Code:

Fatal error: Class 'Frontend_Form_Mail_Mail' not found in /var/www/vhosts/blablabla.com/subdomains/samplesolution/httpdocs/application/modules/frontend/controllers/StandardController.php on line 90

les fameux formulaires sont dans les dossiers "forms" des modules correspondants.
Et je reprecise qu'en local (MAMP) ca fonctionne parfaitement.

Help please !!

Dernière modification par JohnNada (05-10-2010 13:28:19)

Hors ligne

 

#2 23-09-2010 03:46:25

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

De mémoire, pour les formulaires, le framework cherche par défaut des dossiers et fichiers qui ont le même nom à la casse près que la classe du formulaire.

C'est peut être déroutant pour un OS de type unix, mais en fonction des programmes j'ai l'impression que MacOSX se comporte comme s'il était case in-sensitive (majuscule ou minuscule considéré comme identique) alors que linux est strictement case sensitif dans les noms de fichiers et dossiers. On ne voit donc pas tous les problèmes de case sous macOS quand on fait développe des sites internet. Les problèmes n'apparaissent qu'une fois mis en ligne sur un serveur qui fait la différence de case.

Je ne dis pas que c'est ça, vu que tu n'as pas donné le nom du fichier contenant le formulaire et vu que tu n'as pas donné nom plus les options de config ou les lignes de code qui permettent au framework de savoir où se situe une classe de formulaire donnée.

Hors ligne

 

#3 23-09-2010 04:54:06

JohnNada
Membre
Date d'inscription: 18-07-2010
Messages: 11

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Merci pour ta réponse.

Pour y voir plus clair, j'ai déployé une mini application zend sur le serveur, uniquement composee d'un layout, un controlleur, d'une vue et d'un formulaire. Afin de mieux comprendre le probleme.
Evidemment ca marche toujours pas, mais ce sera plus simple a debugger.

J ai meme passé 1 heure avec la console pour voir si c'etait pas un probleme d'AllowOverrideAll dans httpd.conf
Je l'ai réglé sur All (il etait sur None), mais toujours le meme probleme.

Je vais essayer d'etre donc le plus clair possible.

Voici mon architecture en terme de syntaxe :

http://www.it-interaction.com/image6.png

Ensuite voici mes fichiers :

Config.ini

Code:

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.view[] =

[staging : production]

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

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

- Bootstrap :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
            public function run()
            {
                Zend_Registry::set('config', new Zend_Config($this->getOptions()));
                parent::run();
            }

            protected function _initAutoload()
            {
                $loader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => '',
                    'basePath'  => APPLICATION_PATH));

                return $loader;
            }
            

            protected function _initSession()
            {
                $session = new Zend_Session_Namespace('siteZf', true);
                Zend_Registry::set('session', $session);

                return $session;
            }

            protected function _initViewHelpers()
            {
                $this->bootstrap('layout');
                $layout = $this->getResource('layout');
                $view = $layout->getView();
                $view->doctype('XHTML1_TRANSITIONAL');
                $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
                $view->headTitle()->setSeparator(' - ');
                $view->headTitle(' Tutoriel Zend Framework');
                $view->headLink(); 

                

            }

}

Le Formulaire :

Code:

<?php
class Form_Registration
    extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

        $name = new Zend_Form_Element_Text('name');
        $name->setLabel('Name:')->setRequired(true);

     

        $submit = new Zend_Form_Element_Submit('submit');
        

        $this->addElements(array($name, $submit));
    }
}

Le controlleur :

Code:

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $this->view->form = new Form_Registration();
    }


}

Et enfin la vue

Code:

<?= $this->form(); ?>

AH oui, j oubliais... L'erreur sad qui est un poil différente

Code:

Warning: Missing argument 1 for Zend_View_Helper_Form::form() in /var/www/vhosts/monsite.com/httpdocs/zendtestalex/library/Zend/View/Helper/Form.php on line 44

Notice: Undefined variable: name in /var/www/vhosts/monsite.com/httpdocs/zendtestalex/library/Zend/View/Helper/Form.php on line 46

Si il y a quelqu'un qui me sauve la vie je lui en serai reconnaissant a jamais smile

Dernière modification par JohnNada (23-09-2010 04:58:50)

Hors ligne

 

#4 23-09-2010 08:32:20

Intiilapa
Membre
Date d'inscription: 03-02-2009
Messages: 95

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

L'erreur est assez simple :

Code:

<?php echo $this->form;?>

Tu appelles l'aide de vue form au lieu d'appeler ta variable de vue form.

Hors ligne

 

#5 23-09-2010 08:37:28

My_Sic
Membre
Date d'inscription: 06-09-2010
Messages: 49
Site web

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Pour ton script de vue, tu a mis des parenthèses alors qui n'en fallait pas :

Code:

<?php echo $this->form; ?>

Pour ton problème initial, ça peut venir de plusieurs endroits :
- Tes modules sont-ils bien chargé ?
- Si tu affiche les (namespace => path) présent dans ton Module_Autoloader, les dossiers sont-ils bon ?


http://www.centurion-project.org: Full stack Framework based on Zend Framework; led by:
http://www.octaveoctave.com: an enthusiastic web agency full of passionate.
http://www.cache-pistache.com: French blog on ZF and SF perfomance

Hors ligne

 

#6 23-09-2010 09:40:33

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Pour que ton autoloader marche dans un module il faut un bootstrap (même vide) dans ton module.

Par exemple dans ton module fronttend (à la racine de ton module), il faut un fichier Bootstrap.php qui contient :

Code:

<?php
class Frontend_Bootstrap extends Zend_Application_Module_Bootstrap
{
}

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#7 23-09-2010 21:22:02

JohnNada
Membre
Date d'inscription: 18-07-2010
Messages: 11

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

My_Sic a écrit:

Pour ton script de vue, tu a mis des parenthèses alors qui n'en fallait pas :

Code:

<?php echo $this->form; ?>

Pour ton problème initial, ça peut venir de plusieurs endroits :
- Tes modules sont-ils bien chargé ?
- Si tu affiche les (namespace => path) présent dans ton Module_Autoloader, les dossiers sont-ils bon ?

Merci encore les gars smile

Dois je déclarer mes Module_Autoloader et leur pâsser les ressources dans le bootstrap principal ou dans le bootstrap du module principal ? La doc est pas hyper claire sur les applications modulaires je trouve.

Hors ligne

 

#8 24-09-2010 01:13:52

JohnNada
Membre
Date d'inscription: 18-07-2010
Messages: 11

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Je crois que je vais devenir fou !!!! Désolé de requérir encore à votre aide... Mais ca ne s'arrange pas.

Je ne comprends vraiment pas pourquoi mes formulaires fonctionnent en local, mais pas en distant !

Je vais cette fois ci inclure tous les éléments qui peuvent entrer dans le probleme.

Je vais prendre pour exemple lorsque je veux acceder a la page :
"http://localhost/SampleSolution/public/frontend/test/form"

Donc voici l'arborescence de mon projet final :

http://samplesolution.it-interaction.com/arbo.png


Voici le fichier application.ini

Code:

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"

autoloaderNamespaces[] = "App_"

resources.view.helperPath.App_View_Helper = "App/View/Helper"

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

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

resources.modules[] = 

resources.db.adapter = "pdo_mysql"
resources.db.params.username = "root"
resources.db.params.password = "root"
resources.db.params.dbname = "samplesolution"

[staging : production]

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

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

Voici le fichier global Bootstrap.php (dans le dossier application)

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

   public function run()
            {
                // Cela permet d'avoir la configuration disponible de partout dans notre application
                Zend_Registry::set('config', new Zend_Config($this->getOptions()));
                parent::run();
            }

/////////////// AUTOLOAD

        protected function _initAutoload()
            {
        
                $moduleLoader = new Zend_Application_Module_Autoloader(array(
                        'namespace' => '', 
                        'basePath'  => APPLICATION_PATH.'/modules'));
                $moduleLoader->addResourceType('form','forms/','Form');

                
            }
          

/////////////// SESSION

            protected function _initSession()
            {
                // On initialise la session
                $session = new Zend_Session_Namespace('appli', true);
                Zend_Registry::set('session', $session);

                return $session;
            }
            

/////////////// LAYOUTS

            protected function _initViewHelpers()
            {
                $this->bootstrap('layout');
                $layout = $this->getResource('layout');
                $view = $layout->getView();
                $view->doctype('XHTML1_STRICT');
                $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
                $view->headTitle()->setSeparator(' - ');
                $view->headTitle(' Tutoriel Zend Framework');
                $view->headLink();
                
                $view->addHelperPath('ZendX/JQuery/View/Helper', 'ZendX_JQuery_View_Helper');
                
                    // Add it to the ViewRenderer
                $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
                $viewRenderer->setView($view);
                 return $view;
            }
        
                        
                    
}

Mon fichier backend/Bootstrap.php

Code:

class Backend_Bootstrap extends Zend_Application_Module_Bootstrap
{  

}

Mon fichier frontend/Bootstrap.php

Code:

class Frontend_Bootstrap extends Zend_Application_Module_Bootstrap
{  

}

Mon controller frontend/controllers/TestController.php (j'ai supprimé le traitement du formulaire pour alleger)

Code:

class Frontend_TestController extends Zend_Controller_Action
{

    public function init()
    {
         
    }

    public function indexAction()
    {
        $this->view->path = Zend_Loader_Autoloader::getInstance();

    }
    
    public function formAction()
    {
           $this->view->title = "Ajouter un nouvel utilisateur";
        $this->view->headTitle($this->view->title, 'PREPEND');
    
        $form = new Frontend_Form_Standard_Registration(); // On initialise un formulaire correspondant a la classe de formulaire "Album"
        
            $this->view->form = $form; // On balance le formulaire dans la vue

    }
 }

Mon formulaire frontend/forms/standard/Registration.php

Code:

class Frontend_Form_Standard_Registration extends Zend_Form
{
    //put your code here
    public function init()
    {
        
        $this->setAttrib('id', 'registration');
        $this->setMethod(Zend_Form::METHOD_POST);
       

    
        $name = $this->createElement('text', 'name');
        $name->setLabel('Enter Name');
        $name->setRequired(true);
               
        
        $name2 = $this->createElement('text', 'name2');
        $name2->setLabel('Enter Name');
        $name2->setRequired(true);
                
        $this->addElement($name);
        $this->addElement($name2);
        $this->clearDecorators();
 
         $monDeco = new App_Form_Decorator_Composite();
        $this->setElementDecorators(array($monDeco,'FormErrors'));

        $submit = $this->createElement('submit', 'submit');
        $this->addElement($submit);
        
        
    }

}

Et ma vue

Code:

<?php 
echo $this->form; 

?>

Et voici l erreur que j'ai en distant lorsque je veux afficher le formulaire...

Code:

Fatal error: Class 'Frontend_Form_Standard_Registration' not found in /var/www/vhosts/it-interaction.com/subdomains/samplesolution/httpdocs/application/modules/frontend/controllers/IndexController.php on line 8

Si quelqu'un prend le temps de regarder c'est trop sympa !!!!!!

Alex

Dernière modification par JohnNada (24-09-2010 01:23:13)

Hors ligne

 

#9 24-09-2010 05:52:25

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Ah ! il fallait dire que ça marchait en local !

Le problème vient des majuscules et des minuscules de tes noms de répertoire. En local (win ou mac) ton système se fiche des majuscules dans les noms de fichiers ou répertoires.

Dans ton répertoire forms/, mail/ et standard/ on des minuscules au début. Il faut mettre des majuscules (une machine linux en tient compte).

Sinon non, il n'y a rien à configurer pour l'autoloader des modules. Par contre, je suis d'accord avec toi, la doc est un peu succinte pour les applis modulaires...

A+, Philippe
PS : d'un autre coté pour la doc rien ne nous empêcherait (moi y compris) d'y contribuer...


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#10 24-09-2010 20:02:46

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

philippe > C'était dit à l'avant dernière ligne de son premier message.

Et je reprecise qu'en local (MAMP) ca fonctionne parfaitement.

Hors ligne

 

#11 24-09-2010 21:31:01

JohnNada
Membre
Date d'inscription: 18-07-2010
Messages: 11

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Maheureusement le simple fait de modifier les noms de repertoire ne change rien...

Hors ligne

 

#12 27-09-2010 13:16:48

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

@omega2 : ok, il faut que j'apprenne à lire, ça m'aidera plus tard smile

@JohnNada :
Dans ton application.ini il faut indiquer que tu as une appli modulaire. Il faut ajouter la ligne suivante :

Code:

resources.modules[] = 
resources.frontController.moduleControllerDirectoryName = "controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

Je récapitule les points :
- mettre les bonnes majuscules / minuscules dans tes noms de fichiers et répertoires
- mettre un bootstrap de module (à la racine de chaque module), même vide
- ajouter le "resources.modules[] = " (tu laisses vide à la fin, il va rechercher lui même les modules). A priori les autres lignes sont les valeurs par défaut, mais bon dans le doute, je remets ma conf...

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#13 05-10-2010 13:28:01

JohnNada
Membre
Date d'inscription: 18-07-2010
Messages: 11

Re: Petit (gros) souci d'autoLoader sur les Forms ! (Résolu)

Desolé, un peu de retard !!!!
Merci pour vos reponses, ca marche enfin, il fallait mettre les sous dossiers de "form" avec la premiere lettre en MAJ. Mais pas de majuscule pour le dossier form !
--Soupir--

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