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