17.8.1 Recherche de documents

17.8.1.1 Recherche de documents issus d'une même famille

La recherche de documents en fonction d'une famille est réalisée avec la classe SearchDoc.

Exemple basique : recherche de tous les utilisateurs (document de la famille IUSER)

$s=new SearchDoc(getDbAccess(), \Dcp\Family\Iuser::familyName);
$results=$s->search();
print_r($results);

Le retour par défaut est sous la forme de tableau indexé par les noms des propriétés et des attributs du document.

Exemple de retour :

Array
(
    [0] => Array
        (
            [id] => 1009
            [owner] => 1
            [title] => anonymous guest
            ....les attributs de la famille IUSER
            [us_lname] => anonymous
            [us_fname] => guest
            [us_mail] => 
            [us_extmail] => 
            [us_meid] => 1009
            [us_login] => anonymous
            ...
            )
    [1] => Array
        (
            [id] => 5835
            [owner] => 1
            [title] => Dogue Robert
            ...

L'utilisation de ce type de retour peut être utilisé avec les templates. Dans le cadre d'une recherche de document pour réaliser un retour sur une interface, la classe formatCollection permet de récupérer de manière optimisée les données affichables des documents recherchés.

17.8.1.2 Récupération du résultat de la recherche

Par défaut les résultats suivants sont exclus :

  • les documents supprimés (doctype = 'Z'),
  • les documents figés (locked = -1),
  • les documents temporaires (doctype='T'),
  • les documents archivés (archiveid is null),
  • les documents non visibles par l'utilisateur courant (droit view).

17.8.1.2.1 Retour de documents bruts

Si la méthode ::setObjectReturn() n'est pas utilisée ou utilisée avec l'argument false la méthode SearchDoc::search() retourne un tableau à 2 dimensions. Le tableau de deuxième niveau contient les valeurs brutes des propriétés et des attributs du document indexé par leur nom.

Avec une boucle foreach.

$s=new SearchDoc("","IUSER");
$rawDocuments=$s->search();
foreach ($rawDocuments as $k=>$rawDoc) {
  print "$k)".$rawDoc["title"]."(".getv($rawDoc,"us_mail","nomail").")\n";
 }

Avec une boucle while en utilisant la méthode SearchDoc::nextDoc() :

$s=new SearchDoc("","IUSER");
$s->search();
$k=0;
while ($rawDoc=$s->nextDoc()) { 
  print "$k)".$rawDoc["title"]."(".getv($rawDoc,"us_mail","nomail").")\n";
  $k++;  
}

Note : La fonction getv retourne la valeur d'un élément du document brut. Cette fonction permet aussi d'extraire des valeurs pour des attributs spécifiques aux sous-familles si la recherche comporte de tels documents.

17.8.1.2.2 Retour d'objets documentaires

Ce programme permet d'écrire tous les titres des documents accessibles de la famille "utilisateur". Ici, on n'a utilisé que le critère d'appartenance à une famille. L'appel à la méthode DocSearch::setObjectReturn() indique que la méthode DocSearch::Search() doit retourner des objets documentaires (attention, pour des raisons évidentes de performance, ce retour n'est pas un tableau).

Dans ce cas, il est possible d'appliquer les méthodes des objets sur les retours (exemple Doc::getRawValue).

$s=new SearchDoc('',"IUSER");
$s->setObjectReturn(); // retour d'objets documentaires
$s->addFilter('us_extmail is not null'); 
$s->search(); // déclenchement de la recherche
 
$c=$s->count();
print "count $c\n";
$k=0;
while ($doc=$s->nextDoc()) {
  print "$k)".$doc->getTitle()."(".$doc->getRawValue("US_MAIL","nomail").")\n";
  $k++; 
}

17.8.1.2.3 Utilisation des itérateurs

Pour récupérer la liste des documents, il est aussi possible d'utiliser un itérateur PHP afin de parcourir la liste des documents.

$s=new SearchDoc("","IUSER");
$s->setObjectReturn(); // retour d'objets documentaires
$s->addFilter('us_extmail is not null'); // retour d'objets documentaires
$s->search(); // déclenchement de la recherche
$dl=$s->getDocumentList();
 
foreach ($dl as $docid=>$doc) {
  print "$docid)".$doc->getTitle()."(".$doc->getRawValue("us_mail","nomail").")\n";
}

La méthode ::getDocumentList() retourne un objet DocumentList qui implémente l'interface Iterator. Il est ainsi possible d'utiliser le résultat dans une boucle classique "foreach".

×