1 pièce(s) jointe(s)
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:
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:
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:
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:
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