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

Langage PHP Discussion :

Première application PHP (POO + MVC)


Sujet :

Langage PHP

Mode arborescent

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par défaut Première application PHP (POO + MVC)
    Bonjour,

    Avec mes quelques notions de PHP j'ai voulus créer une applications de referencement qui soit relativement scalable. J'ai voulus utiliser les notions de POO ainsi que le design pattern MVC qui sont pas forcement simple a comprendre dans la théorie !

    Voici le code de mon fichier index.php

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    <?php
     
    require("def.php");
    require("model/beers.php");
     
    class index_controller extends Controller 
    {
        var $_beers;
     
        public function __construct() 
        {
    	$this->_beers = new beers();
    	parent::__construct();
        }
     
        /*
        ** Assume that default action consist of a listing of all avaible beers 
        */
        public function defaultAction() 
        {
    	$title = "List of beers";
    	$beers = $this->_beers->get_all();
     
    	$this->render('index', compact('title', 'beers'));
        }
     
        /*
        ** Insert an input into database
        */
        public function add()
        {
    	if(isset($_POST["add"])) 
    	    {
    		$name = addslashes($_POST["name"]);
     
    		$this->_beers->insert($name);
     
    		//header("Location: " . ROOT . "/index.php");
    		header("Location: " . ROOT);
    	    }
    	else 
    	    {
    		$title = "Insert an input";
     
    		$this->render('add', compact('title'));		
    	    }
        } 
     
        // Display a preformated form and allow user to modify it
        public function modify() 
        {
    	$id = $_GET["id"];
     
    	if(isset($_POST["modify"]))
    	    {
    		$name = addslashes($_POST["name"]);
     
    		$this->_beers->modify($id, $name);
    		header("Location: " . ROOT);
    	    }
    	else
    	    {
    		$title = "Modify an input";
     
    		$name = $this->_beers->get_name($id);
     
    		$this->render("modify", compact("title", "name"));
    	    }
        }
     
        public function delete()
        {
    	$id = $_GET["id"];
     
    	if(isset($_POST["delete"]))
    	    {
    		if($_POST["delete"] == "yes")
    		    {
    			$this->_beers->delete($id);
    		    }
     
    		header("Location: " . ROOT);
    	    }
    	else
    	    {
    		$title = "Delete an input";
    		$name = $this->_beers->get_name($id);
     
    		$this->render("delete", compact("title", "name"));
    	    }
        }
    }
     
    new index_controller();
    ?>
    Ainsi que le fichier ou je definit constantes et quelques fonctions

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?php
     
    abstract class Controller 
    {
        private function root()
        {
    	return(dirname(__FILE__));
        }
     
        /*
        ** Set the global constant "ROOT" as VH document root
        */
        protected function set_root_web_app()
        {
    	preg_match('@/[^/]+@', $_SERVER["PHP_SELF"], $matches);
     
    	if(!defined("ROOT")) 
    	    {
    		//define("ROOT", $_SERVER["DOCUMENT_ROOT"]);
    		define("ROOT", $matches[0]);
    	    }
        }
     
        /*
        ** Display the given model
        */
        protected function render($file_name, $variables_array = null) 
        {
            if($variables_array)
    	    {
    		extract($variables_array);
    	    }
     
    	include("layouts/header.php");
    	//require(ROOT . '/views/' . $file_name . '.view.php');
    	//include(ROOT . "/views/" . $file_name . ".view.php");
    	include($this->root() . "/views/" . $file_name . ".view.php");
    	include("layouts/footer.php");
        }
     
        abstract function defaultAction();   
     
        private function execute_action()
        {
    	// Check if an action is given in the script name
    	//	ie index.php/add execute the add action
    	$action = substr(strrchr($_SERVER["PHP_SELF"], "/"), 1);
     
    	//echo $action;
     
    	if(strpos($action, ".php"))
    	    {
    		// Found .php extension ie not action
    		$this->defaultAction();
    	    } 
    	else 
    	    {		
    		$this->$action();       
    	    }
        }
     
        // Appel à un contrôleur avec une action qui n'existe pas
        function __call($name, $arguments){
            echo "<b>Erreur : </b> L'action $name n'est pas définie";
        }
     
        public function __construct()
        {
    	$this->set_root_web_app();
     
    	$this->execute_action();
        }   
    }
     
    ?>
    Je me suis enfait lancer a partir d'un squelette déjà commencé que j'ai repris et un peu modifier.

    Mon premier problème, c'est lorsque je passe aux pages d'ajout, de modification ou de suppression je perd le style de ma page. Je pense que c'est le fait que mes fichiers de vues ne se trouve pas a la racine. Le problème doit donc se trouver dans la fonction render mais comment faire pour ne pas recharger a chaque fois les header/footers ?

    Est-ce que l'utilisation des instructions header est une bonne technique de programmation ? Je trouve cela pas forcement très propre de modifier les header http ?

    Enfin dans mes vues j'aimerais faire un lien de retour vers la page d'acceuil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <h2><?php echo $title; ?></h2>
     
    <form name="insert_beer" action="index.php/add" method="post">
      <p><label>Name</label> : <input type="text" name="name"/></p>
      <input type="submit" name="add" value="add"/>
      <input type="reset" value="reset"/>
    </form>
     
    <a href="<?php echo ROOT;?>/index.html">homepage</a>
    Néanmoins ce lien donne comme résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erreur : L'action index.html n'est pas définie
    Dans une dernier temps si vous avez des critiques sur cette application je suis prenneur !

    Merci d'avance

    Ps: j'ajoute un dump du projet
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [2.x] Première application PHP avec Symfony2
    Par petit_fwanz dans le forum Symfony
    Réponses: 0
    Dernier message: 08/06/2011, 09h45
  2. [Critique] Premières applications Web 2.0 avec Ajax et PHP
    Par Faith's Fall dans le forum Livres
    Réponses: 1
    Dernier message: 31/08/2009, 12h59

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