L3 Info : PHP et Applications Web
 
◃  Ch. 7 CRUD  ▹
 

Appli CRUD (v2)

  • Amélioration des Entités : diagramme UML
    • Classe AbstractEntite pour gérer l'attribut $persistant
    • Classe EntiteLivre qui intègre des informations de la structure de la table dans la base de données : noms et type des colonnes, clé primaire, auto_increment, clés étrangères, ...
      class EntiteLivre extends AbstractEntite
      {
          const TABLENAME = 'livre';
          static $COLNAMES = array('liv_num', 'liv_titre', 'liv_depotlegal');
          static $COLTYPES = array('number', 'text', 'date'); // par facilité, les types des formulaires => à améliorer
          static $PK = array('liv_num');  // tableau pour une éventuelle clé composite
          static $AUTOID = FALSE; // booléen indiquant si le renseignement de la clé est automatisé
          static $FK = array();  // tableau pour les éventuelles clés étrangères
      
          protected $liv_num;
          protected $liv_titre;
          protected $liv_depotlegal;
      
                      // pas dechangement pour la suite ../..
  • Automate à mettre en oeuvre : automate des états/actions du contrôleur CRUD
  • Contrôleur :
    
    // initialisation des variables $contenu et $message pour alimenter <body>
    $contenu = "";
    $message = "";
    // initialisation du connecteur myPDO pour la connexion
            // (sans nom de Table à renseigner selon le contexte)
    $myPDO = new MyPDO('mysql', $_ENV['host'], $_ENV['db'], $_ENV['user'], $_ENV['password']);
    
    if (!isset($_GET['action']))
       $_GET['action'] = "initialiser";
    
    switch ($_GET['action']) {
       case 'initialiser':
           $_SESSION['état'] = 'Accueil';
           break;
       case 'selectionnerTable':
           $myPDO->setNomTable($_GET['table_name']);
           $_SESSION['état'] = 'afficheTable';
           $_SESSION['table_name'] = $_GET['table_name'];
           break;
       case 'supprimerEntité':
          $myPDO->setNomTable($_SESSION['table_name']);
          // récupération du nom de colonne dans le GET
          $keyName = array_keys(array_diff_key($_GET, array('action'=>TRUE)))[0];
          $myPDO->delete(array($keyName => $_GET[$keyName]));
          $message .= "<p>Entité ". $_GET[$keyName]." supprimée</p>\n";
          $_SESSION['etat'] = 'afficheTable';
          break;
       case 'créerEntité': // construction du formulaire de création de l'entité
          $myPDO->setNomTable($_SESSION['table_name']);
    
          // Réflection pour récupérer la structure de l'entité
          $classeEntite = new ReflectionClass("lmsf\Entite".ucfirst($_SESSION['table_name']));
          $colNames = $classeEntite->getStaticPropertyValue("COLNAMES");
          $colTypes = $classeEntite->getStaticPropertyValue("COLTYPES");
          $paramForm = array_combine($colNames,$colTypes);
          if ($classeEntite->getStaticPropertyValue("AUTOID"))
             $paramForm = array_diff_key($paramForm,
                              array($classeEntite->getStaticPropertyValue(("PK"))[0] => TRUE));
          // $paramForm est un tableau associatif destiné à configurer le formulaire
          var_dump($paramForm);
    
          // Réflection pour récupérer la bonne vue
          $classeVue = new ReflectionClass("lmsf\Vue" . ucfirst($_SESSION['table_name']));
          $vue = $classeVue->newInstance();
          $contenu .= $vue->getForm4Entity($paramForm, "insérerEntité");
    
          // valeur par défaut non géré ci-dessus
          //$contenu .= $vue->getForm4Entity(array('liv_num' => array('type' => 'number',
          //                                       'default' => $nbEntites + 1),
          //                                       'liv_titre' => 'text',
          //                                       'liv_depotlegal' => 'date'), "insérerEntité");
    
          $_SESSION['état'] = 'formulaireTable';
          break;
       case 'modifierEntité': // construction du formulaire de modification de l'entité
          // ../..
          $_SESSION['état'] = 'formulaireTable';
          break;
       case 'insérerEntité':  // validation du formulaire de création d'une entité
          $myPDO->setNomTable($_SESSION['table_name']);
    
          // Réflection pour récupérer la structure de l'entité
          $classeEntite = new ReflectionClass("lmsf\Entite".ucfirst($_SESSION['table_name']));
          $colNames = $classeEntite->getStaticPropertyValue("COLNAMES");
          $colTypes = $classeEntite->getStaticPropertyValue("COLTYPES");
    
          $paramInsert = array_diff_key($_GET, array('action'=>'insérerEntité'));
          if ($classeEntite->getStaticPropertyValue("AUTOID"))
            $paramInsert = array_merge([$classeEntite->getStaticPropertyValue(("PK"))[0] => null],
                                        $paramInsert);
          var_dump($paramInsert);
    
          $myPDO->insert($paramInsert);
          // avant :  $myPDO->insert(['liv_num' => $_GET['liv_num'],
          //                          'liv_titre' => $_GET['liv_titre'],
          //                          'liv_depotlegal' => $_GET['liv_depotlegal'] ] );
    
          $entite = "?"; //$myPDO->get('liv_num',$_GET['liv_num']);
          $message .= "<p>Entité $entite crée</p>\n";
          $_SESSION['état'] = 'afficheTable';
          break;
       case 'sauverEntité':  // validation  du formulaire de modification de l'entité
          // ../..
    
          $_SESSION['état'] = 'afficheTable';
          break;
       default:
          $message .= "<p>Action " . $_GET['action'] . " non implémentée.</p>\n";
          $_SESSION['etat'] = 'Accueil';
    }
    
    switch ($_SESSION['état']) {
       case 'Accueil':
          $contenu .= getListeTables();
          break;
       case 'afficheTable' :
          $classeVue = new ReflectionClass("lmsf\Vue".ucfirst($_SESSION['table_name']));
          $vue = $classeVue->newInstance();
          $lesEntites = $myPDO->getAll();
          $contenu .= $vue->getAllEntities($lesEntites);
          break;
       case 'formulaireTable':
          //rien à faire, tout est fait dans la gestion des Actions ?
          break;
       default:
          $message .= "<p>état ".$_SESSION['etat']." inconnu</p>\n";
          $_SESSION['etat'] = 'Accueil';
    }
    
    
    // ajout d'un lien vers la page d'accueil
    $contenu .= "<p><a href='index.php?action=initialiser'>Accueil</a></p>\n";
    
    // ../..
  • Démo (visible uniquement lors du CM, screencast sur eureka)

  • Améliorations : gestion des valeurs obligatoires/non obligatoires dans les formulaires, ...
  • Gestion des clés étrangères, production d'une méthode de Vue pour les listes de sélections, ...