AUTEUR : FRANCK OBERLECHNER, Ingénieur Système et Réseaux
SOMMAIRE
1. Préambule
4. Déclaration d'un formulaire
6. Controle de saisie des objets
7. Modification de l'état des objets
8. Mise en forme des champs du formulaire
10. La gestion des Upload ( Copie d'un fichier local vers le serveur WEB )
1) PREAMBULE
La classe ClasseForms.php permet de déclarer les éléments d'un formulaire sous forme d'objets. Ils sont ensuite transformés en HTML et associés à du code JAVASCRIPT pour la gestion des interactions entre les objets.
Types d'objets :
- Champs Texte,
- Champs Date avec ou sans calendrier Popup, Time stamp,
- Champ TextePopUp
- Champ Timer
- Champs mémo (saisie libre sur plusieurs lignes) et Editeur de type Word
- Listes simples, avec filtres, avec zone saisissable (COMBO BOX),
- Listes double en bascule, Paire de listes chainées (MERE/FILLE),
- Coches, Boutons radio,
- Sélecteur de fichiers
- Champ caché
- Slider
- Onglets
- Arbres hiérarchiques
- Sélecteur d'icones
- Sélecteur de couleur
- Listes à trier
Fonctions associées à ces objets :
- Masques de saisie,
- activations/désactivations dynamique sur coche,
- champs d'aide "Tooltips" sous forme de bulles d'aide,
- controle de validité des champs avant validation du formulaire
- Choix d'une palette prédéfinie pour tous les objets (SKINS)
Une bibliothèque d'objets formulaire DHTML généré par PHP dynamiquement ne présente un intérêt que si elle est compatible avec tous les navigateurs. Les scripts sont donc compatibles avec Internet Explorer (v6+) et Mozilla (1.3+).
Les exemples PHP exécutables sont signalés par l'icone
( la classe doit être installée au préalable )
2) LA RE-ENTRANCE
La gestion des pages est ici simplififiée par le principe de ré-entrance des pages :
Une même page servira à ajouter, modifier, corriger et enfin enregistrer les données du formulaire grace à l'appel en boucle de la page mais à un comportement différent en fonction de l'action précédente.
3) INSTALLATION
Définir un répertoire "include_path" en modifiant le fichier de configuration de PHP %SYSTEMROOT%\PHP.INI sous IIS
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
include_path = "d:/wwwroot/rubappli/communs"Décompresser dans le répertoire "include_path" du serveur PHP le fichier classeForms.php et le répertoire classeForms (ce répertoire contient toutes les ressources nécessaires à la classe)
On obtient l'arborescence :
.../Répertoire_Include
_classePath.php
classeForms.php
classeForms <dir>Editer le fichier _classePath.php et modifier la ligne DEFINE en terminant par un "/" obligatoirement, la constante INCLUDEPATH doit pointer sur le répertoire ou se situe le fichier classeForms.php et _classePath.php
// PARAMETRAGE :
DEFINE('INCLUDEPATH','/rubappli/communs/');C'est tout ! la classe est maintenant exploitable directement
EN OPTION : DEFINITION D'UN THEME DE COULEUR IMPLICITE POUR TOUT LE SITE
Créer un fichier _classeSkin.php dans le répertoire des inclusions
<?php
// 0: Rouge, 1:Bleu, 2:Gris, 4:Vert, 5:Orange
DEFINE('DEFAULT_SKIN', 5);?>
ce fichier est utilisé par les autres classes classeTableau, classeGrid tous les objets gérés par ces classes bénéficient du même thème de couleurs.
ATTENTION : L'INSTALLATION COMPLETE EST NECESSAIRE POUR TESTER LES EXEMPLES QUI SUIVENT
4) DECLARATION DU FORMULAIRE
![]()
On ne peut déclarer qu'un seul formulaire "ClasseForms" par page.
Syntaxe :
<?php balise de début de code PHP,
ATTENTION LE CODE QUI SUIT DOIT PRECEDER LA BALISE <HTML>
include('classeForms.php');
appel au code de la classe $f = New Forms; création d'un nouvel objet "formulaire" : $f $f->frm_Init($readonly,'200px'); Iinitialisation de l'objet :
les 2 paramètres sont optionnels.
1) = true, si on veut qu'une grille ne soit pas modifiée et ne serve que de visu. Une même page PHP peut donc servir à la modification, a l'ajout ou pour une simple visualisation. C'est le codage qui le déterminera
voir le comportement du mode "lecture seule"2) = '200px', c'est la largeur de la colonne label des champs en mode affichage automatique (voir la fonction frm_Ouvrir() )
$f->frm_Protection(); permet de désactiver le clic droit sur la page (Fonction optionnelle)
$f->frm_InitUpload($taillemaxi, $chemindestination, $attributsautorises);
permet dans le cas de la présence d'un champ Sélecteur de fichier d'activer la fonction UPLOAD : 3 paramètres "chaine de caractères" sont obligatoires :
1 - Le chemin de destination (obligatoire)
2 - La taille maximum du fichier en Octets téléchargeable (optionnel)
3 - Les suffixes de fichiers autorisés (le séparateur étant la virgule "," ) exemple : "DOC,XLS,TXT" (optionnel)
$f->frm_InitConfirm(); permet de demander une confirmation d'enregistrement si tous les tests sont OK avant validation du formulaire
$f->frm_InitPalette($codepalette); permet d'initialiser la couleur de tous les objets disponbible en une seule ligne :
$codepalette = 1 ( bleu ), =2 (Gris), =3 (Jaune)
La palette par défaut est rouge.
Pour définir de nouvelles palettes modifier le switch/case de la fonction.
voir le rendu$f->frm_InitFont("10"); on peut changer la taille de la fonte, par défaut sans appel à cette fonction la taille est = 10
. Appel à une fonction qui définit les objets ou aux fonctions frm_* directement.
. Appel aux fonctions qui modifient les caractéristiques des objets Ces fonctions permettent en fonction de la réentrance de modifier les champs dans leur définition (activation ou non, changer la valeur par défaut, pointage en erreur..)
$ret = $f->frm_Aiguiller();
switch ( $ret ) {...}
Analyse de la ré-entrance voir chapitre traitant le sujet ?>
Fin de définition des objets du formulaire <html>
<head>
<title>...</title>
</head>
<body>...
<?php
Insertion ici du code HTML de présentation, les menus titres de fenêtre sont à placer ici. $f->Ouvrir($modeautomatique); Affichage des champs définis ci-dessus
2 modes sont possibles ( automatique=par défaut
ou manuel )Mode automatique :
tous les champs sont placés automatiquement dans l'ordre de leur définition. Ils sont placés dans un tableau à 2 colonnes :
. A gauche : le "label" qui donne la signification du champ
. A droite : le champ.
Tous les champs sont alors alignés.Mode manuel :
Tous les champs sont à placer manuellement, il est possible de les placer dans l'ordre que l'on veut, plusieurs par ligne. Le "label" n'est pas affiché, il faut le saisir manuellement
$f->frm_Fermer(); Pour fermer le formulaire (envoi la balise </FORM> et ferme le tableau ouvert en mode automatique )
?>
5) DECLARATION DES OBJETS
Tous les champs devoient être unique dans la grille, les éventuels doublons sont signalés.
Le nom des champs doit être en majuscule pour correspondre à leurs valeur retournée par $_POST['NOMCHAMP'].
5.1) CHAMPS TEXTE
Le champ texte permet toute saisie en une seule ligne de données. Ces données peuvent être formatée par des masques.
Syntaxe :
$f->frm_ObjetChampTexte("NOM",array(
"label" => "Nom :",
"attrib" => "RU",
"width" => "100px",
"maxlength" => "20",
"help" => "ceci est le texte de l'aide",
"default" => "Nom par défaut")
);
$f->frm_ObjetChampTexte("TEL",array(
"label" => "Téléphone (*)",
"attrib" => "R",
"default" => "02.50.10.02.03",
"mask" => "##.##.##.##.##")
);
$f->frm_ObjetChampTexte("MONEY",array("label" => "Mon salaire en € sans les centimes (mask=€#_###.##)",
"attrib" => "N",
"mask" => "€#_###.##",
"help" => "Saisir le salaire à travers le masque, 2 décimales non obligatoire €#_###.##")
);
$f->frm_ObjetChampTexte("DATE_1",array("label" => "Date manuellemen ou avec calendrier (attrib=DP)",
"attrib" => "DP",
"default" => "TIMER",
"help" => "Saisir une date ou la sélectionner dans au calendrier")
);Détail des paramètres:
- label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
- default : affectation d'une valeur par défaut, dans le cas des champs DATE et TIMESTAMP si = "TIMER" alors l'horloge du serveur est récupérée.
- attrib : attributs des champs
"R" : champ obligatoire
"+" : Lecture seule ( même action que la fonction frm_ChampLectureSeule() )
"-" : Désactiver le champ ( même action que la fonction frm_ChampActif() )
"U" : transformation en majuscule
"L" : transformation en minuscule
"I" : transformation avec l'initiale en majuscule le reste du mot en minuscule"M" : pour une adresse email du type : nom@domaine.com
"N" : pour numérique, le cadrage est automatiquement placé à droite, les caractères alphanumériques autre que +, -, . sont ignorés.
"W" : préformate le champ texte en type PASSWORD
"D" : préformate la saisie au format date "jj/mm/aaaa", la saisie de l'année sur 2 caractères est automatiquement complétée à 4. ( en ajoutant "P" un bouton calendrier est ajouté à droite )
"T" : préformate la date au format "timestamp" jj/mm/aaaa hh:mm, un bouton calendrier est rajouté automatiquement la saisie manuelle n'est pas possible
"H" : format de saisie HH:MM
exemple de combinaisons : RDP (champ date obligatoire avec bouton "calendrier"), RN (numérique obligatoire)
- mask : définit un masque de saisie dynamique (voir possibilités ci-dessous)
![]()
- width : définit la largeur
- maxlength : nombre de caractères maximun
- help : affiche au niveau du champ à droite de la fenêtre une bulle d'aide, le libellé de l'aide peut contenir des balises HTML ( <b></b> pour mettre un mot en gras par exemple
5.2) CHAMPS MEMO ET EDITEUR DE TYPE WORD
Le champ mémo permet toute saisie libre en une ou plusieurs lignes.
Le champ editeur permet une saisie formatée comme un éditeur de type WORD l'objet utilise l'excellente librairie FCKeditor un peu lourde à charger à la 1ere visite mais ne fois dans le cache du navigateur quelle puissance !
Syntaxe :
$f->frm_ObjetChampMemo("MEMO", array(
"label" => "Champ Mémo",
"attrib" => "RU",
"default" => "Ceci est la valeur par défaut passé au champ ",
"help" => "Saisie libre dans cette zone",
"width" => "400px")
);
$f->frm_ObjetEditeur("EDITEUR", array(
"label" => "Champ Editeur",
"width" => "400px",
"height" => "150px",
"default" => "Ceci est la <b>valeur par défaut</b> passé au <um>champ \"Editeur\"</um><br>Le contenu de ce champ est évidemment à sauvegarder dans un champ mémo")
);
Détail des paramètres:
- label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
- attrib : attributs des champs
"R" : champ obligatoire
"U" : transformation en majuscule
"I" : transformation avec l'initiale en majsucule le reste du mot en minuscule"N" : pour numérique, le cadrage est automatiquement placé à droite, les caractères alphanumériques autre que +, -, . sont ignorés.
"+" : Lecture seule ( même action que la fonction frm_ChampLectureSeule() )
"-" : Désactiver le champ ( même action que la fonction frm_ChampActif() )"D" : préformate la saisie au format date "jj/mm/aaaa", la saisie de l'année sur 2 caractères est automatiquement complétée à 4. ( en ajoutant "P" un bouton calendrier est ajouté à droite )
"T" : préformate la date au format "timestamp" jj/mm/aaaa hh:mm, un bouton calendrier est rajouté automatiquement la saisie manuelle n'est pas possible
"H" : format de saisie HH:MM
MEMO = rows : le nombre de lignes du champ
EDITEUR = height: hauteur de la zone de saisie en pixels
Si le formulaire est en lecture seul toute la barre d'outils disparait :
5.3) CHAMPS LISTES SIMPLES ET COMPLEXES
5 fonctions permettent de gérer des listes de manière différente :
- frm_ObjetListe : liste simple on choisit un élément de la liste
- frm_ObjetListeLongue : filtrage d'une liste avec de nombreux éléments pour simplifier la recherche
- frm_Objet2Listes : création de 2 listes en liaison. La valeur retournée est la valeur du fils sélectionnée. les valeurs sont passées en un seul tableau de "hash" qui doit être de la forme :
array( "1" => "Valeur Père 1", "2" => "Valeur Père 2",
"1.1" => "Valeur fils 1 du père 1", "1.2" => "Valeur fils 2 du père 1",
"2.1" => "Valeur fils 1 du père 2 ", "1.2" => "Valeur fils 2 du père 2 "
... )
- frm_ObjetListeEditable : comportement "combo box", choix de valeur parmi une liste avec la possibilité de saisir une valeur propre. Le champ de données est caché et à pour nom le nom du champ "NOMDUCHAMP", la valeur de saisie se nomme "NOMDUCHAMP_EDIT". Quand la valeur n'est pas dans la liste les caractères du champ deviennent italique et la valeur retournée par "NOMDUCHAMP" = -1
- frm_ObjetListeBascule : création de 2 listes avec possibilité de faire glisser des valeurs de droite à gauche et réciproquement.
- Les indices des lignes sélectionnées sont concaténées dans un seul champ (caché) avec la virgule "," comme séparateur. Ce champ se nomme "NOMDUCHAMP".
- La valeur par défaut fonctionne de même : si les indices 1,3,4 sont passés par défaut alors default = "1,3,4"Syntaxe :
$f->frm_ObjetListe("LISTE_NORMALE", array(
"label" => "Liste déroulante ",
"title" => "----- Choisir une VILLE -----",
"default" => "5",
"help" => "choisir une ville de la liste",
"width" => "200px"),
$tableau1
);
$f->frm_ObjetListe("LISTE_OBLIG", array( "label" => "Capitale (*)",
"attrib" => "R",
"default" => "5",
"help" => "choisir OBLIGATOIREMENT une ville de la liste",
"width" => "200px"),
$tableau1
);
$f->frm_ObjetListe("LISTE_LNG", array( "label" => "Liste normale",
"default" => "3",
"rows" => 5,
"help" => "choisir une ville de la liste",
"width" => "200px"),
$tableau1
);
$f->frm_ObjetListeLongue("LISTE_LONGUE" ,array(
"label" => "Liste longue avec filtre (*)",
"default" => "2",
"attrib" => "RU",
"rows" => "4",
"help" => "Utiliser le champ de filtrage pour trouver et choisir une ville",
"width" => "200px",),
$tableau1
);
$f->frm_Objet2Listes("LISTE_VERT", array( "label" => "2 listes en liaison (V)",
"orientation" => "V",
"default" => "2.2",
"help" => "choisir une option et une sous-option",
"width" => "200px",
"title1" => "---choisir la ville---",
"title2" => "---choisir la curiosité---")
,
array( "1" => "Paris", "2" => "Lyon",
"3" => "Marseille", "4" => "Toulouse",
"1.1" => "Tour effel", "1.2" => "Sacré coeur",
"2.1" => "Fourvière", "2.2" => "Bellecour",
"3.1" => "Canebière", "3.2" => "Notre dame de la garde",
"4.1" => "Capitole", "4.2" => "Saint-Sernin")
);
$f->frm_ObjetListeEditable("Liste", array( "label" => "Liste éditable",
"attrib" => "RI",
"default" => "Bruxelles",
"width" => "200px",
"help" => "Saisir une valeur de la liste ou saisir une nouvelle (les valeurs hors liste sont en italique)",
),
$tableau1 );
$f->frm_ObjetBascule("LISTE_BASCULE", array( "label" => "Listes en bascule",
"default" => "1,2,3",
"attrib" => "R",
"rows"=>"10",
"title1" => "Liste gauche",
"title2" => "Liste droite",
"help" => "choisir au moins une ville",
"width" => "100px"
),
$tableau1 );
ATTRIBUTS COMMUNS
- label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
- default : valeur par défaut (indice du tableau ou valeur quelconque possible pour la fonction frm_ObjetListeEditable()
- width : largeur en pixels du champ liste
- help : bulle d'aide
- attrib : attributs des champs
"R" : champ obligatoire
"U" : transformation en majuscule
"I" : transformation avec l'initiale en majsucule le reste du mot en minuscule"+" : Lecture seule ( même action que la fonction frm_ChampLectureSeule() )
"-" : Désactiver le champ ( même action que la fonction frm_ChampActif() )- rows : nombre de lignes de la liste, dans le cas de la bascule, la valeur implicite et minimale = 7
- orientation : V pour vertical, H pour Horizontal
- title : c'est le titre de la liste, n'apparait que dans les listes déroulantes ( le paramètre rows non défini )
- title1, title2 : titre des 2 listes
MATRICE DES PARAMETRES
PARAMETRES ObjetListe ObjetListeLongue Objet2Listes ObjetListeEditable ObjetBascule label X X X X Xdefault X X X X Xwidth X X X X Xhelp X X X X Xattrib X X X X Xrows X X Xorientation Xtitle X Xtitle1, title2 X X
cas particulier de l'objet frm_ObjetListeEditable :
si l'objet a pour nom "LISTEEDITABLE", la page retourne 2 variables POST issues de champs
- $_POST['LISTEEDITABLE'] , l'indice dans la table de l'objet sélectionné ou -1 si l'élément n'est pas dans la table (c'est un champ "hidden" )
- $_POST['LISTEEDITABLE'], le libellé du champ
pour initialiser la valeur de l'objet on dispose de 3 possibilités :
- soit on passe l'indice de l'élément du tableau (numérique)
- soit une des valeurs présente dans le tableau (chaine de caractères)
- ou enfin une chaine quelconque qui n'est pas dans la liste, et qui apparait alors en italique
// ANALYSE DES VALEURS ENREGISTREES
if ( isset($_POST['LISTE_1']) ) {
// SI L'INDICE EST =-1 ALORS C'EST UNE CHAINE QU'IL FAUT PASSER EN VALEUR "PAR DEFAUT"
if ($_POST['LISTE_1']==-1) $def_liste1 = $_POST['LISTE_1_EDIT'];
else $def_liste1 = $_POST['LISTE_1'];
} else {
$def_liste1 = "Bruxelles";
}
voir le source de l'exemple ci-dessous
5.4) CHAMPS COCHES ET BOUTONS RADIO
2 fonctions permettent de manipuler des coches et des boutons radio pour activer au nom des champs liés au choix
frm_ObjetCoche : case à cocher
frm_ObjetBoutonsRadio : Boutons radios
Syntaxe :
$f->frm_ObjetCoche("DEPLACER", array(
"label" => "Mobilité", "title" => "Un déplacement est nécessaire",
"help" => "Sélectionner Si un déplacement est nécessaire",
"default" => "0",
"activation" => array("CHAMP1","CHAMP2","CHAMP3") )
);
$f->frm_ObjetBoutonsRadio("BTNSRAD", array("label" => "Sexe",
"default" => "1",
"help" => "cocher Homme ou Femme pour choisir un prénom",
"activation" => array("CHAMP1","CHAMP2") ),
$tableau1
);PARAMETRES COMMUNS
label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
default : valeur par défaut (indice du tableau ou valeur quelconque possible pour la fonction frm_ObjetListeEditable()
help : bulle d'aide
activation => array("champ1","champ2",...) : permet d'activer un ou plusieurs champs par la case à cocher ou faire correspondre à une option du bouton radio un champ qui s'activera quand elle sera sélectionnée.
noactivation => array("champ1","champ2",...) : permet de désactiver un ou plusieurs champs par la case à cocher ( un seul pour un bouton radio, plusieurs pour une coche)
SPECIFIQUE "BOUTON RADIO"orientation : V pour vertical, H pour Horizontal
![]()
5.5) SELECTEUR DE FICHIERL'utilisation du sélecteur de fichier standard HTML a été modifié pour rendre le champ modiifable uniquement par le bouton. Malheureusement on ne peut pas affecter de valeur par défaut à ce champ (limitation HTML)
![]()
La fonction de sélecteur n'a d'intéret le plus souvent que pour assurer la fonction UPLOAD. Pour activer cette fonction utiliser frm_InitUpload()
voir la description complete du mécanisme d'uploadSyntaxe :
$f->frm_ObjetSelecteur("SelectFichier",
array(
"label" => "Selecteur de fichier",
"help" => "Sélectionner un fichier",
"attrib" => "R",
"width" => "400px")
);
5.6) CHAMP "SLIDER"
L'utilisation du slider permet une saisie simplifiée et graphique de nombre entier compris dans un intervalle donné
width : c'est la largeur total du bloc graphique en pixels.
size : C'est la largeur du champ texte en nombre de caractères
Syntaxe :
$f->frm_ObjetSlider("Slider01",
array("label" => "Nombre de colonnes ",
"orientation" => "H",
"width" => "80px",
"mini"=> "1",
"maxi"=>"3",
"default" => "2",
"size" => "5",
"help" => "choisir le nombre de colonnes (1,2 ou 3)")
);
$f->frm_ObjetSlider("Slider02", array("label" => "Nombre de lignes ",
"orientation" => "V",
"height" => "120px",
"mini"=> "1",
"maxi"=>"10",
"default" => "8",
"help" => "choisir le nombre de lignes (1 à 10)")
);
5.7) CHAMP "TEXTE ET POPUP "
L'utilisation des champs "Texte et popup" permet de faire appel via une fenêtre POPUP a une liste puis en choisissant une valeur le champ est automatiquement mise à jour. L'avantage est dans l'usage de listes longues qui ne sont formées que quand c'est nécessaire.
Une URL est définie c'est elle qui est appelée quand on presse sur le bouton
.
Cette URL est soit une fenêtre en HTML (il faut dans ce cas tout gérer, le retour des valeurs compris ) soit une page PHP qui en 10 lignes gère tout (voir syntaxe de la page appelée)
PARAMETRES GENERAUX
label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
attrib : tous les attributs des champs texte ( R, U, +, -, I ...)
url : nom de la page appelée sans aucun paramètre GET
"url" => "sample19_popup_called.php",
width : largeur du champ texte
return : définit le mode de retour des valeurs (2 cas)
"id" : le champ est composé de 2 champs, un est caché "la clef" l'autre visible "la valeur". Il permet de gérer la paire "clef / valeur" d'une liste HTML
<option value="clef">la valeur affichée</option>
"value" : le champ est unique, il permet une saisie assistée depuis une liste d'élément mais aussi une saisie libre
default : valeur par défaut = indice du tableau ( "return" => "id" ) ou valeur affichée ( "return" => "value" )
defaultview : valeur par défaut affichée dans le champ visible ( "return" => "id" )
help : bulle d'aide
PARAMETRES DE MISE EN FORME DE LA FENETRE APPELEE
winwidth, winheight : largeur et hauteur de la fenetre en pixels (implicitement la largeur de la page correspond à celle du champ
rows : hauteur de la liste en nombre de lignes, la liste est centrée automatiquement
param : pour permettre un comportement différent de la fenêtre en fonction de la valeur d'un autre champ, ce paramètre prend le nom d'un autre champ.
exemple ci dessous : une liste de villes permet un pré-choix. Quand on appelle la fenêtre, celle ci recoit en paramètre la valeur de la clef de la ville on peut faire une requête en fonction pour filtrer les valeurs qui lui correspondent.
dans l'exemple ci-dessous, PARAM=1
Syntaxe :
$f->frm_ObjetChampPopup("NOMPOPUP",
array( "label" => "POPUP (avec retour id+valeur)",
"attrib" => "U",
"width" => "200px",
"url" => "sample19_popup_called.php",
"return" => "id",
"default" => "10",
"defaultview" => "SIVOM",
"winwidth" => "240",
"winheight" => "240",
"rows" => "10" )
);
$f->frm_ObjetChampPopup("NOMPOPUPMINI", array( "label" => "POPUP (taille automatique)",
"width" => "250px",
"url" => "sample19_popup_called.php",
"return" => "id" )
);
PAGE APPELEE
La page appelée est constituée de code javascript et de php. On peut simplifier son codage par l'emploi de la fonction $f->frm_popup_called
paramètre n°=1 : La fonction sait gérer 2 type de tableau : les tableaux javascript à 2 dimensions et les tableaux PHP.
Dans le cas d'un tableau javascript, on passe en chaine 'le nom de la table' à 2 dimensions qui contient les données.
Ce tableau peut être généré par une fonction PHP qui exécute une requête sur une base de données ( voir la fonction de la classe classeBases :
$base->bdd_tableversarrayjs();
var myData1 = [
["12","Action scolaire"],
["22","Action Sociale"],
...
["24","Urbanisme"]
];Dans le cas d'un tableau php, on passe en paramètre le tableau à 2 dimensions qui contient les données.
Ce tableau peut être généré par une fonction PHP qui exécute une requête sur une base de données ( voir la fonction de la classe classeBases :
$tableservices = $base->bdd_tableversliste()
$tableservice = array( "12" =>,"Action scolaire",
"22" => "Action Sociale",
...
"24" => "Urbanisme");paramètre n°=2 (optionnel) : nom de la fonction javascript qui est appelée quand la valeur sélectionnée est changée. On peut modifier l'état d'objet de la fenêtre appelante par la fonction javascript :
window.opener.document.forms[params['FORMULAIRE']].elements['CHAMP_A_MODIFIER].value = 'xxx';
ou bien
window.opener.document.forms[params['FORMULAIRE']].elements['CHAMP_A_MODIFIER].disabled=true;
paramètre n°=3 (optionnel) : afficher ou non les boutons "OK", "VALIDER", "EFFACER" (true ou false) par défaut ils sont affichés.
"EFFACER" permet d'éffacer completement le champ sinon c'est impossible autrementparamètre n°=4 (optionnel) : Tous les valeurs sont strictement numérique, toutes les autres lignes qui ont une valeur non numérique ne sont pas sélectionnables
PAR DEFAUT TOUTES LES VALEURS DOIVENT ETRE NUMERIQUES
Cette astuce permet de créer dans la liste des séparateurs qui sont inertes (les lignes de séparation et blanche.
<?php
$tablearticles = array();
$tablearticles['A0'] = "------ AGENT ---------------------------------";
if (empty($tableart_agent)) {
$tablearticles['A1'] = " L'agent n'a pas d'article !";
} else {
foreach ( $tableart_agent as $valeur => $libelle) $tablearticles[$valeur] = $libelle;
}
$tablearticles['S0'] = "";
$tablearticles['S1'] = "------ SERVICE ---------------------------------";
if (empty($tableart_service)) {
$tablearticles['S2'] = " Le service de l'agent n'a pas d'article !";
} else {
foreach ( $tableart_service as $valeur => $libelle) $tablearticles[$valeur] = $libelle;
}
$tablearticles['T0'] = "";
$tablearticles['T1'] = "------ TOUS LES ARTICLES ---------------------------------";
foreach ( $tableart_tous as $valeur => $libelle) $tablearticles[$valeur] = $libelle;
?>
Dans l'exemple ci dessous on concatène 3 tableaux et on insère entre chaque des séparateurs inertes dans la valeur est ALPHABETIQUE
Syntaxe d'une page appelée :
CODE AVEC TABLEAU JAVASCRIPT CODE AVEC TABLEAU PHP <HTML>
...
<BODY>
<SCRIPT language="javascript">
var myData1 = [
["12","Action scolaire"],
["22","Action Sociale"],
...
["24","Urbanisme"]
];
function externe() {
alert('appel a une fonction externe !');
}
</SCRIPT><?php
include('classeForms.php');
$f = New Forms;
$f->frm_Init();
$f->frm_popup_called('myData1','externe()');?>
</body>
</html><HTML>
...
<BODY>
<?php$myData = array( "12"=>"Action scolaire",
"22"=>"Action Sociale",
"26"=>"Bâtiments",
"19"=>"Bibliothèque",
...
"10"=>"SIVOM",
"15"=>"Sports",
"24"=>"Urbanisme"
);include('classeForms.php');
$f = New Forms;
$f->frm_Init();
$f->frm_popup_called($myData);
?>
</body>
</html> FONCTION DE LA CLASSE PHP "classeBases" POUR GENERER UN TABLEAU$base->bdd_connecter_base("svpinfo");
$requete = "SELECT * FROM article,Modele ORDER BY art_numinv";
$base->bdd_execsql($requete);
$base->bdd_tableversarrayjs( array("art_id","art_numinv","mod_nom"),"NomTableauJS" );
}$base->bdd_connecter_base("svpinfo");
$requete = "SELECT * FROM article,Modele ORDER BY art_numinv";
$base->bdd_execsql($requete);
$tableservices = $base->bdd_tableversliste( array("art_id","art_numinv","mod_nom") );
}
5.8) CHAMP "ARBRE HIERARCHIQUE "
L'utilisation des champs arbres permet de choisir une valeur dans un arbre
PARAMETRES GENERAUX
label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
attrib : les 2 attributs qui restent ( R, + ) sont "obligatoire" et "lecture seule"
width : largeur du champ
height : hauteur du champ
default : valeur par défaut = indice du noeud dans le tableau
lines : fait apparaitre les lignes ou non ( true | false )
rootselector : la racine de l'arbre est sélectionnable ( "true" si oui )
iconroot : nom complet (chemin inclus) de l'image de l'icone qui symbolise la racine de l'arbre
icondirclosed, icondiropened : nom de complet de l'image de l'icone qui symbolise un dossier ouvert ou fermé
$tableauTree : est le tableau de tableau de valeurs avec 3 champs :
- L'indice de l'enregistrement
- Le titre du noeud
- l'indice père ( -1 si racine de l'arbre )
Syntaxe :
$tableauTree = array(
array("0","France (0)",-1),
array("1","Paris (1)",0),
array("2","Marseille (2)",0),
array("3","Lyon (3)",0),
array("4","Place de la Concorde (4)",1),
array("5","Montmartre (5)",1),
array("6","Vieux port (6)",2),
array("7","Notre Dame de la Garde (7)",2),
array("8","Place Bellecourt (8)",3),
array("9","La croix rousse (9)",3),
array("10","Invalides (10)",1),
array("11","Sacré Coeur (11)",5),
array("12","La place du tertre (12)",5),
array("13","Trifouilly (13)",0),);
$f->frm_ObjetChampArbre("FEUILLE1",
array( "label" => "Arbre n°=1 (defaut=5)",
"attrib" => "",
"width" => "300px",
"height" => "150px",
"default" => "5",
"lines" => "false",
"title" => "Nom de l'arbre"
),
$tableauTree
);
$f->frm_ObjetChampArbre("FEUILLE2",
array( "label" => "Arbre n°=3 (defaut=4) LECTURE SEULE",
"attrib" => "+",
"width" => "300px",
"height" => "150px",
"default" => "4"
),
$tableauTree
);
Arbre n°=1 : pas de ligne, non obligatoire
Arbre n°=2 : lecture seulement
Arbre n°=3 : personnalisation des icones de l'arbre
5.9) CHAMP "SELECTEUR D'ICONES "
L'utilisation du champ sélecteur de couleur (de fond ou de textet) permet de choisir précisement un couleur et retourne une chaine de 6 caractères au format HEXADECIMAL.
PARAMETRES GENERAUX
label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
attrib : les 2 attributs qui restent ( R, + ) sont "obligatoire" et "lecture seule"
width : largeur standard du champ [optionnel]
default : valeur par défaut de la couleur de fond ou de texte [optionnel], par défaut le fond est vide (blanc) le texte est noir.
target : choix de la couleur du texte "TEXT" ou du fond 'BACKGROUND"
Syntaxe :
$f->frm_ObjetColorPicker("LE_FOND",
array( "label" => "Couleur du fond",
"help" => "Saisir une couleur pour le fond",
"default" => "3399CC",
"target" => "background")
);
$f->frm_ObjetColorPicker("LE_TEXT",
array( "label" => "Couleur du texte",
"help" => "Saisir une couleur pour le texte",
"default" => "660033",
"target" => "text")
);
5.10) CHAMP "TIMER"
L'utilisation d'un champ timer permet d'alimenter un champ TIMESTAMP de base de données avec l'horloge du client. Pour gérer l'horloge côté serveur on le fera par programmation.
Le format en retour peut être SQL (AAAA/MM/JJ HH:MM:SS) ou français (JJ/MM/AAAA HH:MM:SS)
PARAMETRES GENERAUX
$f->frm_ObjetTimer("MON_TIMER",
array("label" => "Horloge",
"width" => "70px",
"icon" => true / false,
"format" => "french" / "iso"
)
);
5.11) CHAMP "SELECTEUR DE COULEURS " (ColorPicker)
L'utilisation d'un champ timer permet d'alimenter un champ TIMESTAMP de base de données avec l'horloge du client. Pour gérer l'horloge côté serveur on le fera par programmation.
Le format en retour peut être SQL (AAAA/MM/JJ HH:MM:SS) ou français (JJ/MM/AAAA HH:MM:SS)
PARAMETRES GENERAUX
$f->frm_ObjetTimer("MON_TIMER",
array("label" => "Horloge",
"width" => "70px",
"icon" => true / false,
"format" => "french" / "iso"
)
);
5.12) CHAMP "LISTE A TRIER " (SortSelect)
L'utilisation d'un champ SortSelect permet de trier une liste
PARAMETRES GENERAUX
label : c'est le texte qui apparait dans la colonne des labels (mode affichage automatique) et quand une erreur de saisie est détectée à la validation du formulaire.
width : largeur standard du champ [optionnel]
default : valeur par défaut préselectionnée dans la liste pas grand interet.
rows : nombre de lignes de la liste
order : chaine qui comprend les indices du tableau trié séparés par une virgule ","
help : Aide en ligne
separators : si la chaine est "true" alors les séparateurs sont autorisés on peut alors insérer ou supprimer un séparateur de lignes
separatorvalue : valeur dans la chaine "ordre" qui sera prise en compte pour signifier le sépérateur ( par défaut = "-" le moins )
separatortext : chaine de caractère qui symbolisera visuellement le séparateur ( par défaut une chaine plusieurs "-" )
Sans l'option "separators"
Avec l'option "separators"
frm_ObjetSortSelect("LISTE_T2"
array(
"label" => "Liste à trier",
"rows" => "10",
"separators" => "true",
"separatorvalue" => "*",
"separatortext" => "___________________________",
"default" => $def2,
"order" => $ordre2,
"help" => "Trier la liste",
"width" => "100px"),
$tableau1
);
avec le hash :
$tableau1 = array( "1" => "1-Paris","2" => "2-Lyon","3" => "3-Marseille","4" => "4-Toulouse","5" => "5-Bordeaux",
"6" => "6-Nantes" );
5.20) CHAMP CACHE
L'utilisation du champ caché permet de véhiculer une variable et de la retourner en POST
Syntaxe :
frm_ObjetChampCache("NOMDUCHAMP", "VALEUR_PAR_DEFAUT");
5.21) LES ONGLETS
L'utilisation des onglets permet de condenser sur une seule page sans bouger les ascenseurs, un nombre important de champs classés et distribués logiquement. Dans le cas suivant, l'activation de la case à cocher active les champs dépendants de cet objet mais aussi l'onglet du 1er champ de cette liste.
2 fonctions permettent de manipuler les onglets :
frm_OngletDefinir : appelée une seul fois avant la définition du 1er champ
width, height = dimension de l'onglet
space = largeur de tabulation entre le libelle et le champ lui-même
default = "Le nom de l'onglet"frm_OngletNouveau : Appelée au début de chaque onglet, la femeture de l'onglet est déclenchée par l'appel à un nouvel onglet ou la fin du formulaire
frm_OngletDefaut : Appelée apres la définition des onglets pour Modifier l'onglet qui sera affiché au chargement de la page, indifféremment l'indice ou le nom de l'onglet ( le 1er étant = 0)
$f->frm_OngletDefinir("Adresse"); ou
$f->frm_OngletDefinir(1);
Syntaxe :
$f = New Forms;
$f->frm_Init(false,"150px");$f->frm_OngletDefinir( array("width" => "550px", "height" => "200px","default" => "Titulaire" ) );
$f->frm_ObjetChampTexte("CHAMP1", ... // ces 2 champs ne sont pas dans les onglets
$f->frm_ObjetChampTexte("CHAMP2", ...
$f->frm_OngletNouveau('Titulaire');
$f->frm_ObjetChampTexte("NOM", ...
$f->frm_ObjetChampTexte("PRENOM", ...
$f->frm_ObjetChampTexte("DATEABON", ...
$f->frm_ObjetCoche("ADRESSEABON",...$f->frm_OngletNouveau('Adresse');
$f->frm_ObjetChampTexte("NUMRUE", ...
$f->frm_ObjetChampTexte("NOMRUE", ...
$f->frm_ObjetChampTexte("CP", ...
$f->frm_ObjetChampTexte("VILLE", ...
En cas de validation du formulaire sans avoir saisi les champs obligatoires, on obtient une erreur sitant le nom de l'onglet et celui du champ incorrect.
5.22) LES SEPARATEURS DE PARAGRAPHES
L'utilisation des séparateurs de paragraphes permet de condenser comme les onglets sur une seule page sans bouger les ascenseurs, un nombre important de champs classés et distribués logiquement.
2 fonctions permettent de manipuler les séparateurs :
frm_EnteteDefinir : appelée une seul fois avant la définition du 1er champ
2 paramètres :
exclusif = ouverture exclusive des paragraphes (l'ouverture d'un par nouveau ferme automatiquement l'ancien paragraphe)
valeur : true / false
sauvegarder l'état = sauvegarde par cookie de l'état des paragraphes
valeur : true / falsefrm_EnteteNouveau : Appelée au début de chaque paragraphe, sa fermeture est déclenchée par la définition d'un nouveau paragraphe ou la fin du formulaire
2 paramètres :
titre = titre du paragraphe
valeur : chaine de caractères
Pré-déployé = déploiement automatique du paragraphe
valeur : true / falseSyntaxe :
$f = New Forms;
$f->frm_Init(false,"150px");$f->frm_EnteteDefinir($modeexclusif,$sauveretat);
$f->frm_ObjetChampTexte("CHAMP1", ...
$f->frm_ObjetChampTexte("CHAMP2", ...
// ces 2 champs ne sont pas dans le 1er paragraphe$f->frm_EntereNouveau('CHAPITRE N°=1');
$f->frm_ObjetChampTexte("...
$f->frm_ObjetChampTexte("...
$f->frm_ObjetChampTexte("...$f->frm_EntereNouveau('CHAPITRE N°=2');
$f->frm_ObjetChampTexte(...
$f->frm_ObjetChampTexte(...
$f->frm_ObjetChampTexte(...
$f->frm_ObjetChampTexte(...COMPORTEMENT EN CAS D'ERREUR DE SAISIE : Les paragraphes sont automatiquement déployés
5.23) LES SCROLLER DE CHAMPS
L'utilisation d'un nombre important de champ et la nécessité de voir en permanence les boutons peut amener à l'emploi de scroller (fonctions CSS standards)
3 fonctions permettent de manipuler les scrollers :
frm_InitScroller(...) : appelée une seul fois avant la définition du 1er champ
4 paramètres :
la largeur en pixel = obligatoire
la hauteur en pixel = obligatoirela couleur du fond = pour faire ressortir la zone de scroll on peut lui donner une couleur (mettre en blanc par défaut)
le mode automatique ou manuel = en mode automatique tous les champs qui seront définis seront dans la zone de scroll. En mode manuel, il faut ouvrir et fermer la zone de scroll.frm_ScrollerOpen(), frm_ScrollerClose(): Appelée entre chaque définition de champ, pas de paramètre
Syntaxe :
$f = New Forms;
$f->frm_Init(false,"200px");
$f->frm_InitScroller("400","90","#FFE0D2",false);
$f->frm_ObjetChampTexte("Champ1", ...$f->frm_ObjetChampTexte("Champ2", ...
...
$f->frm_ScrollerOpen();
$f->frm_ObjetChampTexte("Champ3", ...
..$f->frm_ScrollerClose();
$f->frm_Ouvrir();
ATTENTION : NE PLACER DANS LA ZONE DE SCROLL QUE DES CHAMPS DE TYPE "TEXTE" CAR SINON LES OBJETS COMPLEXES PEUVENT AVOIR UN COMPORTEMENT IMPREVU (Voir exemple ci-dessous)
2 modes de saisie des informations peuvent co-éxister :
6.1) CONTROLE COTE "CLIENT"
Ce mode de saisie effectué en Javascript est effectué à la volée (cas des attributs "masques" et "N" ) ou à la validation du formulaire ( submit() ) pour l'attribut obligatoire "R" par exemple.
Controle à la validation, quand un ou plusieurs champs ne sont pas remplis correctement, une fenêtre d'alerte apparait à la validation en donnant la liste des champs à modifier :
![]()
Quand la fenêtre d'alerte est fermée le curseur est positionné sur le 1er champ en erreur.
Une exception au controle des champs est l'attribut "S" ( submit() ) il est prioritaire sur tout attribut "R", il provoque une sortie du code ( voir chapitre traitant l'attribut "S" )
La fonction frm_InitConfirm() permet si tous les tests précédents sont OK de demander confirmation d'enregistrement :
![]()
dans le cas d'un ajout
ou "Enregistrement de la modification ?" dans le cas d'une modification.on peut definir un message sur mesure en appelant la fonction par frm_InitConfirm("Message a afficher en cas de validation")
Par la fonction frm_InitConfirmCancel() on peut comme avec la fonction frm_InitConfirm() demander la confirmation pour rétablir les valeurs par défaut. Cette fonction est très pratique dans le cas des grilles qui ont beaucoup de champs à saisir.
6.2) CONTROLE COTE "SERVEUR"
Ce mode est entièrement à programmer dans la section "aiguillage" de la réentrance (voir schéma)
Les fonctions suivantes permettent de modifier l'état d'un champ (valeur par défaut, activation ou non...) après sa définition mais avant son affichage
Lors de la réentrance du formulaire (A1 ou M1), la valeur des champs peut-être testée ( $_POST['NOM_DU_CHAMP'] ) si la valeur ne correspondant pas a celle attendu, il faut marquer le champ par la fonction :frm_ChampEnErreur()
syntaxe :
frm_ChampEnErreur('NOMCHAMP','MESSAGE D\'ERREUR');
exemple :
//APRES LA DEFINITION DES CHAMPS
if ( $_POST['CHOIX'] != '3' ) {
$f->frm_ChampEnErreur("CHOIX", "<h1>ATTENTION</h1>Confort doit etre cochées");
}
if ( $_POST['VILLE'] != 'NANTES' ) {
$f->frm_ChampEnErreur("VILLE", "La ville doit être NANTES");
}// AVANT L'AFFICHAGE DES CHAMPS
Dans le même principe des autres fonctions du chapitre 7) frm_ChampActif() permet d'activer ou non un champ en fonction de tests et ce quelque soit l'état défini par défaut.
frm_ChampLectureSeule() permet de définir qu'un champ est en lecture seule
Comme la fonction précédente, frm_ChampInitialiserValeur() permet de modifier la valeur par défaut du champ.
syntaxe :
frm_ChampInitialiserValeur("NOM_DU_CHAMP","Valeur du Champ");
Comme la fonction précédente, frm_ChampInitialiserValeur() permet de modifier la valeur par défaut du champ de tous les champs déclaré par rapport aux valeurs d'un tableau hash. Ce tableau sera généré par la fonction bdd_resultats_vers_tableau() de la classe "classeBase".
syntaxe :
frm_ChargerLesChamps( array("NOMCHAMP1" => "Valeur1", ...) );
Pour simplifier le codage d'une page réentrante, un seul appel à la fonction frm_ChampsRecopier() permet de donner comme valeur par défaut à tous les champs la valeur $_POST venant de la page précédante. On les trouvera dans la section de code A1 et M1.
syntaxe :
case "M1" :
// SI AUCUNE ERREUR NE SUBSISTE ALORS ON ENREGISTRE LA MODIFICATION ET ON SORT
if ($cpterreur==0) {
$requete = $base->bdd_creationrequete("agents","agent_id","M" );
$base->bdd_execsql($requete);
header("Location: maj_annuaire.php#".$_POST['AGENT_ID']);
}
// SINON ON REAFFICHE LE FORMULAIRE
$requete = "SELECT * FROM agents WHERE agent_id=" . $_GET['agent_id'];
$base->bdd_execsql($requete);
$titrefenetre = "MISE A JOUR DE : " .
$base->bdd_lire_champ("agent_prenom") ." " .$base->bdd_lire_champ("agent_nom");
$f->frm_ChampsRecopier();
break;
Par défaut le bouton "valider" d'un formulaire est désactivé jusqu'à modification d'un champ dans le 1er appel de la page (A0 ou M0).
Une fois la page réentrante, le bouton "valider" est toujours activé. La fonction : frm_ActiverBtnValider() permet de forcer l'activation du bouton dès le début de la page.
Pour réaliser des calculs entre les champs textes ou toute autre action utiliser l'attribut "script" en placer comme valeur le nom de la fonction javascript executée à chaque sortie ou validation du champ
exemple "addition()"
la page doit alors contenir le code spécifique ce code n'est pas géré par classeforms
<script language="JavaScript" type="text/JavaScript">
<!--function addition() {
KW_calcForm('AJOUT_RESULTAT',100,-1,'#AJOUT_1','+','#AJOUT_2','+','#AJOUT_3');
}function soustraction() {
KW_calcForm('SOUST_RESULTAT',100,-1,'#SOUST_1','-','#SOUST_2');
}//-->
</script>
Par défaut, le moyen le plus simple d'afficher les champs qui ont été déclaré est le mode automatique. Les champs sont insérés dans un tableau à 2 colonnes (la colonne de gauche comprend le label, celle de droite le champ lui même.
Ce mode permet néanmoins de faire varier la positions des champs en largeur :
$f->frm_Init($readonly,'200px');
et de faire des sauts de lignes entre les champs :
$f->frm_SautLignes(2);
Quand le positionnement automatique ne correspond pas à ce que l'on veut il ya toujours la possibilité de placer les champs manuellement. Dans ce cas la génération du tableau qui reçoit les labels dans la colonne de gauche et les champs dans celle de droite ne se fait pas
syntaxe :
$f->frm_Ouvrir(false);
ATTENTION NE PAS OUBLIER DE PLACER MANUELLEMENT LES BOUTONS DE VALIDATION ET D'ANNULATION
<?php $f->frm_AfficheBtnValider(); ?>
<?php $f->frm_AfficheBtnAnnulerQuitter(); ?>LA VUE CI-DESSOUS EST CELLE DE L'EDITEUR EN MODE RENDU
Par défaut les boutons ont les libellés suivants :
![]()
Il est possible de modifier le libellé des boutons suivants par l'usage de la fonction :
Implicitement : $f->frm_LibBoutons('Valider','Quitter','Rétablir');
On peut choisir par exemple : $f->frm_LibBoutons('OK','Sortir','Annuler');
Le bouton Valider est inactif jusqu'a ce qu'on rendre dans un champ et quand il y a plus d'un champ dans le formulaire :
Il est possible cependant de pré-activer le bouton VALIDER
Déclaration de la fonction : $f->frm_ActiverBtnValider();
Pour réaliser des sauts de lignes entre les objets utiliser la fonction $f->frm_SautLignes()
Implicitement : $f->frm_SautLignes();
provoque 1 seul saut de ligne avant l'objet suivant
$f->frm_SautLignes(2);
provoque 2 sauts de lignes avant l'objet suivant
Comme décrit dans le schéma, il faut analyser en PHP avant d'envoyer la 1ere balise HTML les codes $_POST pour savoir dans quel état doit se trouver la page.
9.1) APPEL D'UNE FENETRE EN MODE "AJOUT"
par convention l'appel d'une page en ajout se fait sans paramètre GET
( syntaxe d'appel : nom_page.php )Dans ce cas les états que pourra prendre la page seront :
A0 : 1er appel à la page, on met les champs à blanc
A1 : on analyse les champs (récupéré en $_POST)
AQ : la touche "quitter" a été pressée on branche à la page suivant (liste, menu général...) par la fonction
header("Location: AfficherResultats.php");
9.2) APPEL D'UNE FENETRE EN MODE "MODIFICATION"
par convention l'appel d'une page en ajout se fait avec un ou plusieurs paramètres GET
( syntaxe d'appel : nom_page.php?id=100 )Dans ce cas les états que pourra prendre la page seront :
M0 : 1er appel à la page, on récupère le paramère $_GET, on lit l'enregistrement correspondant à la valeur de la clef
M1 : on analyse les champs (récupéré en $_POST)
MQ : la touche "quitter" a été pressée on branche à la page suivant (liste, menu général...) par la fonction
header("Location: AfficherResultats.php");
9.3) APPEL D'UNE FENETRE EN MODE "CONSULTATION"
par convention l'appel d'une page en ajout se fait avec plusieurs paramètres GET
( syntaxe d'appel : nom_page.php?id=100&RO=yes )Dans ce cas les états que pourra prendre la page seront :
L0 : 1er appel à la page, on récupère les paramères $_GET, on lit l'enregistrement correspondant à la valeur de la clef
L1 : n-ieme appel à la page, on récupère les paramères $_GET, on lit peut dans ce cas
LQ : la touche "quitter" (c'est la seule affichée dans ce cas) a été pressée on branche à la page suivant (liste, menu général...) par la fonction
header("Location: AfficherListe.php");Pour utiliser un formulaire en consultation c'est facile :
<?php
$consultation = isset($_GET['RO']);
$f->frm_Init($consultation,'200px');
...?>
$f->frm_LibBoutons("Effacer","Sortir","");Dans le cas ou on choisit le bouton "Effacer", La page sera ré-entrante avec le statut "L1"
$f->frm_LibBoutons("","Sortir","");
La chaine n°=1 doit être une chaine vide
Dans ce cas, La page sera ré-entrante avec le statut "LQ"
9.4) AIGUILLER VERS LE BON CODE A EXECUTER
Dans les 3 cas précédants, il est nécessaire de faire un appel à la fonction frm_Aiguiller() (les objets doivent préalablement être déclarés)
$ret = $f->frm_Aiguiller('NOM_DE_LA_CLEF');
switch ( $ret ) {case "A0" :
$action = "APPEL A LA FENETRE EN AJOUT n°1";
break;case "A1" :
$action = "APPEL A LA FENETRE EN AJOUT n°2 et +";
// controler les variables $_POST
// si pb faire appel à la fonction "frm_ChampsRecopier()", tous les champs sont recopiés
// si pas de pb alors :
// - on sauvegarde des données
// - on branche header("Location: AfficherListe.php");
break;case "AQ" :
header("Location: AfficherListe.php");
break;}
9.5) L'ATTRIBUT "S" POUR "SUBMIT()"
L'attribut "S" permet en cas de changement de valeur d'un champ de forcer la réentrance du formulaire, il suffit d'analyser sa valeur pour définir de nouveaux champs ou modifier des valeurs. On peut l'utiliser principalement avec des boutons radios ou des listes.
Exemple d'application : On souhaite par exemple renseigner une liste avec les 36000 communes de France. Le chargement et l'affichage donnerait des temps de réponse catastrophique. On préférera définir une liste des département avec l'attribut "S" et dans la réentrance charger uniquement les communes de ce département après un filtrage sur le département choisi.
Syntaxe :
$ret = $f->frm_Aiguiller('NOM_DE_LA_CLEF');
switch ( $ret ) {9.6) SAUVEGARDER DES VALEURS DE CHAMPS
Il est parfois nécessaire de mémoriser des paramètrage environnementaux ou des choix par défaut sans que celà soit nécessaire dans une base de données dans ce cas on choisira :
- les variables de session si la durée de vie de l'information est limitée au temps ou l'utilisateur est connecté à l'application
- les cookies pour mémoriser des informations sur plusieurs mois
exemple : on veut proposer par défaut à un utilisateur le choix du format d'étiquette qu'il utilise tout le temps.Syntaxe :
... les champs viennent d'être défini
$ret = $f->frm_Aiguiller('NOM_DE_LA_CLEF');
switch ( $ret ) {case "A0" :
...
$f->frm_ChampInitialiserValeur("ETIQUETTES", $_COOKIE["ETI_ID"] );
break;
case "A1" :
...
setcookie("ETI_ID", $_POST['ETIQUETTES'], time()+86400*9999);
break;}
Explications : la valeur est potionnée
Php nativement offre des fonctions qui associées à l'objet "sélecteur de fichiers" permettent de télécharger sur le serveur des fichiers locaux.
TECHNOLOGIE PHP :
La taille maximum d'un fichier téléchargeable est fixé par plusieurs paramètres :
- Le fichier php.ini,
si safe_mode = On, alors on ne peut modifier la limite système "PHP" dynamiquement il faut modifier les paramètres upload_max_filesize et post_max_size comme suit avec obligatoirement upload_max_filesize <= post_max_size;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;; Whether to allow HTTP file uploads.
file_uploads = On; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =; Maximum allowed size for uploaded files.
upload_max_filesize = 200M
....
; Maximum size of POST data that PHP will accept.
post_max_size = 200M
- le champ texte caché MAX_FILE_SIZE qui conditionne la taille maximale pour le formualire
<input name="MAX_FILE_SIZE" type="hidden" value="100000000">
LES FONCTIONS SPECIALISEES DANS L'UPLOAD DE LA CLASSE
la classe formulaire place automatiquement ce champ si un champ sélecteur est positionné et si la fonction : frm_InitUpload() est appelée avec comme paramètre :
$f->frm_InitUpload($destination,$taillemaxi,$suffixes)
- $destination est le chemin physique ou sont copiés les fichiers [OBLIGATOIRE]
- $taillemaxi est la taille en octets maximums autorisée pour ce formulaire [OPTIONNEL] si non précisé limite = limite du système
- $suffixe est la liste des suffixes en majuscule séparés par une virgule
$tabretour = $f->frm_Upload($nomchampfichier,$prefix="");
- $nomchampfichier est le nom du champ sélecteur [OBLIGATOIRE]
- $prefix est le préfixe qui sera ajouter au fichier physique pour éviter les doublonnages
- $tabretour est un hash qui permet de récupérer des caractèristiques physiques du fichiers effectivement écrit
$tabretour[ 'logicalname'] est le nom logique du fichier avant son éventuel pré-fixage
$tabretour[ 'physicalname'] est le nom physique du fichier après son éventuel pré-fixage mais sans le chemin d'accès
$tabretour[ 'physicalfullname'] est le nom physique du fichier qui a été effectivement écrit
$tabretour[ 'errorlib'] est le libellé en clair de l'erreur
$tabretour[ 'suffix'] est le suffixe du fichier
$tabretour[ 'error'] est le code de l'erreur
Dans l'exemple ci dessous les seuls fichiers de type DOC et XLS de moins de 10Mo seront autorisés
include('classeForms.php');
$f = New Forms;
$f->frm_Init(false,'100px');
$f->frm_InitUpload("D:/TEMP/","10000000","DOC,XLS");
$f->frm_LibBoutons('Attacher','Quitter','Annuler');
definition_des_champs();$ret = $f->frm_Aiguiller('DOC_ID');
switch ( $ret ) {
case "A0" :
break;
case "A1" :
// TEST SI LE FICHIER N'EXISTE PAS DEJA
$tabretour = $f->frm_Upload('DOC_URL',"");
if ($tabretour['error']==0) {// ici se place le code quand tout est OK
// - saugegarder dans la base les autres champs
// faire un branchement automatique par la fonction : header();
} else {$f->frm_ChampEnErreur('DOC_URL',$tabretour['errorlib']);
}
// SINON A REAFFICHE LE FORMULAIRE COMPLET
$f->frm_ChampsRecopier();
break;
case "AQ" :
break;}
![]()
L' EXEMPLE EST SUCCEPTIBLE DE NE PAS FONCTIONNER SUR UN SERVEUR INTERNET D'UN FOURNITURE D'ACCES. EN EFFET ON DOIT POUVOIR MODIFIER LES PARAMETRAGES SYSTEMES "PHP" DE LA DESCRIPTION CI DESSUS
Il peut être interressant quand on génère des sections d'une page à partir de variables de différer les sorties et placer tout le code généré dans une variable:
EXEMPLE :
<?php
$f = New Forms;
$f->frm_initbuffer();
$f->frm_Init($readonly,'200px');
$f->frm_InitConfirm();
$f->frm_Objet...$f->frm_Ouvrir(); // la sortie n'est pas effective
$buffer = $f->frm_flushbuffer();
?>
....
<h4><span class="titre1 style1">TOUS LES OBJETS DISPONIBLES </span>
<?phpprint "<h1>$action</h1>";
print "<hr>";// c'est ici que sortira tout le code lié au formulaire (rien avant)
print $buffer;?>
</h4>
A.1) Exemples de codes
sample01_palette.php Utilisation des skins sample02_protection.php Protection du clic droit sample03_masques.php Utilisation des masques de saisie d'in fichier texte sample04_dates.php Utilisation des formats date et timestamp dans un champ texte sample05_listes.php Différentes listes sample05_listes_editables.php Listes éditables sample06_memo_editeur.php Champs mémo et editeur de texte sample36_memo_editeur_onglet.php idem mais dans un onglet sample07_coche_radio.php Champ radio et coche, activation dynamique de champs sample07_coche_graphiques.php Champs checkbox modifiés sample08_onglets.php Utililisation des onglets pour simplifier les formulaires trop denses sample09_selecteur.php Sélecteur de fichier sample11_submit.php Gestion dynamique de la réentrance sur un champ sample12_champenerreur.php Gestion par programmation des champs en erreur sample13_sliders.php Emploi des Sliders pour choisir graphiquement des nombre entier dans un intervalle donné sample14_boutons.php Modification du libellé des boutons standards sample15_consultation.php Gestion du mode consultation d'un formulaire sample15_readonly.php Gestion du mode lecture seule de certains champ d'un formulaire sample16_attributs.php Attributs de saisie des champs textes (U,I, L, M) sample17_sautlignes.php Affichage de saut de ligne entre les champs
Catalogue de tous les objets à afficher sample19_popup.php Champ Popup appelant une autre page dans une fenêtre popup placée automatiquement sous le champ sample20_separateurs.php Champ Entete de séparation de paragraphe, permet comme avec les onglets de gérer un nombre important de champs sample21_separateurs_onglets idem mais avec des onglets à gérer pour un nombre très important de champs sample22_arbres.php Gestion d'arbres sample23_icones.php Selecteur d'icones (s'appuie sur le mécanisme des champs POPUP) sample24_icones.php Selecteur d'icones dans un onglet sample25_confirm.php Confirmation d'un ajout ou d'une modification par boite de dialogue sample26_upload.php La gestion des Uploads sample27_scroller.php
sample27_scroller2.php
sample28_scroller_coche_radio.phpAffichage d'une zone de scroll pour que les boutons valider/annuler restent immobiles
2 modes possibles "automatique ou manuel"sample29_timer la gestion du champ heure dynamique sample30_javascript Exécuter un javascript a chaque sortie de champ pour réaliser un calcul par exemple. sample31_colorpicker Sélecteur de couleur de fond ou de texte(utilise les fonctions popups pour charger le sélecteur) sample34_taillepolice.php Taille par défaut de la police de caractère sample35_bufferedoutput.php Bufferisation des sorties sample37_sortselect.php Liste à trier sample38_sortselect_separator.php Liste à trier avec séparateurs à insérer
A.2) Utilisation des palettes pré-définies