[RESOLU] Logiciel de relation client, modèle MVC

Eléphanteau du PHP | 11 Messages

24 févr. 2017, 13:20

Bonjour, j'ai un problème sur une version simplifiée d'un CRM.
Il fonctionne sur le modèle VMC.
Page controller :
include("model.php");
include("view.php");

class Controller {
  private $view;
  private $model;
  private $paramGet;

  public function __construct()  {
    $this->view = new View();
    $this->model = new Model();
    $this->paramGet = (!empty($_GET))?$_GET:array('action'=>'home');
    $this->paramPost = (!empty($_POST))?$_POST:null;
  }
  public function dispatch(){
    if ($this->paramPost) {
      $method = $this->paramPost['action'];
      $this->model->$method($this->paramPost);
    }
    switch ($this->paramGet['action']) {
      case 'home':
        $this->view->displayHome();
        break;
      case 'liste':
        $liste = $this->model->getList();
        $this->view->displayList($liste);
        break;
      case 'ajouter':
        $parmForm = $this->model->ajouter();
        $this->view->displayAjouter($parmForm);
        break;
      case 'modifier':
        $this->view->displayModifier($_GET);
        break;
      case 'supprimer':
        $this->model->supprimer($_GET);
        break;
      default:
        $this->view->displayHome();
        break;
    }
  }
}
Page model :
class Model {

  private $connection;
  private $requete;

  public function __construct(){

    define('SERVER','localhost');
    define('USER','root');
    define('PASSWORD','');
    define('BASE','table');

    // Instanciation d'un nouvel objet PDO
    // Connexion au serveur et test
    try {
      $this->connection = new PDO("mysql:host=".SERVER.";dbname=".BASE, USER, PASSWORD);
    }
    catch (Exception $e) {
      die('Erreur : ' .$e->getMessage());
    }

    // Forcer l'encodage de PDO
    $this->connection->exec("SET CHARACTER SET utf8");
  }
  public function getList() {
    $this->requete="SELECT * FROM prospects";
    $liste=null;
    try {
      // exécution de la requête
      $resultat=$this->connection->query($this->requete);
      if ($resultat) {
        $liste=$resultat->fetchAll(PDO::FETCH_NUM);
      }
    }
    catch (Exception $e) {
      die('Erreur : '  .  $e->getMessage());
    }
    return  $liste;
  }
  public function ajouter($parmForm) {
    $sql='INSERT INTO prospects VALUES ("", :parm1, :parm2, :parm3, :parm4, :parm5, :parm6)';
    $this->requete = $this->connection->prepare($sql);
    $this->requete->bindParam(':parm1', $parmForm['parm1']);
    $this->requete->bindParam(':parm2', $parmForm['parm2']);
    $this->requete->bindParam(':parm3', $parmForm['parm3']);
    $this->requete->bindParam(':parm4', $parmForm['parm4']);
    $this->requete->bindParam(':parm5', $parmForm['parm5']);
    $this->requete->bindParam(':parm6', $parmForm['parm6']);
    $this->executeTryCatch();
  }
  public function modifier($parmForm) {
    $this->requete = 'UPDATE prospects SET nom=:parm1, prenom=:parm2, adresse=:parm3, cp=:parm4, ville=:parm5, commentaire=:parm6 WHERE id=:parm0';
    $this->requete = $this->connection->prepare($this->requete);
    $this->requete->bindParam(':parm0', $parmForm['parm0']);
    $this->requete->bindParam(':parm1', $parmForm['parm1']);
    $this->requete->bindParam(':parm2', $parmForm['parm2']);
    $this->requete->bindParam(':parm3', $parmForm['parm3']);
    $this->requete->bindParam(':parm4', $parmForm['parm4']);
    $this->requete->bindParam(':parm5', $parmForm['parm5']);
    $this->requete->bindParam(':parm6', $parmForm['parm6']);
    $this->executeTryCatch();
  }
  public function supprimer($parmForm) {
    $this->requete = 'DELETE FROM prospects WHERE id=:parm0';
    $this->requete = $this->connection->prepare($this->requete);
    $this->requete->bindParam(':parm0', $parmForm['parm0']);
    $this->executeTryCatch();
    header('Location: http://localhost/php/crm/index.php?page=User&action=liste');
  }
  private function executeTryCatch() {
    try {
      $this->requete->execute();
    }
    catch (Exception $e) {
      die ('Erreur : ' . $e->getMessage());
    }
    // Ferme le curseur, permettant à la requête d'être de nouveau exécutée
    $this->requete->closeCursor();
  }
}
Page view :
class View {

  // Attribut page
  private $page;
  // Conctructeur
  public function __construct(){
    $this->page = $this->searchHTML('header');
    $this->page .= $this->searchHTML('nav');
  }

  // Affichage de la page Accueil
  public function displayHome(){
    $this->page .= "<h1>Je suis sur la page d'Accueil</h1>";
    echo $this->display();
  }


  // Affichage de la liste d'enregistrements
  public function displayList($liste){
    $this->page .="<h1>Je suis sur la liste des prospects</h1>";
    // On stock les données dans la variable $tableau
    $tableau = '<div class="container">'
    . '<table class="table table-striped table-bordered">'
    . '<thead>'
    . '<th>id</th><th>Nom</th><th>Prénom</th><th>Adresse</th><th>Code Postal</th><th>Ville</th><th>Commentaire</th><th>Modification</th><th>Suppression</th>'
    . '</thead><tbody>';
    // On boucle sur la liste et on ajouter une ligne à chaque boucle
    foreach ($liste as $ligne) {
      $tableau .= "<tr><td>$ligne[0]</td>"
      ."<td>$ligne[1]</td>"
      ."<td>$ligne[2]</td>"
      ."<td>$ligne[3]</td>"
      ."<td>$ligne[4]</td>"
      ."<td>$ligne[5]</td>"
      ."<td>$ligne[6]</td>"
      ."<td><a href='index.php?action=modifier&parm0=$ligne[0]&parm1=$ligne[1]&parm2=$ligne[2]&parm3=$ligne[3]&parm4=$ligne[4]&parm5=$ligne[5]&parm6=$ligne[6]'><span class='glyphicon glyphicon-pencil'></span></a></td>"
      ."<td><a href='index.php?action=supprimer&parm0=$ligne[0]&parm1=$ligne[1]&parm2=$ligne[2]&parm3=$ligne[3]&parm4=$ligne[4]&parm5=$ligne[5]&parm3=$ligne[6]'><span class='glyphicon glyphicon-remove'></span></a></td></tr>";
    }
    // On ferme le tableau
    $tableau .="</tbody></table></div>";
    $this->page .= $tableau;
    echo $this->display();
  }

  // Affichage du footer
  public function display(){
    $this->page .= $this->searchHTML('footer');
    echo $this->page;
  }

  // Extraction des données d'un fichier
  // parm String filename : nom du fichier dont il faut extraire le contenu
  private function searchHTML($filename){
    $content = file_get_contents('html/'.$filename.'.html');
    return $content;
  }

  // Affichage d'un enregistrement dans un formulaire
  private function displayForm($paramaters){
    $this->page .= $this->searchHTML('form');
    $this->page = str_replace("{readonly}", $paramaters["readonly"], $this->page);
    $this->page = str_replace("{parm0}", $paramaters["parm0"], $this->page);
    $this->page = str_replace("{parm1}", $paramaters["parm1"], $this->page);
    $this->page = str_replace("{parm2}", $paramaters["parm2"], $this->page);
    $this->page = str_replace("{parm3}", $paramaters["parm3"], $this->page);
    $this->page = str_replace("{parm4}", $paramaters["parm4"], $this->page);
    $this->page = str_replace("{parm5}", $paramaters["parm5"], $this->page);
    $this->page = str_replace("{parm6}", $paramaters["parm6"], $this->page);
    $this->page = str_replace("{action}", $paramaters["action"], $this->page);
    $this->page = str_replace("{lib_action}", $paramaters["lib_action"], $this->page);
    echo $this->display();
  }

  // Ajouter d'un utilisateur
  public function displayAjouter(){
    $this->page .="<h1>Je suis sur la page d'ajout d'un prospect.</h1>";
    $paramaters = array(
      "readonly"=>"",
      "parm0"=>"",
      "parm1"=>"",
      "parm2"=>"",
      "parm3"=>"",
      "parm4"=>"",
      "parm5"=>"",
      "parm6"=>"",
      "action"=>"ajouter",
      "lib_action"=>"Ajouter"
    );
    $this->displayForm($paramaters);
  }

  // Modifier un utilisateur
  public function displayModifier($paramGet){
    $this->page .="<h1>Je suis sur la page de modifier un prospect.</h1>";
    $paramaters = array(
      "readonly"=>"",
      "parm0"=>$paramGet['parm0'],
      "parm1"=>$paramGet['parm1'],
      "parm2"=>$paramGet['parm2'],
      "parm3"=>$paramGet['parm3'],
      "parm4"=>$paramGet['parm4'],
      "parm5"=>$paramGet['parm5'],
      "parm6"=>$paramGet['parm6'],
      "action"=>"modifier",
      "lib_action"=>"Modifier"
    );
    $this->displayForm($paramaters);
  }

  // Supprimer un utilisateur
  public function displaySupprimer($paramGet){
    $this->page .="<h1>Je suis sur la page de suppression d'un prospect.</h1>";
    $paramaters = array(
      "readonly"=>"",
      "parm0"=>$paramGet['parm0'],
      "parm1"=>$paramGet['parm1'],
      "parm2"=>$paramGet['parm2'],
      "parm3"=>$paramGet['parm3'],
      "parm4"=>$paramGet['parm4'],
      "parm5"=>$paramGet['parm5'],
      "parm6"=>$paramGet['parm6'],
      "action"=>"supprimer",
      "lib_action"=>"Supprimer"
    );
    $this->displayForm($paramaters);
  }
}
Le tout s'affiche dans un formulaire :
form.html :
<div class="container">
  <div class="panel-heading">
    <h2>Fiche</h2>
  </div>
  <div class="panel-body">
    <form action="index.php?page=User&action=liste" class="form-vertical" method="post">
      <fieldset>
        <div class="form-group">
          <label for="parm0">Identifiant</label>
          <input class="form-control" id="parm0" name="parm0" type="text" readonly value="{parm0}"/>
        </div>
        <div class="form-group">
          <label for="parm1">Nom</label>
          <input class="form-control" id="parm1" name="parm1" type="text" {readonly} value="{parm1}"/>
        </div>
        <div class="form-group">
          <label for="parm2">Prénom</label>
          <input class="form-control" id="parm2" name="parm2" type="text" {readonly} value="{parm2}"/>
        </div>
        <div class="form-group">
          <label for="parm3">Adresse</label>
          <input class="form-control" id="parm3" name="parm3" type="text" {readonly} value="{parm3}"/>
        </div>
        <div class="form-group">
          <label for="parm4">Code Postal</label>
          <input class="form-control" id="parm4" name="parm4" type="text" {readonly} value="{parm4}"/>
        </div>
        <div class="form-group">
          <label for="parm5">Ville</label>
          <input class="form-control" id="parm5" name="parm5" type="text" {readonly} value="{parm5}"/>
        </div>
        <div class="form-group">
          <label for="parm6">Commentaire</label>
          <input class="form-control" id="parm6" name="parm6" type="text" {readonly} value="{parm6}"/>
        </div>
      </fieldset>
      <fieldset>
        <div class="form-group">
          <button class="btn btn-primary" type="submit" id="action" name="action" value="{action}">{lib_action}</button>
        </div>
      </fieldset>
    </form>
  </div>
</div>
Pour la partie ajouter un prospect, il n'y a pas de pb. Par contre quant il suffit de modifier et de supprimer, cela ne marche pas.
Merci d'avance pour vos aides.
Dernière édition par moogli le 24 févr. 2017, 16:05, édité 1 fois.
Raison : correction titre vmc != mvc

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8747 Messages

24 févr. 2017, 15:03

salut,

qu'est ce qui ne fonctionne pas ?

ton code est long, complexe limite imbitable.
tu n'as pas besoin de trimbaler toute les données pour modifier ou supprimer seule l'id suffit.
De plus mettre cela dans l'url c'est sympa tout le monde peux modifier n'importe qui ;) (en post cela évite de permettre cette action a Mr tout le monde ;)).

Lorsque tu reçois ta requête avec l'id tu récupère les données qui correspondent à l'id et les affichent dans le formulaire. Pour la suppression directement la suppression en base.

tu as une action dans le formulaire (le bouton s'appel action) et dans l'action du formulaire (action=liste) c'est une sources de confusion.

A priori tu appelles les "bonne" méthode avec cette ligne $this->model->$method($this->paramPost);

du coup cela semble fonctionnel.
est ce que tu as bien les index action dans $_POST ?
le formulaire généré contient bien les bons noms pour les champs ?

pourquoi utiliser des noms qui ne sont pas parlant ? c'est chiant à lire et une source d'ennuie sur le long terme.
y a t'il vraiment un intérêt à passer par système de template même minimaliste comme celui ci ? tu vas pas ré-employer le formulaire ou le code pour autre chose donc a priori c'est inutile. tu peux utiliser la syntaxe heredoc pour afficher correctement le formulaire dans ton code.

il faut que tu débogue ton code, en y allant pas a pas tu pourras suivre l’enchaînement qui te conduit à "ça marche pas".

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

24 févr. 2017, 15:37

Merci pour ta réponse. Je vais regarder ça.