Comment faire ?

Créer une application web

(en construction)

Les sites informatifs (souvent réalisés via WordPress) n'utilisent quasiment qu'un seul formulaire (de type contact).

Les applications web utilisent des champs de formulaire, de manière intensive, car ils sont le seul moyen pour l'utilisateur d'interagir (souvent en relation avec une base de données).

La validation des données avant l'envoi des données rend l'application professionnelle qui, de plus, doit être épurée et jolie (via des fichiers CSS dédiés : form.css, range.css, w3P.css, modales.css, doc.css, ...).

form.css est le seul fichier CSS "indispensable".

La validation des données doit aussi se faire coté serveur.

JS est le moteur des applications web. Des libraries telles que w3P.css (ou jQuery, w3codecolor.js (pour la documentation),  ...) ou des frameworks (tels que Vue.js (ou Angular.js ou React.js)) facilitent grandement le développement de ces applications.

Les applications web sont très fragiles dans le sens où la moindre modification dans le code JS (mais aussi dans le code HTML, surtout au niveau de l'attribut id) peut planter l'application (comme dans un logiciel).

index.*

Comme afficher le menu de l'application n'a de sens que si le navigateur est autorisé à utiliser le moteur JS, le menu ne doit s'afficher que si JS est activé.

Et, comme une application web est souvent placée sur un serveur (local ou externe), car souvent liée à une base de données, l'application utilisera, par exemple, la fonction w3.includeHTML(); pour injecter le menu de l'application (entre les balises entre les balises <main> et </main> (et fera donc appel au fichier la contenant : w3P.js)

La balise <main> indique le coeur de la page web.

Code HTML (index.htm complet)

<!DOCTYPE html>
<html lang="fr-BE" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-BE">
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="w3P.css" />
    <script src="w3P.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>xxx</title>
  </head>
  <body class="w3-khaki">
    <noscript class="w3-padding w3-red">Le JavaScript n'est pas activé. Cette <i>application
    web</i> requiert son activation.</noscript>
    <header class="w3-center">
      <p class="w3-xlarge w3-bold">
        Favoris <output id="onOff"></output>
      </p>
      <p>
        <a href="docUser.htm" target="_blank">Documentation</a>
      </p>
    </header>
    <p id="no-http" class="w3-padding w3-red w3-center">
      L'application requiert le PHP => le protocole http(s).
    </p>
    <main class="w3-container" data-w3-include-html="menu.txt"></main>
    <script src="index.js"></script>
  </body>
</html>

Code JS (index.js)

if(window.location.protocol.startsWith("http")){
  w3.hide("#no-http");
  if(window.location.href.indexOf("localhost")<0){
    document.getElementById("onOff").textContent=" - on line";
  }else{ // => localhost
    document.getElementById("onOff").textContent=" - off line";
  }
}else{ // => file:///
  w3.hide("main");
}

w3.includeHTML();

L'appel de la fonction w3.includeHTML() est fait à la fin du fichier afin de n'afficher le menu que si aucune erreur n'existe dans le code JS.

Commentaire sur le code HTML

L'appel du fichier w3P.css est fréquente.

<body class="w3-khaki">. w3-khaki car les couleurs de fond doivent être compatibles avec la couleur du texte bleu (lien)

Le placement du code <noscript class="w3-padding w3-red">Le JavaScript n'est pas activé. Cette application web requiert son activation.</noscript> immédiatement après la balise <body> est "obligatoire" pour prévenir l'utilisateur au cas où le JS n'est pas activé sur son navigateur.

Le code <output id="onOff"></output> permet d'indiquer si l'application tourne sur un serveur externe ou local, on-line ou off-line. (cfr code JS)

Le code <a href="docUser.htm" target="_blank">Documentation</a> est un lien vers la documentation. L'attribut target="_blank" l'affiche dans une nouvelle fenêtre. Ce fichier est alors souvent lié au fichier CSS doc.css.

L'application peut disposer d'une documentation réservée au développeur (tel que docDev_xxxxx.htm ainsi suffixé pour qu'elle ne soit pas accessible à l'utilisateur au cas où elle se trouverait sur le serveur). Ce fichier est alors souvent lié au fichier w3codecolor.js.

Enfin, le code JS :

if(window.location.protocol.startsWith("http")){
  w3.hide("#no-http");
  ...

permet de connaître le protocole utilisé par le navigateur et donc si l'application en cours d'utilisation est sur un serveur ou pas. Cette information est donnée à l'utilisateur via le code :

    <p id="no-http" class="w3-padding w3-red w3-center">
      L'application requiert le PHP => le protocole http(s).
    </p>

Le menu de l'application sera injecté entre les balises <main> et </main>

Seule la documentation (sur l'utilisation de l'application) ne requiert pas l'utilisation du JS. Elle est toujours disponible et le lien placé en dehors des balises <main> et </main>

menu.txt

Le fichier menu.txt contient tous les liens vers les fonctionnalités de l'application.

À ce stade, l'application fait appel aux fichiers suivants : menu.txt, index.htm, index.js, w3P.js et w3P.css.

docDev_xxxxx.htm

Au début du fichier docDev_xxxxx.htm peut être placé un lien vers la page d'accueil de l'application et la documentation destinée à l'utilisateur.

base de données = DB (pour DataBase)

Le fichier docDev_xxxxx.htm présente :

Le schéma relationnel des fichiers peut être réalisé avec le logiciel Draw d'OpenOffice. Le dessin peut ensuite être exporté au format SVG.

Le schéma relationnel des tables peut être réalisé avec l'outil phpMyAdmin si le type de DB est MySQL.

Le choix du type de DB est premier.

Règles facilitant la construction des requêtes

Ces règles visent notamment à faciliter l'écriture de requêtes SQL.

Nom d'une table

Le nom d'une table est composé des 37 caractères suivants : [a-z0-9] et underscore (_)

=> Il est en minuscules et ne contient jamais de caractères spéciaux : espace, caractère accentué, trait d'union, ...

Le nom d'une table est souvent au pluriel.

Nom d'un champ ou d'un un index

Le nom d'un champ, index, ... est composé des 63 caractères suivants : [a-zA-Z0-9] et underscore (_)

=> Il ne contient donc jamais de caractères spéciaux : espace, caractère accentué, trait d'union, ...

Le nom d'un champ commence toujours par une minuscule [a-z].

Autres conventions

Toute table contient une clé primaire. Le nom du champ lié à cette clé primaire débute par id_ suivi du nom de la table au singulier.

Lorsque le champ est lié à une clé étrangère le nom de ce champ débute par num_; le nom de la clé débute par FK_

num_XXXXX => FK_XXXXXn (où n>1 si nécessaire)

Le nom d'une clé primaire ou étrangère est toujours au singulier

Est dite table externe, celle qui ne contient pas de clé étrangère.

Le remplissage d'une base de données commence par celle des tables externes.

Fichiers SQL

Les fichiers SQL sont codés en UTF-8 (car les données peuvent contenir des caractères spéciaux)
Avertissement : L'affichage de ces fichiers SQL dans un navigateur web (simple clic) affichera probablement certains caractères de manière "spéciale" (car, par défaut, les navigateurs web utilise la table ANSI utilisée par le système d'exploitation). Pour télécharger un fichier, il faut faire un clic droit > "Enregistrer le contenu lié sous ...".

Pour chaque champ de chaque table sont décrits son utilité, sa structure et son lien éventuel avec un champ d'une autre table (clé étrangère)

Pour chaque table, est généré le code SQL pour la créer.

Les codes SQL pour la création des tables sont mis dans l'ordre et dans un fichier d'extension .sql

Sont ajoutés les codes SQL liés aux contraintes et aux clés étrangères.

Les premiers enregistrements (INSERT) peuvent être placés dans un second fichiers SQL.

Listing des fichiers : Astuce

Lorsque l'explorateur Windows est dans le dossier voulu, cliquer sur le champ affichant "> Ce PC > ... > ...> dossier voulu" et y taper cmd

Dans la console qui s'affiche, taper dir /b |clip
/b limite le listing au nom de fichier. |clip envoye dans le presse-papier
Il ne reste plus qu'à coller cette liste dans l'éditeur de son choix.

Pour chaque fichier, son rôle et ses liens avec les autres fichiers sont décrits.

Une partie du code peut être repris.

Bouts de code fréquents

avec SQLite

Requête de sélection : query()

<?php
header("Content-Type: application/json; charset=UTF-8");
$bdd = new PDO("sqlite:test.db");
$sql="...";
$rep = $bdd->;query($sql);
$data=$rep->fetchAll(PDO::FETCH_ASSOC);
echo "{\"lignes\":".json_encode($data)."}";
?>

Requête d'action : exec()

$bdd = new PDO("sqlite:test.db");
$sql="...";
$ok=$bdd->exec($sql); /* Retourne TRUE si succès */

if(!$ok) {echo "La requête SQL a été exécutée avec succès.";}
else{echo "N'a été exécutée avec succès la requête SQL suivante :<br>$sql";}

echo "<br>Retour à la <a href='index.htm'>page d'accueil</a>";

docUser.htm

Au début du fichier docUser.htm peut être placé un lien vers la page d'accueil de l'application.

Le fichier docUser.htm contient :

Pour chaque interface, une vue d'écran est affichée pour toutes les situations pouvant être rencontrées et une explication sur chaque champ du formulaire, lien ou bouton.

Et, d'éventuels conseils relatifs au remplissage des champs.

Dans l'application, chaque page web contient un lien vers l'ancre dédiée du fichier docUser.htm.

À la fin du fichier docUser.htm peut être placé le schéma relationnel des fichiers (sans risque de sécurité) afin de montrer le sérieux de l'application.

Structure du fichier HTML :

<!DOCTYPE html>
<html lang="fr-BE" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-BE">
  <!-- À Â Ç É È Ê Ë Î Ï Ô Ù Û Ü Ÿ Æ Œ æ œ -->
  <!--h1 ============================-->
  <!--h2 ++++++++++++++++++++++++++++-->
  <!--h3 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-->
  <!--h4 ............................-->
  <!--h5 . . . . . . . . . . . . . ..-->
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="w3P.css" />
    <link rel="stylesheet" href="doc.css" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="w3P.js"></script>
    <title>
      Documentation
    </title>
  </head>
  <body class="w3-pale-green">
    <header class="w3-center">
      <a href="index.htm">Page d'accueil</a>
      <p class="w3-xlarge w3-bold">
        Documentation
      </p>
    </header>
    <main class="w3-container">
      <h1 id="presentation">
        Présentation
      </h1><!-- h1 =================================-->
      ...
      <h1>
        Liste des interfaces et fonctionnalités :
      </h1><!-- h1 =================================-->
      <nav class="w3-pale-blue w3-round-xlarge w3-padding-small">
        <ul>
          <li>
            <a href="#index.htm">Page d'accueil</a>
          </li>
          ...
        </ul>
      </nav>
      <h1 id="index.htm">
        Page d'accueil
      </h1><!-- h2 +++++++++++++++++++++++++++++++++-->
      <p>
        L'application requiert un navigateur autorisant l'utilisation d'un interpréteur de code
        JavaScript.
      </p>
      <figure>
        <img ... />
      </figure>
      <p>
        NB : La documentation est accessible quelque soit la configuration.
      </p>
      <p>
        Lorsque le navigateur utilise le protocole s'affiche, dans la barre des URLs,
        <code>file:///</code> (ci-dessous encadré en jaune). Seule la documentation est accessible.
      </p>
      <figure>
        <img ... />
      </figure>
      <p>
        Lorsque le navigateur accède à l'application placée sur un <u>serveur local</u>, dans la
        barre des URLs, s'affiche "localhost" (ci-dessous encadré en rouge). Le menu de
        l'application est accessible et le titre de l'application est "xxx - <mark>off</mark>
        line".
      </p>
      <figure>
        <img ... />
      </figure>
      <p>
        Lorsque le navigateur accède à l'application placée sur un <u>serveur distant</u>, dans la
        barre des URLs, s'affiche "http" (ci-dessous encadré en rouge). Le menu de l'application
        est accessible et le titre de l'application est "xxx - <mark>on</mark> line".
      </p>
      <figure>
        <img ... />
      </figure>
      ...
      <h1 id="files_schema">
        Schéma relationnel des fichiers
      </h1><!-- h1 =================================-->
      <figure>
        <img src="schema.svg" alt="" />
      </figure>
    </main>
  </body>
</html>

Les champs

type="text"

Ce type de champ est le champ par défaut. L'utilisation de l'attribut type est facultatif lorsque sa valeur est text.

<textarea>

Cette balise ne dispose pas de l'attribut pattern.