Aides à la saisie

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.

Mise en place des fichiers de test

Pour vous éviter de saisir les attributs de la famille, vous pouvez importer cette famille dans Dynacase en suivant ces instructions :

  • Téléchargez dans le dossier /tmp la définition de la famille au format .ods en cliquant ici (test.ods)
  • Cette commande permet d'importer dans Dynacase la famille :
/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.

  • Ensuite, il faut télécharger ce fichier test.php et le placer dans le dossier “/usr/share/what/EXTERNALS/

Listes des mois de l'année

But: Offrir à l'utilisateur la possibilité de choisir un mois de l'année.

définition de l'attribut tst_month

code idattr idframe labelTAtypeordvisneedlinkphpfilephpfunc
ATTR TST_MONTHTST_FR_HELP1moisNNtext30W test.phpTwelvesMonth():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 à partir de la date courante

Variante: Offrir à l'utilisateur la possibilité de choisir les mois de l'année depuis la date courante jusqu'à décembre

code idattr idframe labelTAtypeordvisneedlinkphpfilephpfuncelinkconstraintoptions
ATTR TST_MONTH2TST_FR_HELP1dernier moisNNtext30W test.phpLastMonth():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 une liste de choix

Variante: Avec le format liste de choix hlist

code idattr idframe labelTAtypeordvisneedlinkphpfilephpfuncelinkconstraintoptions
ATTR TST_MONTH3TST_FR_HELP1liste moisNNtext30W 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.

Listes des mois de l'année suivant la saison

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 labelTAtypeordvisneedlinkphpfilephpfuncoptions
ATTRTST_SEASONTST_FR_AIDE2saisonNNenum11W spring¦printemps,summer¦ été,automn¦automne,winter¦hiver system=yes
ATTR TST_MONTH4TST_FR_AIDE2mois saisonnierNNtext30W test.phpSeasonMonth(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 : Listes des mois de l'année suivant la saison sélectionnée

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 labelTAtypeordvisneedlinkphpfilephpfuncelinkconstraintoptions
ATTRTST_SEASONSTST_FR_AIDE3saisonNNenumlist11W [hcheck]spring¦printemps,summer¦ été,automn¦automne,winter¦hiver system=yes
ATTR TST_MONTH5TST_FR_AIDE3mois saisonnierNNtext30W test.phpSeasonsMonth(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;
}

Rechercher un document suivant son titre

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 labelTAtypeordvisneedlinkphpfilephpfunc
ATTRTST_IDPERSONTST_FR_AIDE4Id personneNNdocid31H ::getTitle(TST_IDPERSON):TST_PERSON
ATTRTST_PERSONTST_FR_AIDE4PersonneNNtext32W %S%app=FDL&action=FDL_CARD &id=%TST_IDPERSON%fdl.phplfamily(D,USER,TST_PERSON): TST_IDPERSON,TST_PERSON

L'attribut tst_idperson a trois fonctions:

  1. stocker la valeur de l'identifiant du document à lier
  2. indiquer à l'utilisateur la validité du lien
  3. mettre à jour le titre (si besoin)

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 :

  1. d'avoir un champ de saisie pour filtrer la recherche
  2. de ce servir de ce champ pour récupérer le résultat de la recherche
  3. de construire le lien présenté à l'utilisateur lors de la consultation du document

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.

relation entre document

Rechercher les coordonnées d'une personne suivant son nom

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 labelTAtypeordvisneedlinkphpfilephpfunc
ATTRTST_TOWNTST_FR_AIDE5VilleNNtext41W test.phpcoordinate(D,TST_IDPERSON):TST_TOWN, TST_PERSONAME,TST_ADDRESS
ATTRTST_PERSONAMETST_FR_AIDE5DénominationNNtext42W
ATTRTST_ADDRESSTST_FR_AIDE5Adresse postaleNNlongtext43W
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&eacute;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

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 labelTAtypeordvisneedlinkphpfilephpfunc
ATTRTST_TOWNTST_FR_AIDE5VilleNNtext41W test.phpcoordtown(D,TST_TOWN) :TST_TOWN, TST_PERSONAME,TST_ADDRESS
ATTRTST_PERSONAMETST_FR_AIDE5DénominationNNtext42W
ATTRTST_ADDRESSTST_FR_AIDE5Adresse postaleNNlongtext43W
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.

Compléter des rangées de tableaux

But: Récupérer plusieurs informations à la fois et les affecter à une rangée de tableau

code idattr idframe labelTAtypeordvisneedlinkphpfilephpfuncoptions
ATTRTST_FR_AIDE7 TableauxNNframe220
ATTRTST_T_TABLETST_FR_AIDE7Les employés mensualisésNNarray230
ATTRTST_MONTH6TST_T_TABLEmois de la saisonNNtext240W test.phpSeasonsMonth(TST_SEASONS) :TST_MONTH6
ATTRTST_IDSOCIETYTST_T_TABLEId sociétéNNdocid250H ::getTitle(TST_IDSOCIETY) :TST_SOCIETY
ATTRTST_SOCIETYTST_T_TABLEsociétéNNtext260W %S%app=FDL&action=FDL_CARD &id=%TST_IDSOCIETY%fdl.phplfamily(D,SOCIETY,TST_SOCIETY): TST_IDSOCIETY,TST_SOCIETY ititle=recherche de la société
ATTRTST_IDEMPLOYETST_T_TABLEId employéNNdocid270H ::getTitle(TST_IDEMPLOYE) :TST_EMPLOYE
ATTRTST_EMPLOYETST_T_TABLEemployéNNtext280W %S%app=FDL&action= FDL_CARD &id=%TST_IDEMPLOYE%test.phpemploye(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.

:cookbook:attributes:inputhelp8.png

contribution/cookbook/attributes/inputhelp.txt · Dernière modification: 28/09/2010 12:03 (édition externe)