Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
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
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
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 :
Ensuite voici mes fichiers :
Config.ini
[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 :
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 :
<?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 :
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
<?= $this->form(); ?>
AH oui, j oubliais... L'erreur qui est un poil différente
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
Dernière modification par JohnNada (23-09-2010 04:58:50)
Hors ligne
L'erreur est assez simple :
<?php echo $this->form;?>
Tu appelles l'aide de vue form au lieu d'appeler ta variable de vue form.
Hors ligne
Pour ton script de vue, tu a mis des parenthèses alors qui n'en fallait pas :
<?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 ?
Hors ligne
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 :
<?php class Frontend_Bootstrap extends Zend_Application_Module_Bootstrap { }
A+, Philippe
Hors ligne
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
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
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 :
Voici le fichier application.ini
[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)
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
class Backend_Bootstrap extends Zend_Application_Module_Bootstrap { }
Mon fichier frontend/Bootstrap.php
class Frontend_Bootstrap extends Zend_Application_Module_Bootstrap { }
Mon controller frontend/controllers/TestController.php (j'ai supprimé le traitement du formulaire pour alleger)
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
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
<?php echo $this->form; ?>
Et voici l erreur que j'ai en distant lorsque je veux afficher le formulaire...
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
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...
Hors ligne
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
Maheureusement le simple fait de modifier les noms de repertoire ne change rien...
Hors ligne
@omega2 : ok, il faut que j'apprenne à lire, ça m'aidera plus tard
@JohnNada :
Dans ton application.ini il faut indiquer que tu as une appli modulaire. Il faut ajouter la ligne suivante :
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
Hors ligne
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
Pages: 1