IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

Porter un code procédural dans un framework MVC (CodeIgniter/CakePHP etc.)


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Par défaut Porter un code procédural dans un framework MVC (CodeIgniter/CakePHP etc.)
    Bonjour à tous,

    Développeur Web plutôt expérimenté coté client (JS-Ajax), je cherche à mieux structurer mon code serveur en passant par un framework MVC (il était temps!).


    Je suis du genre procédural et voici le genre d'organisation que j'avais auparavant:

    - A la racine: un fichier php de classe de connexion; index.php; header.php; footer.php; onglet1.php; onglet2.php; onglet1.js; onglet2.js
    dans les fichiers onglet1.php, onglet2.php, pratiquement que de l'html sauf des fonctions de génération de code HTML (à partir de BD ou de session).
    -- des dossiers "css, img, lib" (lib: librairies javascript: jquery etc)
    -- un dossier "ajax" : avec tous les fichiers PHP contenant des méthodes / fonctions procédurales appelées en Ajax.

    J'essaie en vain de passer à CodeIgniter, mais je ne sais pas :

    - ou mettre mes fonctions de génération de code HTML, dans la vue ? dans le contrôleur ?
    - ou mettre mes dossiers css, img et js ? à la racine ? il se pose le problème d'index.php dans l'adresse que je n'arrive pas à enlever lorsque j'appelle ces fichiers.
    - ou mettre mes méthodes / fonctions appelées en Ajax? dans un "Modèle", est ce impératif ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Par défaut
    Je pense qu'il te manque un peu de "background" sur le MVC.

    1. Quand le navigateur fait une requête, ça passe par index.php qui analyse la requête et appelle le contrôleur concerné.
    2. Le contrôleur demande les données au modèle et les renvoie à la vue.
    3. La vue qui elle s'occupe de générer le code html avec les données qu'on lui a passées.

    Une image vaut mieux qu'un long discours (paraît-il) :


    Génération HTML => dans la vue
    Dossiers css, img et js : ça dépend du framework que tu utilises, mais généralement dans un sous-dossier de index.php :

    index.php
    /css
    /img
    /js

    Méthodes/fonctions appelées en ajax : dans un contrôleur, qui se chargera d'appeler les modèles et te renverra le résultat (JSON, XML, HTML...)


    Je ne suis pas un foudre de guerre dans les frameworks, mais en gros c'est ça.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Par défaut
    Merci Dolu07.

    Le problème et que lorsque je définis et utilise mes fonctions de génération HTML dans les fichiers de vue, elles génèrent une erreur:
    Using $this when not in object context
    L'objet database est pourtant initialisé mais comment le faire passer à la vue ?

    Ah oui, je ne suis pas très objet à la base...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     function MakeSelect($id, $title, $table, $code, $libelle) 
    {	// Création de Select simplifiée avec des données de la BD
    	echo '<select id="'.$id.'" name="'.$id.'" title="'.$title.'">';
    	$query = $this->db->query('SELECT DISTINCT '.$code.', '.$libelle.' FROM '.$table.' ORDER BY '.$libelle);
    	echo '<option title="Sélectionner" value="">Sélectionner</option>';
    	foreach ($query->result_array() as $row) {
    		echo '<option title="'.$row[0].'" value="'.$row[0];
    		echo '" >'.htmlspecialchars($row[1],ENT_COMPAT,'UTF-8').'</option>';
    	}
    	echo '</select>';
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Par défaut
    Ce qu'il y a dans ton fonction est exactement ce qu'on cherche à éviter dans un framework MVC.

    Tu devrais avoir une fonction dans ton Model qui fait une requête dans la DB et qui initalise ensuite une variable contenant les objets.
    EDIT : la méthode du Model, doit retourner le tableau au controleur et pas initialiser la variable, bien sûr.

    Cette variable sera passée à la vue.

    Ton controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function showAction($id, $title, $table, $code, $libelle) 
    {	// Création de Select simplifiée avec des données de la BD
    	$this->view->tesObjets	=	array();
    	$this->view->tesObjets	=	Model::getModel('tonModel')->getMyObjects($table, $code, $libelle) ;
    	$this->view->id	=	$id;
    	$this->view->title	=	$title;
    }
    Il faut que tu regardes dans la doc de CodeIgniter la manière de passer des variables à ta vue.


    Ton Model
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function getMyObjects($table, $code, $libelle) 
    {	// Création de Select simplifiée avec des données de la BD
    	$tesObjets	=	array();
    	$query = $this->db->query('SELECT DISTINCT '.$code.', '.$libelle.' FROM '.$table.' ORDER BY '.$libelle);
    	foreach ($query->result_array() as $row) {
    		$tesObjets[]	=	$row;
    	}
    	return $tesObjets;
    }
    retourne simplement un tableau d'objets.


    Et ta vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Création de Select simplifiée avec des données de la BD
    <select id="<?php echo $id ?>" name="<?php echo $id ?>" title="<?php echo $title ?>">';
    <option title="Sélectionner" value="">Sélectionner</option>
    	<?php foreach ($tesObjets as $unObjet) : ?>
    	<option title="<?php echo $unObjet[0] ?>" value="<?php echo $unObjet[0] ?>" ><?php echo htmlspecialchars($unObjet[1],ENT_COMPAT,'UTF-8') ?></option>
    	<?php endforeach; ?>
    </select>
    manipule les objets pour générer le code HTML


    Attention : c'est juste un exemple de code, ça ne va pas fonctionner, je ne connais pas CodeIgniter.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Par défaut
    J'ai vraiment du mal avec ce MVC... Je sais que je vais me passer du Modèle, facultatif sous CodeIgniter:

    Voici ce que j'ai dans mon code controlleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    	function index()
    	{
     
    		$this->load->database();
     
    		function MakeSelect($id, $title, $table, $code, $libelle)  
    		{	// Création de Select simplifiée avec des données de la BD
    			$Objet	= array();
    			$query = $this->db->query('SELECT DISTINCT '.$code.', '.$libelle.' FROM '.$table.' ORDER BY '.$libelle);
    			foreach ($query->result_array() as $row) {
    				$Objet[] = $row;
    			}
    			$this->view->Objet = $Objet;	
    			$this->view->id	= $id;
    			$this->view->title = $title;
    		}
     
    		MakeSelect('gT1Commune', 'Affiner par commune', 'rwm_communes', 'codgeo', 'libgeo');
     
    		$this->load->view('connexion');
    		$this->load->view('header');
    		$this->load->view('gesmet_view');
    		$this->load->view('footer');
    	}
    Mais j'obtiens une erreur:
    Fatal error: Using $this when not in object context in
    Pourtant la fonction se trouve bien dans la classe.

    Je suis perdu.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/08/2011, 17h41
  2. qualité du code contenu dans le framework QT
    Par guillaume07 dans le forum Qt
    Réponses: 1
    Dernier message: 29/10/2009, 15h41
  3. Réponses: 1
    Dernier message: 28/11/2007, 11h52
  4. Création d'une procédure dans une base externe par code
    Par AndréPe dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/07/2007, 10h19
  5. Perdu dans tous ces framework, mvc, et template
    Par __fabrice dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 02/09/2005, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo