Expliquer comment mettre en place un lien vers plusieurs documents d'une même famille dans une autre famille. Dans Freedom, il existe un exemple avec les sociétés et les sites. Si une société contient plusieurs sites, des liens vers ceux-ci apparaîtrons dans le document société.
Si nous regardons, les attributs de la famille « Société », nous voyons qu'elle contient un tableau visible uniquement en lecture seule (R). C'est ce tableau qui contiendra la liste des sites :
| si_t_sites | si_fr_sites | les sites | array | 3010 | R |
|---|---|---|---|---|---|
| si_idsites | si_t_sites | id sites | docid | 3020 | H |
| si_sites | si_t_sites | site | text | 3030 | R |
Si nous regardons le contenu du fichier « Method » associé à la famille « Société », nous voyons qu'il contient une fonction « SpecRefresh » qui sera donc exécuté à chaque rafraîchissement du document :
function UpdateSite() { include_once("FDL/Lib.Dir.php"); // contracts():SI_IDCONTRATS,SI_CONTRATS if ($this->initid > 0) { $filter[]="si_idsoc = '".$this->initid."'"; $tsite = getChildDoc($this->dbaccess, 0,0,"ALL", $filter,1,"TABLE","SITE"); $idc=array(); $tc=array(); foreach ($tsite as $k=>$v) { $idc[] = $v["id"]; $tc[] = $v["title"]; } $this->setValue("SI_IDSITES",$idc); $this->setValue("SI_SITES",$tc); } } function SpecRefresh() { $this->UpdateSite(); }
Sans rentrer dans le détail, cette fonction recherche dans la table des sites, tous les enregistrements dont le champ « si_idsoc » contient l'ID de la société. Le résultat de la requête est envoyé dans les attributs « SI_IDSITES » et « SI_SITES » de la famille « Société ».
Si vos documents liés suivent des cycles de vies ou des révisions, il est préférable d'utiliser la classe 'DocRel' pour rechercher les relations inter-documentaires. Cette classe permet de rechercher les relations pour les documents en dernière révision. On ne peut pas utiliser cette classe pour recherche des relations antérieures, c'est à dire quels sont les relations entre le doc A - révision 3 et le doc B - révision 43.
function UpdateSite2() { include_once("FDL/Class.DocRel.php"); if ($this->initid > 0) { $rel=new docRel($this->dbaccess); $rel->sinitid=$this->initid; // défini la source $trel=$rel->getIRelations(); // recherche des documents lié à la source $idc=array(); $tc=array(); foreach ($trel as $k=>$v) { if ($v["type"]=="si_idsoc") { // filtre sur cette relation (attribut du document cible) $idc[] = $v["sinitid"]; $tc[] = $v["stitle"]; } } $this->setValue("SI_IDSITES",$idc); $this->setValue("SI_SITES",$tc); } } function SpecRefresh() { $this->UpdateSite2(); }
| idattr | label | T | type | vis | link |
|---|---|---|---|---|---|
| society_menu | Nouveau site | N | menu | W | %S%app=GENERIC&action=GENERIC_EDIT&classid=SITE&si_society=%si_society%&si_idsoc=%id% |
Ce lien utilise :