Les fonctions d'aide à la saisie permettent de compléter ou de remplir des zones de saisie lors de l'édition des documents Dynacase.
Il est souhaitable de lire le manuel de programmation avant d'essayer de comprendre les exemples suivants.
Pour vous éviter de saisir les attributs de la famille, vous pouvez importer cette famille dans Dynacase en suivant ces instructions :
/usr/share/what/wsh.php --api=freedom_import --file=/tmp/test.ods
Pour plus d'informations sur les commande précédente, vous pouvez consulter cette page.
But: Offrir à l'utilisateur la possibilité de choisir un mois de l'année.
définition de l'attribut tst_month
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_MONTH | TST_FR_HELP1 | mois | N | N | text | 30 | W | test.php | TwelvesMonth():TST_MONTH |
La fonction TwelvesMonth doit se trouver dans le fichier test.php dans le répertoire EXTERNALS du répertoire de publication.
function TwelvesMonth() { $t=array(); for ($i=1;$i<13;$i++) { $month=strftime("%B", mktime (0, 0, 0, $i, 1, 98)); $t[]=array($month,$i); } return $t; }
Variante: Offrir à l'utilisateur la possibilité de choisir les mois de l'année depuis la date courante jusqu'à décembre
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc | elink | constraint | options |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_MONTH2 | TST_FR_HELP1 | dernier mois | N | N | text | 30 | W | test.php | LastMonth():TST_MONTH2 |
function LastMonth() { $t=array(); $currentMonth=date("n"); for ($i=$currentMonth;$i<13;$i++) { $month=strftime("%B", mktime (0, 0, 0, $i, 1, 98)); $t[]=array($month,$i); } return $t; }
Variante: Avec le format liste de choix hlist
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc | elink | constraint | options |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_MONTH3 | TST_FR_HELP1 | liste mois | N | N | text | 30 | W | test.php | [hlist]LastMonth():TST_MONTH3 |
Il ne faut pas confondre ceci avec une liste énumérée. Bien qu'en apparence l'aspect IHM semble identique, l'aide à la saisie ne sert pas à catégoriser des attributs.
But: Offrir à l'utilisateur la possibilité de choisir un mois de l'année suivant la saison précédemment sélectionnée
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc | options |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_SEASON | TST_FR_AIDE2 | saison | N | N | enum | 11 | W | spring¦printemps,summer¦ été,automn¦automne,winter¦hiver | system=yes | |||
| ATTR | TST_MONTH4 | TST_FR_AIDE2 | mois saisonnier | N | N | text | 30 | W | test.php | SeasonMonth(TST_SEASON) :TST_MONTH4 |
Dans cet exemple, la valeur saisie dans l'attribut tst_season sert d'argument à la fonction SeasonMonth. Il faut bien noter que c'est la valeur de l'énuméré (sa clef) qui est envoyée comme paramètre et nom son libellé.
function SeasonMonth($season) { $t=array(); $fm=-1; // first month switch ($season) { case 'spring': $fm=3; break; case 'summer': $fm=6; break; case 'automn': $fm=9; break; case 'winter': $fm=12; break; } if ($fm > 0) { for ($i=$fm;$i<$fm+4;$i++) { $month=strftime("%B", mktime (0, 0, 0, $i, 1, 98)); $t[]=array($month,$i); } } return $t; }
Variante: Offrir à l'utilisateur la possibilité de choisir un mois de l'année suivant les saisons précédemment sélectionnées
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc | elink | constraint | options |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_SEASONS | TST_FR_AIDE3 | saison | N | N | enumlist | 11 | W | [hcheck]spring¦printemps,summer¦ été,automn¦automne,winter¦hiver | system=yes | |||||
| ATTR | TST_MONTH5 | TST_FR_AIDE3 | mois saisonnier | N | N | text | 30 | W | test.php | SeasonsMonth(TST_SEASONS):TST_MONTH5 |
La valeur retournée pas tst_seasons est de type tableau array.
function SeasonsMonth($seasons) { $t=array(); foreach ($seasons as $season) { $st=SeasonMonth($season); foreach ($st as $month) { $t[$month[0]]=$month; // to avoid duplicate month } } return $t; }
But: Lier un document au document courant
Cet exercice reprend de manière détaillée ce qui est fait de manière automatique avec l'attribut docid("USER") (version 2.11).
La relation d'un document à un autre se fait par un attribut de type docid. Cet attribut contient l'identificateur du document qui permet (entre autre) de construire le lien qui servira à aller vers ce document.
Freedom pour connaître les relations n'a besoins que de cet attribut. Par contre, pour construire l'interface de saisie et pour construire le lien (hyperlien) qui servira au navigateur pour aller sur ce document lié, il est nécessaire de déclarer un autre attribut : le titre du lien.
Exemple :
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_IDPERSON | TST_FR_AIDE4 | Id personne | N | N | docid | 31 | H | ::getTitle(TST_IDPERSON):TST_PERSON | |||
| ATTR | TST_PERSON | TST_FR_AIDE4 | Personne | N | N | text | 32 | W | %S%app=FDL&action=FDL_CARD &id=%TST_IDPERSON% | fdl.php | lfamily(D,USER,TST_PERSON): TST_IDPERSON,TST_PERSON |
L'attribut tst_idperson a trois fonctions:
La première fonction est remplie par le type docid. La visibilité H indique que l'attribut est caché à l'utilisateur. Sa valeur est présenté à l'utilisateur grâce au lien %S%app=FDL&action=FDL_CARD&id=%TST_IDPERSON%. Les deux autres fonctions sont remplies par la déclaration de la méthode de calcul ::getTitle . En effet, cette déclaration a l'avantage d'indiquer que le titre tst_person doit être recalculé à partir de l'identifiant tst_idperson et aussi de montrer à l'utilisateur que le lien est bien défini lors de l'édition : passage en grisé du champ de saisie de l'attribut tst_person. Car une fois choisi une personne via l'aide à la saisie, l'attribut tst_idperson est renseigné. Si l'attribut est renseigné cela indique que l'attribut tst_person devient non éditable car la méthode ::getTitle(TST_IDPERSON):TST_PERSON porte sur ce dernier.
L'attribut tst_person a 3 fonctions :
La fonction lfamily permet de rechercher un document en filtrant sur son titre. L'attribut tst-person rempli cette fonction (3ème argument). Cette aide retourne deux arguments : l'identificateur du document et le titre du document. L'identificateur sera placé dans l'attribut tst_idperson et le titre dans tst_person.
L'hyperlien sera construit grâce à l'URL défini.
But: Récupérer plusieurs informations à la fois Dans cet exercice, nous allons réutiliser l'identificateur de la personne sélectionner par la précédente saisie. À partir de l'identifiant de la personne, nous pouvons préremplir ces coordonnées.
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_TOWN | TST_FR_AIDE5 | Ville | N | N | text | 41 | W | test.php | coordinate(D,TST_IDPERSON):TST_TOWN, TST_PERSONAME,TST_ADDRESS | ||
| ATTR | TST_PERSONAME | TST_FR_AIDE5 | Dénomination | N | N | text | 42 | W | ||||
| ATTR | TST_ADDRESS | TST_FR_AIDE5 | Adresse postale | N | N | longtext | 43 | W |
function coordinate($dbaccess,$idpersonn) { $t=array(); $p=new_doc($dbaccess,$idpersonn); if ($p->isAlive()) { $town=$p->getValue("us_worktown"); $name=sprintf("%s %s %s", $p->getValue("us_civility"), $p->getValue("us_fname"), $p->getValue("us_lname")); $coord=sprintf("%s\n%s %s %s\n%s", $p->getValue("us_workaddr"), $p->getValue("us_workpostalcode"), $p->getValue("us_worktown"), $p->getValue("us_workcedex"), $p->getValue("us_country")); $t[]=array($name,$town,$name,$coord); } else { $t="personne inconnue - Veillez sélectionner une personne d'abord"; } return $t; }
On peut noter dans cet exemple l'erreur retournée en cas de non présence de personne.
Variante: Rechercher les coordonnées en fonction de la ville Cette variante recherche toutes les personnes qui habite dans la ville saisie
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_TOWN | TST_FR_AIDE5 | Ville | N | N | text | 41 | W | test.php | coordtown(D,TST_TOWN) :TST_TOWN, TST_PERSONAME,TST_ADDRESS | ||
| ATTR | TST_PERSONAME | TST_FR_AIDE5 | Dénomination | N | N | text | 42 | W | ||||
| ATTR | TST_ADDRESS | TST_FR_AIDE5 | Adresse postale | N | N | longtext | 43 | W |
function coordtown($dbaccess,$town) { include_once("FDL/Lib.Dir.php"); $t=array(); $filters[]="us_worktown ~* '".pg_escape_string($town)."'";// filtre sur l'appartenance à la ville $tdoc =getChildDoc($dbaccess, 0, // dans toute la base "0","100", // les 100 premiers $filters, // filtres getUserId(), // utilisateur courant "TABLE",// retourne liste de structure de document "USER"); // parmis les personnes $tret=array(); foreach($tdoc as $k=>$v) { $town=getv($v,"us_worktown"); $name=sprintf("%s %s %s", getv($v,"us_civility"), getv($v,"us_fname"), getv($v,"us_lname")); $coord=sprintf("%s\n%s %s %s\n%s", getv($v,"us_workaddr"), getv($v,"us_workpostalcode"), getv($v,"us_worktown"), getv($v,"us_workcedex"), getv($v,"us_country")); $t[]=array($v["title"]. "- $town",$town,$name,$coord); } return $t; }
Faire attention au filtre de la sélection. Il faut quoter les chaînes de caractères pour éviter les failles de sécurités.
But: Récupérer plusieurs informations à la fois et les affecter à une rangée de tableau
| code | idattr | idframe | label | T | A | type | ord | vis | need | link | phpfile | phpfunc | options |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATTR | TST_FR_AIDE7 | Tableaux | N | N | frame | 220 | |||||||
| ATTR | TST_T_TABLE | TST_FR_AIDE7 | Les employés mensualisés | N | N | array | 230 | ||||||
| ATTR | TST_MONTH6 | TST_T_TABLE | mois de la saison | N | N | text | 240 | W | test.php | SeasonsMonth(TST_SEASONS) :TST_MONTH6 | |||
| ATTR | TST_IDSOCIETY | TST_T_TABLE | Id société | N | N | docid | 250 | H | ::getTitle(TST_IDSOCIETY) :TST_SOCIETY | ||||
| ATTR | TST_SOCIETY | TST_T_TABLE | société | N | N | text | 260 | W | %S%app=FDL&action=FDL_CARD &id=%TST_IDSOCIETY% | fdl.php | lfamily(D,SOCIETY,TST_SOCIETY): TST_IDSOCIETY,TST_SOCIETY | ititle=recherche de la société | |
| ATTR | TST_IDEMPLOYE | TST_T_TABLE | Id employé | N | N | docid | 270 | H | ::getTitle(TST_IDEMPLOYE) :TST_EMPLOYE | ||||
| ATTR | TST_EMPLOYE | TST_T_TABLE | employé | N | N | text | 280 | W | %S%app=FDL&action= FDL_CARD &id=%TST_IDEMPLOYE% | test.php | employe(D,TST_IDSOCIETY): TST_IDEMPLOYE,TST_EMPLOYE | ititle=rechercher les employés de la société |
function employe($dbaccess,$socid,$name="") { include_once("FDL/Lib.Dir.php"); $filters[]="us_idsociety='$socid'";//// filtre sur l'appartenance à la société/// if ($name != "") $filters[]="title ~* '".pg_escape_string($name)."'";// filtre sur le titre// $tdoc =getChildDoc($dbaccess, 0, // dans toute la base// "0","100", // les 100 premiers// $filters, // filtres// getUserId(), //// utilisateur courant// "TABLE",// retourne liste de structure de document// "USER"); // parmis les personnes// $tret=array(); foreach($tdoc as $k=>$v) { $tret[]=array($v["title"],$v["id"],$v["title"]); } return $tret; }
La première aide à la saisie, pour le mois, utilise un paramètre multivalué TST_SEASONS hors du tableau. Les deux autres aides à la saisie utilisent les valeurs saisies dans la rangée courante. Les valeurs des paramètres ne sont pas alors de type tableau comme pour l'aide sur le mois.
Les paramètres multivalués (type enumlist) ne sont pas autorisés dans les tableaux.