17.8.2 Recherche détaillée

17.8.2.1 Enregistrement d'une recherche détaillée

17.8.2.1.1 Création d'une recherche par famille

La recherche détaillée (famille DSEARCH) a pour but de rechercher des documents d'une famille donnée. Elle permet d'être utilisée depuis l'interface graphique ou depuis la classe SearchDoc pour avoir une liste de document suivant des critères pré- établis.

/**
 * @var \Dcp\Family\Dsearch $rd
 */
$rd= createDoc("", \Dcp\Family\Dsearch::familyName);
$rd->setValue(\Dcp\AttributeIdentifiers\Dsearch::se_famid, \Dcp\Family\Iuser::familyName);
$rd->store();
 
// Récupération du contenu
$content=$rd->getContent();
foreach ($content as $rawDocument) {
    printf("Document %s (%d)\n", $rawDocument["title"], $rawDocument["id"]);
}

De façon similaire, la classe SearchDoc peut utiliser une recherche détaillée.

/**
 * @var \Dcp\Family\Dsearch $rd
 */
$rd= createDoc("", \Dcp\Family\Dsearch::familyName);
$rd->setValue(\Dcp\AttributeIdentifiers\Dsearch::se_famid, \Dcp\Family\Iuser::familyName);
$rd->store();
 
$s=new SearchDoc();
$s->useCollection($rd->initid); // utilisation de la recherche stockée
$s->setObjectReturn(true);
$dl=$s->search()->getDocumentList();
 
// Récupération du contenu
foreach ($dl as $docid => $doc) {
    printf("Document %s (%d)\n", $doc->getTitle(), $docid);
}

L'affectation des critères est effectuée en valorisant les attributs du tableau se_t_detail de la famille DSEARCH.

use \Dcp\AttributeIdentifiers as Attribute;
/**
 * @var \Dcp\Family\Dsearch $rd
 */
$rd= createDoc("", \Dcp\Family\Dsearch::familyName);
$rd->setAttributeValue(Attribute\Dsearch::se_famid, \Dcp\Family\Iuser::familyName);
$rd->setAttributeValue(Attribute\Dsearch::ba_title, "Search Active Users with email");
$criteria=array(
    array(Attribute\Dsearch::se_attrids => Attribute\Iuser::us_status,
          Attribute\Dsearch::se_funcs   => "=",
          Attribute\Dsearch::se_keys    =>"A"),
    array(Attribute\Dsearch::se_attrids => Attribute\Iuser::us_extmail,
          Attribute\Dsearch::se_funcs   => "is not null",
          Attribute\Dsearch::se_keys    => "")
);
 
$rd->setAttributeValue(Attribute\Dsearch::se_t_detail, $criteria);
$rd->store();

17.8.2.1.2 Enregistrement d'une recherche détaillée avec SearchDoc

La recherche détaillée peut aussi être enregistrée avec une requête arbitraire. La méthode DocSearch::addStaticQuery() permet de modifier la requête issue des critères du document recherche.

$s=new SearchDoc("", \Dcp\Family\Iuser::familyName);
$s->addFilter('us_extmail is not null');
$sql=$s->getOriginalQuery();
 
/**
 * @var \Dcp\Family\Dsearch $rd
 */
$rd= createDoc("", \Dcp\Family\Dsearch::familyName);
$rd->setValue(\Dcp\AttributeIdentifiers\Dsearch::ba_title, "my Search");
$rd->store();
// on remplace la requête qui sera utilisée par celle produite par SearchDoc
$rd->addStaticQuery($sql);

Dans ce cas, le document produit s'il est modifié par l'interface perd ses caractéristiques spécifiques au dépend des nouveaux critères présents sur l'interface graphique.

La méthode DocSearch::addStaticQuery() ne peut être utilisée que si le document est déjà enregistré en base de données.

La requête sql enregistrée ne doit pas tenir compte des droits. Ces critères de droits sont ajoutés lors de l'utilisation de la recherche détaillée.

17.8.2.2 Utilisation de méthodes dans l'interface de recherche détaillée

Lors de la création d'une recherche détaillée, il est possible de choisir pour un critère une méthode comme valeur.

Exemple : ma_date > ::getDate(-7)

Cet exemple indique que le critère sera la date courante - 7 jours. La méthode doc::getDate() est une méthode statique de la classe doc.

Les méthodes utilisables dans les recherches détaillées sont les méthodes de la classe de la famille sur laquelle porte la recherche qui ont un commentaire (au format DocBlock et qui contiennent les tags @searchLabel et @searchType. Vous pouvez ainsi déclarer votre propre méthode, utilisable comme critère de recherche, dans le fichier méthode de votre famille et ajouter les commentaires DocBlock adéquats. Cette méthode est généralement statique car elle ne doit pas faire appel à des valeurs de document. Par contre vous pouvez bien entendu utiliser des paramètres de la famille. La valeur de retour de cette méthode sera utilisé comme valeur du critère. Cela ne peut être appliqué que sur des opérateurs nécessitant une seule valeur. Cette méthode spécifique sera utilisable pour des recherches détaillées portant sur la famille en question.

Exemple de déclaration de méthode :

/**
 * Get a random integer between 1 and 10
 * 
 * @searchLabel Random integer between 1 and 10
 * @searchType int
 * @searchType double
 * @searchType money
 */
public function getRandomNumber() {
    return mt_rand(1, 10);
}

Le tag @searchLabel permet de spécifier le libellé qui sera présenté lors de l'affichage de la liste des méthodes compatibles. Ce libellé sera traduit via le mécanisme de localisation.

Le tag @searchType permet de spécifier les types d'attributs sur lesquels cette méthode est utilisable. L'interface de composition des critères de la recherche détaillée ne présentera alors que les méthodes compatibles avec l'attribut du critère.

Pour des besoins plus complexes de sélection des méthodes compatibles, vous pouvez surcharger la méthode Doc::getSearchMethods() pour enlever ou ajouter des méthodes à la liste générée par défaut. Les méthodes que vous ajoutez devront aussi avoir les tags @searchLabel et @searchType positionnée.

Exemple de surcharge de Doc::getSearchMethods :

public function getSearchMethods($attrId, $attrType) {
    $methods = parent::getSearchMethods($attrId, $attrType);
    if ($attrType == 'date' || $attrType == 'timestamp') {
        /*
         * Ajouter avant-hier et après-demain
         * pour les attributs de type 'date' et 'timestamp'
         */
        $methods = array_merge(
            $methods,
            array(
                array(
                    'label' => _("Day before yesterday"),
                    'method' => '::getDate(-2)'
                ),
                array(
                    'label' => _("Day after tomorrow"),
                    'method' => '::getDate(2)'
                )
            )
        );
    }
    return $methods
}
×