Lier plusieurs documents à un document (ex : Société / Sites)

But de ce document

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é.

Famille « Société »

  • Identificateur : SOCIETY (124)
  • Méthodes : Method.DocSociety.php Method.FAddBookSociety.php

Attributs de la famille « 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_idsitessi_t_sitesid sitesdocid3020H
si_sitessi_t_sitessitetext3030R

Famille « Site »

  • Identificateur : SITE (126)
  • Method.DocSite.php

Method.DocSociety.php

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();
}

Ajouter un menu « Nouveau site »

idattr label T type vis link
society_menuNouveau siteNmenuW%S%app=GENERIC&action=GENERIC_EDIT&classid=SITE&si_society=%si_society%&si_idsoc=%id%

Ce lien utilise :

  • L'action GENERIC / GENERIC_EDIT
  • classid=SITE : Indique que l'on veux créer un document de la famille « SITE (126) »
  • si_society=%si_society : Permet de pré-remplir le nom de la société
  • si_idsoc=%id% : Permet de pré-remplir l'ID de la société
contribution/cookbook/multi_liens.txt · Dernière modification: 28/01/2009 11:20 (édition externe)