[ZF] Hérésie pour création de formulaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [ZF] Hérésie pour création de formulaire

Re: [ZF] Hérésie pour création de formulaire

par katagoto » 04 oct. 2011, 20:08

Je suis assez de ton avis en ce qui concerne le livre, mais il n'est plus à jour et du coup tu risque de ne pas tout comprendre à la version actuelle.

Re: [ZF] Hérésie pour création de formulaire

par devlop78 » 04 oct. 2011, 16:37

Sinon, il y a des livres comme "Zend Framework de Julien Pauli et Guillaume Ponçon". Il est plus orienté framework que méthodologie, ce qui me convient qu'à moitié, mais ma foi, avec ses 466 pages ...

Par contre, Zend_Framework est très respectable en tant que bibliothèque de composants, mais quand je n'utilise pas seulement quelques composants (Zend_Mail par exemple), je l'utilise en MVC avec le générateur en ligne de commande. Pour l'erreur aussi, regarde ta config, peut-être que tu es en production, avec les erreurs désactivées à l'affichage, n'hésite pas à rajouter des Logs (Je suis agréablement surpris par Zend_Log).

Re: [ZF] Hérésie pour création de formulaire

par katagoto » 02 oct. 2011, 13:04

Alors

1) d'après ce que je sais (j'ai appris ZF lors de sa version 1.11, ce qui fait qu'une grande partie des cours de développez.com sont obsolète, en général ils sont écrits avec la version 1.5 à 1.7), index.php doit être simple et ne bouge pas (tu peux la modifier pour mettre en place des fichiers de configuration mais ça doit resté limité. Elle doit, évidemment contenir l'appel à la méthode run, mais ton Bootstrap ne doit pas la redéfinir (idem pour les contrôleurs et les vues).

2) Là je vais te renvoyer au config.ini car tu à la possibilité de définir énormément de paramètres.

3) En fait, en génie logiciel (pour vulgariser c'est l'ensemble des méthodes qui te permettrais de coder de manière propre, évolutive, etc., si tu veux je peux développer car c'est un sujet que je connais très bien), on distingue deux types de code : la code applicatif et le code métier. Le code applicatif, c'est tout ce qui soutient l'application (les bibliothèques, les fonctions, par exemple ZF, c'est ta partie applicative, si tu écrit une classe de lecture de flux générique, c'est du code applicatif). Le code métier, c'est tout ce qui touche directement le but premier de l'application, par exemple les classes Client, Produit, Transaction pour une application de gestion de vente. Généralement, dans ZF, on positionne les fonctions que je t'ai signalé dans des "Action Helper".

4) Cf. 1

5) Non, essaye de ne mettre que ça dans ton fichier.

Enfin, voici les liens que je te conseil :

Re: [ZF] Hérésie pour création de formulaire

par BeRoots » 01 oct. 2011, 19:21

Merci je regarde tout ça très vite... ;)

1°) Pour les methode _initFunctionName() je suis surpris parce que ce n'est pas du tous ce que j'ai vue sur mes divers tuto ZF (genre chez developpez)... Mais j'avais pas remis le nez dedant depuis un moment donc c'est peu être moi :p Par contre à ce sujet j'aimerai savoir si je doit supprimer l'appel de la fonction run() de mon index.php, ou alors si je doit la laisser mais la redefinir un peu comme elle était en debut de bootstrap ?

2°) Par contre tu m'a mis "inutile cf config.ini" pour setControllerFront() et setRouter() et je ne comprend pas trop... D'apres divers tuto j'avais vue cela fait comme ça ???

3°) Idem pour ta question "metier". Là c'est juste deux fonction de recuperation de donnée en db pour utilisation par l'application donc voila. Je ne comprend pas encore bien le raisonnement "metier" car je debute. :p Donc si tu a un peu plus d'information pour moi ou bien des liens vers divers tutoriaux et cours ;)

4°) J'aurai sans doute aussi une question sur le "quoi enlever à la fonction setView()" ? doit elle être transformer en _initView() ?

5°) pour le router.ini : je comprend pas bien le "essaye ça". Je colle en plus de ce que j'ai fait, je mets que ça ? pourtant j'ai fait comme le dit la doc, de la route la moins visiter aux plus visiter comme les index. :?

Merci d'avance :)

Re: [ZF] Hérésie pour création de formulaire

par katagoto » 01 oct. 2011, 12:47

Bonjour,

Les routes sont un point que je ne maitrise pas particulièrement dans Zend Framework en revanche il me semble que les routes enrent en conflit les unes avec les autres.
Essaye ça :

Code : Tout sélectionner

routes.normal.type = "Zend_Controller_Router_Route" ; cette ligne est pas forcément utile routes.normal.route = "/:langue/:module/:controller/:action/*" routes.normal.defaults.langue = "fr" routes.normal.defaults.controller = "index" routes.normal.defaults.action = "index"
Si je peux me permettre une remarque, d'après les exemples de Booststrap que j'ai pu voir on fait plutôt :
<?php  
/*
 * Class bootstrap.
 *
 * Classe de bootstrap redirigant le index.php vers celle-ci
 * et ce pour des raisons de sécurité.
 *
 * @version     1.0
 * @since       PHP 5
 * @name        bootstrap
 */

require_once "Zend/Loader/Autoloader.php";
$autoloader = Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true)
                                                   ->registerNamespace('Brts_');

class bootstrap
{
    /*
     * frontControlleur
     *
     * @access  private
     * @var     object Zend_Controller_Front object
     */
    private static $frontController = null;

    /*
     * Registry
     *
     * @access  private
     * @var     object Zend_Registry object
     */
    private static $registry = null;

    /*
     * object de session pour le nom d'espace system
     *
     * @access  private
     * @var     object Zend_Session_Namespace object
     */
    private static $systemNamespace = null;

    /*
     * object de session pour le nom d'espace system
     *
     * @access  private
     * @var     object Zend_Session_Namespace object
     */
    private static $userNamespace = null;

    /*
     * Paramètrage de l'environnement server (php)
     *
     * @name    _initPhpEnvironment
     * @access  protected
     * @return  void
     */
    protected function _initPhpEnvironment()
    {
        error_reporting(E_ALL|E_STRICT); // E_ALL uniquement pour PHP6
        ini_set('display_errors', 'on');
        set_time_limit(10);
        ini_set("magic_quotes_runtime", '0');
        ini_set('upload_max_filesize', '3M');
        ini_set('post_max_size', '8M');
        ini_set('memory_limit', '128M');
        ini_set('max_input_time', '-1');
        ini_set('max_input_time', '-1');
    }

    /*
     * Initialisation de l'object de registre
     *
     * @name    _initRegistry
     * @access  protected
     */
    protected function _initRegistry()
    {
        self::$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS);
        Zend_Registry::setInstance(self::$registry);
    }

    /*
     * Recupération de la reference client depuis sont url et mise en registre
     * (initialisation du registre)
     *
     * @name    addRefClient
     * @access  private
     */
    private static function addRefClient() // ? cela concerne la partie métier, pas applicative
    {
        $exploded_domaine = explode(".", $_SERVER['HTTP_HOST']);
        $ref_client = $exploded_domaine[1];
        Zend_Registry::set('ref_client', $ref_client);
    }

    /*
     * Paramètrage et instanciation de l'objet Zend_Session
     *
     * @name    _initUserSession
     * @access  protected
     * @return  object Zend_Session object
     */
    protected function setSession()
    {
        $sessionOptions = array(
            'bug_compat_42'           => 0,
            'bug_compat_warn'         => 1,
            'cache_expire'            => 180,
            'cache_limiter'           => 'nocache',
            'cookie_domain'           => '',
            'cookie_lifetime'         => 0,
            'cookie_secure'           => 0,
            'cookie_path'             => '/',
            'entropy_file'            => '',
            'entropy_length'          => 0,
            'gc_divisor'              => 1000,
            'gc_maxlifetime'          => 1440,
            'gc_probability'          => 1,
            'hash_bits_per_character' => 5,
            'hash_function'           => 1,
            'name'                    => self::$registry->ref_client.'SessionID',
            'referer_check'           => '',
            'save_handler'            => 'files',
            'serialize_handler'       => 'php',
            'use_cookies'             => 1,
            'use_only_cookies'        => true,
            'use_trans_sid'           => 0,
            // zend_framework values
            'remember_me_seconds'     => 0,
            'strict'                  => 'on'
        );
        Zend_Session::setOptions($sessionOptions);
        Zend_Session::start();

        // on initialise les namespaces de session system et user
        $this->systemNamespace = new Zend_Session_Namespace('system');
        $this->userNamespace   = new Zend_Session_Namespace('user');

        // on regenere si besoin l'id de session toute les 30 seconde pour des raisons évidante
        // de sécurité et on pose un verrou sur l'espace de nom system afin de protéger ce dernier
        if(isset($this->systemNamespace->session_regenerate_time) && $this->systemNamespace->session_regenerate_time < time() - 30)
        {
            // on redefinit session_regenerate_time pour controle du temps entre chaque regeneration
            $this->systemNamespace->session_regenerate_time = time();
            Zend_Session::regenerateId();
        }
        else $this->systemNamespace->session_regenerate_time = time();
    }

    /*
     * On recupere les données de configuration application en fichier ini
     * suivant si server de "developpement" ou de "production" et on les
     * passe en registre
     *
     * @name    _initConfigIni
     * @access  protected
     */
    protected function _initConfigIni()
    {
        if($_SERVER['HTTP_HOST'] == '127.0.0.1' || $_SERVER['HTTP_HOST'] == 'localhost' || preg_match("#.loc#", $_SERVER['HTTP_HOST']))
        {
            $configIni = new Zend_Config_ini('application/data/system/config.ini', 'developpement');
        }
        else $configIni = new Zend_Config_Ini('application/data/system/config.ini', 'production');

        Zend_Registry::set('configIni', $configIni);
    }

    /*
     * On recupere les données de configuration system en fichier ini
     * suivant si server de "developpement" ou de "production" et on les
     * passe en registre
     *
     * @name    _initSystemIni
     * @access  protected
     * @return  object Zend_Config_ini object
     */
    protected function _initSystemIni()
    {
        if($_SERVER['HTTP_HOST'] == '127.0.0.1' || $_SERVER['HTTP_HOST'] == 'localhost' || preg_match("#.loc#", $_SERVER['HTTP_HOST'])) {
            $systemIni = new Zend_Config_ini('../0_toolbox/webmasterIncludes/infos/system.ini', 'developpement');
        }
        else $systemIni = new Zend_Config_Ini('../0_toolbox/webmasterIncludes/infos/system.ini', 'production');

        Zend_Registry::set('systemIni', $systemIni);
    }

    /*
     * Paramètrage de l'environnement
     *
     * @name    _initEnvironment
     * @access  protected
     * @return  void
     */
    protected function _initEnvironment()
    {
        date_default_timezone_set(Zend_Registry::get('configIni')->locale->timezone);
        mb_internal_encoding(Zend_Registry::get('configIni')->locale->encoding);
    }


    /*
     * Envoi des headers de l'encodage et de la mise en cache par les proxys et navigateurs
     *
     * @name    _initDefaultHeaders
     * @access  protected
     */
    protected function _initDefaultHeaders()
    {
        $response = new Zend_Controller_Response_Http();
        $response->setHeader('Content-Type', 'text/html; charset='.Zend_Registry::get('configIni')->locale->encoding, true);
        $response->setHeader('Cache-Control', 'no-cache, must-revalidate', true);
        $response->setHeader('Expires', 'Mon, 01 Jan 1980 05:00:00 GMT', true);
        Zend_Registry::set('response', $response);
    }

    /*
     * Mise en place d'une instance d'adaptateur de base de données
     * pour les db client et webmaster et sauvegarde en registre
     *
     * @name    _initDatabasesAdapters
     * @access  protected
     * @return  object Zend_Db_Adapter
     */
    protected function _initDatabasesAdapters()
    {
        // on instancie les objets adapter des divers db
        $client_adapter = Zend_Db::factory(Zend_Registry::get('configIni')->db->driver, array(
            'host'     => Zend_Registry::get('configIni')->db->host,
            'username' => Zend_Registry::get('configIni')->db->user,
            'password' => Zend_Registry::get('configIni')->db->password,
            'dbname'   => 'MVC_'.Zend_Registry::get('configIni')->client->id.'_db',
            'charset'  => 'utf8',
            'options'  => array(
                              Zend_Db::CASE_FOLDING => Zend_Db::CASE_NATURAL,
                              Zend_Db::AUTO_QUOTE_IDENTIFIERS => true
                          )
        ));
        $webmaster_adapter = Zend_Db::factory(Zend_Registry::get('configIni')->db->driver, array(
            'host'     => Zend_Registry::get('configIni')->db->host,
            'username' => Zend_Registry::get('configIni')->db->user,
            'password' => Zend_Registry::get('configIni')->db->password,
            'dbname'   => 'MVC_'.Zend_Registry::get('systemIni')->webmaster->id.'_db',
            'charset'  => 'utf8',
            'options'  => array(
                              Zend_Db::CASE_FOLDING => Zend_Db::CASE_NATURAL,
                              Zend_Db::AUTO_QUOTE_IDENTIFIERS => true
                          )
        ));
        Zend_Registry::set('client_adapter', $client_adapter);
        Zend_Registry::set('webmaster_adapter', $webmaster_adapter);
    }

    /*
    * Récuperation des infos webmaster
    * Si non definit en session, on ce connecte à la DB pour récupération
    * et on sauve en session et au registre. Sinon on passe de session vers registre
    *
    * @name    getWebmasterInfos
    * @access  protected
    * @return  Zend_Db_table object
    */
    private static function getWebmasterInfos() // ? métier
    {
        if(!isset(self::$systemNamespace->webmaster))
        {
            // on recupère l'adapter en registre et l'on établie la connection à la base de données
            $webmaster_adapter = Zend_Registry::get('webmaster_adapter');
            $webmaster_adapter->getConnection();
            // on créé une instance de l'objet table
            $webmaster = new WebmasterModel(array('db' => $webmaster_adapter));
            // on recupère les infos contenu dans l'enregistrement unique d'id=1 (retourne un Rowset)
            $webmasterInfos = $webmaster->getInfos();
            $webmaster_adapter->closeConnection();
            // on sauve en registre
            Zend_Registry::set('webmasterInfos', $webmasterInfos);
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            self::$systemNamespace->webmaster = serialize(Zend_Registry::get('webmasterInfos'));
        }
        else
        {
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            $webmasterInfos = unserialize(self::$systemNamespace->webmaster);
            // on sauve en registre
            Zend_Registry::set('webmasterInfos', $webmasterInfos);
        }
    }

    /*
    * Récuperation des infos client
    * Si non definit en session, on ce connecte à la DB pour récupération
    * et on sauve en session et au registre. Sinon on passe de session vers registre
    *
    * @name    getClientInfos
    * @access  private
    * @return  Zend_Db_table object
    * @throw   Hoa_Acl_Exception
    */
    private static function getClientInfos() // ? métier
    {
        if(!isset(self::$systemNamespace->client))
        {
            // on recupère l'adapter en registre et l'on établie la connection à la base de données
            $client_adapter = Zend_Registry::get('client_adapter');
            $client_adapter->getConnection();
            // on créé une instance de l'objet table
            $client = new ClientModel(array('db' => $client_adapter));
            // on recupère les infos contenu dans l'enregistrement unique d'id=1 (retourne un Rowset)
            $clientInfos = $client->getInfos();
            $client_adapter->closeConnection();
            // on sauve en registre
            Zend_Registry::set('clientInfos', $clientInfos);
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            self::$systemNamespace->client = serialize(Zend_Registry::get('clientInfos'));
        }
        else
        {
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            $clientInfos = unserialize(self::$systemNamespace->client);
            // on sauve en registre
            Zend_Registry::set('clientInfos', $clientInfos);
        }
    }

    /*
    * instanciation et paramètrage de Zend_Controller_Front (singleton de contrôleur frontale)
    *
    * @name    setControllerFront
    * @access  public
    * @return  object Zend_Controller_Front object
    */
    public static function setControllerFront() // inutile (cf. config.ini)
    {
        self::$frontController = Zend_Controller_Front::getInstance();
        self::$frontController->throwExceptions(Zend_Registry::get('configIni')->settings->throwexeptions); // true en developpement et false en production
        self::$frontController->setBaseUrl('/');
        self::$frontController->addModuleDirectory('application/modules');
        self::$frontController->registerPlugin(new saveVisitorPathPlugin());
        self::$frontController->registerPlugin(new setModularIncludePathPlugin());
        self::$frontController->registerPlugin(new setLanguagePlugin());
        self::$frontController->registerPlugin(new setModularLayoutPlugin());
        self::$frontController->registerPlugin(new setHeadLayoutVarsPlugin());
        if(!isset(self::$userNamespace->browserInfos)) self::$frontController->registerPlugin(new getBrowserInfosPlugin());
        self::$frontController->setRouter(self::setRouter());
    }

    /*
    * instanciation et paramètrage du Zend_Controller_Router_Rewrite
    *
    * @name    setRouter
    * @access  public
    * @return  object Zend_Controller_Router_Rewrite object
    */
    public static function setRouter() // idem
    {
        $router_ini = new Zend_Config_Ini('application/data/system/router.ini', 'router_rules');
        $router = new Zend_Controller_Router_Rewrite();
        $router->removeDefaultRoutes();
        $router->addConfig($router_ini, 'routes');
        $router->setGlobalParam('langue', self::$userNamespace->langue);
        return $router;
    }

    /*
    * instanciation et paramètrage de la vue
    *
    * @name    setView
    * @access  public
    * @return  object Zend_View object
    */
    public static function setView() // une partie peut être enlevée
    {
        // on instancie l'objet de requète pour avoir la methode d'aquisition pour le nom de module
        $request = new Zend_Controller_Request_http();
        $module = ($request->getModuleName() != null) ? $request->getModuleName() : 'default';

        // on instancie la vue, son encodage et le dossier des helpers
        $view = new Zend_View();
        $view->setEncoding(Zend_Registry::get('configIni')->locale->encoding);
        $view->addHelperPath('application/modules/'.$module.'/views/helpers/');

        // on instancie viewrender pour le rendu de la vue
        $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
        $viewRenderer->setView($view);
        $viewRenderer->view->doctype(Zend_Registry::get('configIni')->locale->doctype);
        Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    }
 
voilà l'idée générale, je te conseillerais de relire le quickstart (et la doc usr les couche MVC + Bootstrap), si non les Zend Casts sont pas mal

Re: [ZF] Hérésie pour création de formulaire

par BeRoots » 28 sept. 2011, 15:06

Je vais essayer d'être le plus claire possible:

Le index.php situé à la racine:
<?php
/**
* File index
*
* Fichier de controlleur d'application chargant le bootstrap afin de
* securiser ce dernier.
*
* @version     1.0
* @since       PHP 5
* @filename    index.php
*/

/**
* On redéfinit les chemins d'inclusions pour le framework
* (racine, chemin du framework, inclusion des models)
*/
set_include_path('../0_toolbox/tools/'
    . PATH_SEPARATOR . './application/'
    . PATH_SEPARATOR . './application/commonsPlugins/'
    . PATH_SEPARATOR . './application/modules/default/models/'
    . PATH_SEPARATOR . './application/modules/default/plugins/'
    . PATH_SEPARATOR . './application/modules/default/forms/'
    . PATH_SEPARATOR . get_include_path()
);


/**
* on inclus la classe de bootstrap et on lance l'application
*/
require_once 'bootstrap.php';
bootstrap::run();
Le boostrap:
<?php   
/*
 * Class bootstrap.
 *
 * Classe de bootstrap redirigant le index.php vers celle-ci
 * et ce pour des raisons de sécurité.
 *
 * @version     1.0
 * @since       PHP 5
 * @name        bootstrap
 */

require_once "Zend/Loader/Autoloader.php";
$autoloader = Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true)
                                                   ->registerNamespace('Brts_');

class bootstrap
{
    /*
     * frontControlleur
     *
     * @access  private
     * @var     object Zend_Controller_Front object
     */
    private static $frontController = null;

    /*
     * Registry
     *
     * @access  private
     * @var     object Zend_Registry object
     */
    private static $registry = null;

    /*
     * object de session pour le nom d'espace system
     *
     * @access  private
     * @var     object Zend_Session_Namespace object
     */
    private static $systemNamespace = null;

    /*
     * object de session pour le nom d'espace system
     *
     * @access  private
     * @var     object Zend_Session_Namespace object
     */
    private static $userNamespace = null;

    /*
     * Demarrage de l'application
     *
     * @name    run
     * @access  public static
     * @return  void
     */
    public static function run()
    {
        // on paramètre le server
        self::setPhpEnvironment();
        // on initialise l'objet de registre
        self::initRegistry();
        // on recupere en registre la ref client
        self::addRefClient();
        // on initialise les sessions
        self::setSession();
        // on sauve en registre un objet de données pour config.ini
        self::addConfigIni();
        // on sauve en registre un objet de données pour system.ini
        self::addSystemIni();
        // on  paramètre l'horloge (timezone) pour le server
        self::setEnvironment();
        // on definit les deux adapter de base de données
        self::setDatabasesAdapters();
        // récupèration des infos webmaster et client
        self::getWebmasterInfos();
        self::getClientInfos();
        // on instancie et l'on paramètre le controlleur frontale
        self::setControllerFront();
        // on instancie et l'on paramètre la vue
        self::setView();
        // on envoie les headers de non mise en cache et de definition de l'encodage html
        self::sendDefaultHeaders();
        // on lance l'application
        try{
	        $response = self::$frontController->dispatch();
        }
        catch(Exception $exception){
	        exit($exception->getMessage().' at line '.$exception->getLine().', in file '.$exception->getFile());
        }
}

    /*
     * Paramètrage de l'environnement server (php)
     *
     * @name    setPhpEnvironment
     * @access  private
     * @return  void
     */
    private static function setPhpEnvironment()
    {
        error_reporting(E_ALL|E_STRICT); // E_ALL uniquement pour PHP6
        ini_set('display_errors', 'on');
        set_time_limit(10);
        ini_set("magic_quotes_runtime", '0');
        ini_set('upload_max_filesize', '3M');
        ini_set('post_max_size', '8M');
        ini_set('memory_limit', '128M');
        ini_set('max_input_time', '-1');
        ini_set('max_input_time', '-1');
    }

    /*
     * Initialisation de l'object de registre
     *
     * @name    initRegistry
     * @access  private
     */
    private static function initRegistry()
    {
        self::$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS);
        Zend_Registry::setInstance(self::$registry);
    }

    /*
     * Recupération de la reference client depuis sont url et mise en registre
     * (initialisation du registre)
     *
     * @name    addRefClient
     * @access  private
     */
    private static function addRefClient()
    {
        $exploded_domaine = explode(".", $_SERVER['HTTP_HOST']);
        $ref_client = $exploded_domaine[1];
        Zend_Registry::set('ref_client', $ref_client);
    }

    /*
     * Paramètrage et instanciation de l'objet Zend_Session
     *
     * @name    setSession
     * @access  private
     * @return  object Zend_Session object
     */
    public static function setSession()
    {
        $sessionOptions = array(
            'bug_compat_42'           => 0,
            'bug_compat_warn'         => 1,
            'cache_expire'            => 180,
            'cache_limiter'           => 'nocache',
            'cookie_domain'           => '',
            'cookie_lifetime'         => 0,
            'cookie_secure'           => 0,
            'cookie_path'             => '/',
            'entropy_file'            => '',
            'entropy_length'          => 0,
            'gc_divisor'              => 1000,
            'gc_maxlifetime'          => 1440,
            'gc_probability'          => 1,
            'hash_bits_per_character' => 5,
            'hash_function'           => 1,
            'name'                    => self::$registry->ref_client.'SessionID',
            'referer_check'           => '',
            'save_handler'            => 'files',
            'serialize_handler'       => 'php',
            'use_cookies'             => 1,
            'use_only_cookies'        => true,
            'use_trans_sid'           => 0,
            // zend_framework values
            'remember_me_seconds'     => 0,
            'strict'                  => 'on'
        );
        Zend_Session::setOptions($sessionOptions);
        Zend_Session::start();

        // on initialise les namespaces de session system et user
        self::$systemNamespace = new Zend_Session_Namespace('system');
        self::$userNamespace   = new Zend_Session_Namespace('user');

        // on regenere si besoin l'id de session toute les 30 seconde pour des raisons évidante
        // de sécurité et on pose un verrou sur l'espace de nom system afin de protéger ce dernier
        if(isset(self::$systemNamespace->session_regenerate_time) && self::$systemNamespace->session_regenerate_time < time() - 30)
        {
            // on redefinit session_regenerate_time pour controle du temps entre chaque regeneration
            self::$systemNamespace->session_regenerate_time = time();
            Zend_Session::regenerateId();
        }
        else self::$systemNamespace->session_regenerate_time = time();
    }

    /*
     * On recupere les données de configuration application en fichier ini
     * suivant si server de "developpement" ou de "production" et on les
     * passe en registre
     *
     * @name    addConfigIni
     * @access  private
     */
    private static function addConfigIni()
    {
        if($_SERVER['HTTP_HOST'] == '127.0.0.1' || $_SERVER['HTTP_HOST'] == 'localhost' || preg_match("#.loc#", $_SERVER['HTTP_HOST']))
        {
            $configIni = new Zend_Config_ini('application/data/system/config.ini', 'developpement');
        }
        else $configIni = new Zend_Config_Ini('application/data/system/config.ini', 'production');

        Zend_Registry::set('configIni', $configIni);
    }

    /*
     * On recupere les données de configuration system en fichier ini
     * suivant si server de "developpement" ou de "production" et on les
     * passe en registre
     *
     * @name    addSystemIni
     * @access  private
     * @return  object Zend_Config_ini object
     */
    private static function addSystemIni()
    {
        if($_SERVER['HTTP_HOST'] == '127.0.0.1' || $_SERVER['HTTP_HOST'] == 'localhost' || preg_match("#.loc#", $_SERVER['HTTP_HOST'])) {
            $systemIni = new Zend_Config_ini('../0_toolbox/webmasterIncludes/infos/system.ini', 'developpement');
        }
        else $systemIni = new Zend_Config_Ini('../0_toolbox/webmasterIncludes/infos/system.ini', 'production');

        Zend_Registry::set('systemIni', $systemIni);
    }

    /*
     * Paramètrage de l'environnement
     *
     * @name    setEnvironment
     * @access  private
     * @return  void
     */
    private static function setEnvironment()
    {
        date_default_timezone_set(Zend_Registry::get('configIni')->locale->timezone);
        mb_internal_encoding(Zend_Registry::get('configIni')->locale->encoding);
    }


    /*
     * Envoi des headers de l'encodage et de la mise en cache par les proxys et navigateurs
     *
     * @name    sendDefaultHeaders
     * @access  private
     */
    private static function sendDefaultHeaders()
    {
        $response = new Zend_Controller_Response_Http();
        $response->setHeader('Content-Type', 'text/html; charset='.Zend_Registry::get('configIni')->locale->encoding, true);
        $response->setHeader('Cache-Control', 'no-cache, must-revalidate', true);
        $response->setHeader('Expires', 'Mon, 01 Jan 1980 05:00:00 GMT', true);
        Zend_Registry::set('response', $response);
    }

    /*
     * Mise en place d'une instance d'adaptateur de base de données
     * pour les db client et webmaster et sauvegarde en registre
     *
     * @name    setDatabasesAdapters
     * @access  private
     * @return  object Zend_Db_Adapter
     */
    private static function setDatabasesAdapters()
    {
        // on instancie les objets adapter des divers db
        $client_adapter = Zend_Db::factory(Zend_Registry::get('configIni')->db->driver, array(
            'host'     => Zend_Registry::get('configIni')->db->host,
            'username' => Zend_Registry::get('configIni')->db->user,
            'password' => Zend_Registry::get('configIni')->db->password,
            'dbname'   => 'MVC_'.Zend_Registry::get('configIni')->client->id.'_db',
            'charset'  => 'utf8',
            'options'  => array(
                              Zend_Db::CASE_FOLDING => Zend_Db::CASE_NATURAL,
                              Zend_Db::AUTO_QUOTE_IDENTIFIERS => true
                          )
        ));
        $webmaster_adapter = Zend_Db::factory(Zend_Registry::get('configIni')->db->driver, array(
            'host'     => Zend_Registry::get('configIni')->db->host,
            'username' => Zend_Registry::get('configIni')->db->user,
            'password' => Zend_Registry::get('configIni')->db->password,
            'dbname'   => 'MVC_'.Zend_Registry::get('systemIni')->webmaster->id.'_db',
            'charset'  => 'utf8',
            'options'  => array(
                              Zend_Db::CASE_FOLDING => Zend_Db::CASE_NATURAL,
                              Zend_Db::AUTO_QUOTE_IDENTIFIERS => true
                          )
        ));
        Zend_Registry::set('client_adapter', $client_adapter);
        Zend_Registry::set('webmaster_adapter', $webmaster_adapter);
    }

    /*
    * Récuperation des infos webmaster
    * Si non definit en session, on ce connecte à la DB pour récupération
    * et on sauve en session et au registre. Sinon on passe de session vers registre
    *
    * @name    getWebmasterInfos
    * @access  private
    * @return  Zend_Db_table object
    */
    private static function getWebmasterInfos()
    {
        if(!isset(self::$systemNamespace->webmaster))
        {
            // on recupère l'adapter en registre et l'on établie la connection à la base de données
            $webmaster_adapter = Zend_Registry::get('webmaster_adapter');
            $webmaster_adapter->getConnection();
            // on créé une instance de l'objet table
            $webmaster = new WebmasterModel(array('db' => $webmaster_adapter));
            // on recupère les infos contenu dans l'enregistrement unique d'id=1 (retourne un Rowset)
            $webmasterInfos = $webmaster->getInfos();
            $webmaster_adapter->closeConnection();
            // on sauve en registre
            Zend_Registry::set('webmasterInfos', $webmasterInfos);
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            self::$systemNamespace->webmaster = serialize(Zend_Registry::get('webmasterInfos'));
        }
        else
        {
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            $webmasterInfos = unserialize(self::$systemNamespace->webmaster);
            // on sauve en registre
            Zend_Registry::set('webmasterInfos', $webmasterInfos);
        }
    }

    /*
    * Récuperation des infos client
    * Si non definit en session, on ce connecte à la DB pour récupération
    * et on sauve en session et au registre. Sinon on passe de session vers registre
    *
    * @name    getClientInfos
    * @access  private
    * @return  Zend_Db_table object
    * @throw   Hoa_Acl_Exception
    */
    private static function getClientInfos()
    {
        if(!isset(self::$systemNamespace->client))
        {
            // on recupère l'adapter en registre et l'on établie la connection à la base de données
            $client_adapter = Zend_Registry::get('client_adapter');
            $client_adapter->getConnection();
            // on créé une instance de l'objet table
            $client = new ClientModel(array('db' => $client_adapter));
            // on recupère les infos contenu dans l'enregistrement unique d'id=1 (retourne un Rowset)
            $clientInfos = $client->getInfos();
            $client_adapter->closeConnection();
            // on sauve en registre
            Zend_Registry::set('clientInfos', $clientInfos);
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            self::$systemNamespace->client = serialize(Zend_Registry::get('clientInfos'));
        }
        else
        {
            // on serialise et sauve en session pour eviter de redefinir les infos webmaster à chaque page
            $clientInfos = unserialize(self::$systemNamespace->client);
            // on sauve en registre
            Zend_Registry::set('clientInfos', $clientInfos);
        }
    }

    /*
    * instanciation et paramètrage de Zend_Controller_Front (singleton de contrôleur frontale)
    *
    * @name    setControllerFront
    * @access  public
    * @return  object Zend_Controller_Front object
    */
    public static function setControllerFront()
    {
        self::$frontController = Zend_Controller_Front::getInstance();
        self::$frontController->throwExceptions(Zend_Registry::get('configIni')->settings->throwexeptions); // true en developpement et false en production
        self::$frontController->setBaseUrl('/');
        self::$frontController->addModuleDirectory('application/modules');
        self::$frontController->registerPlugin(new saveVisitorPathPlugin());
        self::$frontController->registerPlugin(new setModularIncludePathPlugin());
        self::$frontController->registerPlugin(new setLanguagePlugin());
        self::$frontController->registerPlugin(new setModularLayoutPlugin());
        self::$frontController->registerPlugin(new setHeadLayoutVarsPlugin());
        if(!isset(self::$userNamespace->browserInfos)) self::$frontController->registerPlugin(new getBrowserInfosPlugin());
        self::$frontController->setRouter(self::setRouter());
    }

    /*
    * instanciation et paramètrage du Zend_Controller_Router_Rewrite
    *
    * @name    setRouter
    * @access  public
    * @return  object Zend_Controller_Router_Rewrite object
    */
    public static function setRouter()
    {
        $router_ini = new Zend_Config_Ini('application/data/system/router.ini', 'router_rules');
        $router = new Zend_Controller_Router_Rewrite();
        $router->removeDefaultRoutes();
        $router->addConfig($router_ini, 'routes');
        $router->setGlobalParam('langue', self::$userNamespace->langue);
        return $router;
    }

    /*
    * instanciation et paramètrage de la vue
    *
    * @name    setView
    * @access  public
    * @return  object Zend_View object
    */
    public static function setView()
    {
        // on instancie l'objet de requète pour avoir la methode d'aquisition pour le nom de module
        $request = new Zend_Controller_Request_http();
        $module = ($request->getModuleName() != null) ? $request->getModuleName() : 'default';

        // on instancie la vue, son encodage et le dossier des helpers
        $view = new Zend_View();
        $view->setEncoding(Zend_Registry::get('configIni')->locale->encoding);
        $view->addHelperPath('application/modules/'.$module.'/views/helpers/');

        // on instancie viewrender pour le rendu de la vue
        $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
        $viewRenderer->setView($view);
        $viewRenderer->view->doctype(Zend_Registry::get('configIni')->locale->doctype);
        Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    }
Un controlleur exemple (celui de mon formulaire fonctionnel):
<?php
/*
 * Class alternatestylesheetController.
 *
 * Classe controlleur d'application alternateStylesheet contenant
 *  un formulaire de selection de style CSS
 *
 * @version     1.0
 * @since       PHP 5
 * @name        alternatestylesheetController
 */

class alternatestylesheetController extends Zend_Controller_Action
{
    /*
     * object de session pour le nom d'espace user
     *
     * @access  private
     * @var     object Zend_Session_Namespace object
     */
    private static $userNamespace = null;

    /*
     * object de session pour le nom d'espace system
     *
     * @access  private
     * @var     object Zend_Session_Namespace object
     */
    private static $systemNamespace = null;

    /*
     * Liste des langues disponibles pour l'application
     *
     * @access  private
     * @var     string liste des langues disponibles
     */
    private static $listLangue = null;

   /*
     * on definit les variables de vue commune à toute les actions de ce controller
     *
     * @name    init
     * @access  public
     * @return  void
     */
    public function init()
    {
        // definition des variables de session et registre
        self::$userNamespace   = new Zend_Session_Namespace('user');
        self::$systemNamespace = new Zend_Session_Namespace('system');

        // definition des variables de layout et partial
        $this->_helper->layout->setLayout('defaultLayout');
        $this->view->headLayoutVars = Zend_Registry::get('headLayoutVars');
        $this->view->headLayoutVars['addJsFile'] = array(
                'appendfile'  => array(
                ),
                'prependfile' => array(
                    '/js/taille_police.js'
                )
            );
        $this->view->headLayoutVars['addMootools'] = true;

        // on recupère les données du config.ini pour utilisation
        $this->configIni = Zend_Registry::get('configIni');

        // on compte le nombre de langue disponible pour le site
        self::$listLangue = explode("/", $this->configIni->locale->langueListe);
    }

    /*
     *  definition de l'action pour la page index.phtml
     *
     * @name    indexAction
     * @access  public
     * @return  void
     */
    public function indexAction()
    {
        /*
         * Si mode manu ou auto, on traite l'envoi du formulaire.
         * On forward vers la premiere action de ce controller (getBrowserInfos).
         * Sinon on redirige vers le controller pager à l'index
         */
        if($this->configIni->options->styleSheetMode != 'fixe') $this->_forward("show", "alternatestylesheet", "default");
        else $this->_redirect('/'.self::$listLangue[0].'/default/pager/index');

    }

    /*
     *  definition de l'action pour la page show.phtml
     *
     * @name    showAction
     * @access  public
     * @return  void
     */
    public function showAction()
    {
        // definition des différentes variable à assigner à la vue
        $this->view->headLayoutVars['titrePage'] = 'Changer l\'apparence du site';

        // on créé l'objet formulaire pour la vue
        $form = new alternatestylesheetForm();
        
        $this->view->form = $form;
    }

    /*
     *  definition de l'action submit qui traite POST et redirige vers l'action show
     *  pour formulaire/boucle via cookie
     *
     * @name    submitAction
     * @access  public
     * @return  void
     */
    public function submitAction()
    {
        // on créé l'objet formulaire pour la vue
        $form = new alternatestylesheetForm();
        $this->view->form = $form;

        // si les données envoyées sont valident
        if($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost()))
        {
            // on recupere la valeur de POST
            $formData = $this->_request->getPost();
            
            if($form->isValid($formData))
            {
                // on recupère le style choisi
                $style_post = isset($formData['stylesheet']) ? $formData['stylesheet'] : "";

                // si le style choisi differt de default
                if($style_post != 'default')
                {
                    // on envoi un cookie de style au navigateur pour memoriser le style choisi
                    //setcookie('BRTS__style', $formData['stylesheet'], time()+604800, '/', $_SERVER['HTTP_HOST'], false, false);
                    $cookie = new Zend_Http_Cookie('BRTS__style', $formData['stylesheet'], $_SERVER['HTTP_HOST'], time()+604800, Zend_Controller_Front::getInstance()->getBaseURL(), false);
                }
                else
                {
                    // on envoi un cookie vide
                    //setcookie('BRTS__style', '', time()+604800, '/', $_SERVER['HTTP_HOST'], false, false);
                    $cookie = new Zend_Http_Cookie('BRTS__style', '', $_SERVER['HTTP_HOST'], time()+604800, Zend_Controller_Front::getInstance()->getBaseURL(), false);
                }

                // on envoi le cookie
                $response = Zend_Registry::get('response');
                $response->setHeader('Set-Cookie', $cookie, false);
                $response->sendResponse();
                
                // on redirige vers l'action show
                $this->_redirect('/'.self::$listLangue[0].'/default/alternatestylesheet/show');
            }
        }
        else
        {
            // on leve une exception pour valeur de POST invalide
            require_once 'Zend/Form/Exception.php';
            throw new Zend_Form_Exception("POST value is not valid but no validator require in file ".__FILE__." at line ".__LINE__);
        }
    }
}
le router.ini

Code : Tout sélectionner

[router_rules] ;; ;; controlleur pager ;; routes.pager.type = "Zend_Controller_Router_Route" routes.pager.route = "/:langue/:module/:controller/:action/*" routes.pager.defaults.langue = "fr" routes.pager.defaults.module = "default" routes.pager.defaults.controller = "pager" routes.pager.defaults.action = "index" ;; ;; controlleur alternateStylesheet ;; routes.alternateStylesheet.type = "Zend_Controller_Router_Route" routes.alternateStylesheet.route = "/:langue/:module/:controller/:action/*" routes.alternateStylesheet.defaults.langue = "fr" routes.alternateStylesheet.defaults.module = "default" routes.alternateStylesheet.defaults.controller = "alternateStylesheet" routes.alternateStylesheet.defaults.action = "index" ;; ;; controlleur authenticate ;; routes.authenticate.type = "Zend_Controller_Router_Route" routes.authenticate.route = "/:langue/:module/:controller/:action/*" routes.authenticate.defaults.langue = "fr" routes.authenticate.defaults.module = "default" routes.authenticate.defaults.controller = "authenticate" routes.authenticate.defaults.action = "index" ;; ;; controlleur index ;; routes.index.type = "Zend_Controller_Router_Route" routes.index.route = "/:langue/:module/:controller/:action/*" routes.index.defaults.langue = "fr" routes.index.defaults.controller = "index" routes.index.defaults.action = "index"
Je ne vous soumet pas les codes de layout, partial, vue, plugin, formulaire... pour le moment. J'aimerai déjà voir ce que vous en penser. Touts conseils au niveau de la methodologie de programmation sera bon à prendre. Si vous noté des oublies, de même...

Mon problème est donc que j'ai un rendu de mon layout avec la partie "content" corespondant à la vue vide de code htlm pour des url du style /fr/module/controlleurInexistant/ActionInexistante . Je ne comprend pas pourquoi je n'est pas de message d'erreur genre page blanche plus message pour ces routes non definit.

Merci d'avance :)

Re: [ZF] Hérésie pour création de formulaire

par devlop78 » 28 sept. 2011, 03:40

Sans code et tout, ça va être dur. Il n'y a pas de raisons ...

Re: [ZF] Hérésie pour création de formulaire

par BeRoots » 26 sept. 2011, 13:48

Etrange. Je viens de remarquer un autre problème sur mon application... J'ai resolution des url genre /fr/moduleName/controlleurInexistant/ActionInexistante .
J'ai donc le rendu de mon layout avec la partie vue vide ...
Normalement je ne devrai pas avoir une page blanche avec message d'erreur ?

Re: [ZF] Hérésie pour création de formulaire

par BeRoots » 24 sept. 2011, 22:23

J'ai construit à partir de briques en faite. J'ai essayer de refondre à la sortie de Zend_Application mais je suis tomber sur une impasse au niveau de ce que je souhaitai réaliser. Donc j'ai repris sans Zend_Application... (quelques essais de generation en modulaire via Zend_Tool en CLI mais j'ai en tout cas le même type d'arboresence sans les dossiers test, public, docs, et library).

En gros j'utilise au MVC avec vue partial pour gestion des layout...

Re: [ZF] Hérésie pour création de formulaire

par devlop78 » 24 sept. 2011, 21:50

Tu utilises Zend_Application (ensemble créé avec Zend_Tool en ligne de commande par exemple) ou tu as construit à partir des briques ? D'après ce que tu dis, ce serait plutôt le deuxième cas, car j'ai pas vraiment bien compris.

Re: [ZF] Hérésie pour création de formulaire

par BeRoots » 21 sept. 2011, 17:19

Je tenai à préciser que j'utilise l'aide de vue partial pour la gestion du layout. D'ailleur à l'affichage de mon formulaire N°1 j'ai bien affichage de mes variables passées au <head> via Zend_Debug::Dump(); mais toutes ces variables ce voit passer à NULL sur les formulaires ne fonctionnant pas (encore plus étrange car ce sont des variables tel que <title> définit en dur dans l'action appelée ou encore issue de fichier ini donc encore en dur). Si je revient sur mon premier formulaire ou sur mes controlleurs d'affichage classique de page (non formulaire), je retrouve ces variables.
Donc deux indices sur le pourquoi sa ne fonctionne pas avec ces autres formulaire: La perte de variables sur mon headLayout et le non affichage du code sources html de la partie "content" constituant ma vue (donc le formulaire).

J'espère que cela puisse vous aider ;)

[ZF] Hérésie pour création de formulaire

par BeRoots » 19 sept. 2011, 20:23

Salut à tous :)

Voila un petit moment que je développe sous la dernière release de ZF sous laquelle j'ai établie un model MVC de type modulaire, utilisant aussi les layout. Ce dernier marche nickel pour la partie simple de mon projet: l'affichage de page sous différents controlleurs.

Là où je rencontre des difficulté, c'est lorsque je souhaite créé des formulaires associés (cela va de soit) à leur controlleur respectif. J'ai créé un formulaire N°1 avec Génération via Zend_Form et bien sur résolution de sa "route" et ce dernier fonctionne à merveille (affichage de la vue avec le formulaire et soumission).

Mon problème viens du fait que je n'arrive plus à faire d'autre formulaire que celui-ci. Même si je "clone" ce dit fonctionnel formulaire en un autre formulaire avec un nom de controlleur différents, une route différente (évidemment), et bien sur la duplication des différent fichier de vue sous l'autre nom, Plus rien ne fonctionne... C'est pourtant le même formulaire, mais là on à affichage de la bonne vue mais sans aucun formulaire affiché... :evil:

Que ce soit mes nouveau formulaire, ou même le clone de mon formulaire fonctionnel, on se retrouve toujours dans le même cas: resolution de l'url avec affichage de la vue mais sans le dit formulaire (en fait affichage du layout sans la partie "contenu" correspondant au code de la vue, le conteneur html est vide)

Si quelqu'un à une idée :)
Merci d'avance...