source: spip-zone/_plugins_/indexer/trunk/indexer_pipelines.php @ 82681

Last change on this file since 82681 was 82681, checked in by rastapopoulos@…, 7 years ago

Tout comme pour indexer_sources(), on déporte la récupération d'un indexeur valide dans une fonction indexer_indexer() utilisable plusieurs fois.

On s'insère dans le pipeline "post_edition", et dès qu'il y a une modif sur un objet, on cherche si on a une ou plusieurs de nos sources enregistrées qui correspondent à l'objet en cours d'édition.

Si c'est le cas, on appelle l'indexeur et on lui donne à remplacer (ou ajouter) le document issu de la source en question (ou des sources).

Sans rien toucher, le mécanisme teste avec l'alias donné à la source ("articles", "fiches", etc) MAIS si on veut un truc plus bizarre, ou surtout si on a plusieurs sources différentes travaillant sur le même type d'objet, alors la classe de source peut implémenter une méthode getObjet() qui doit retourner "patate" (par exemple).

Testé aussi sur un objet non-spip, pour l'instant ça marche.

Là on réindexe le doc directement dans le pipeline, et ça ne me parait pas lent. Si on trouve que ça gêne, on pourra déporter l'indexation dans un job. Mais pour l'instant ça m'a l'air d'aller.

File size: 1.8 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6/**
7 * Réindexer des choses lorsqu'il y a des modifications sur un objet
8 *
9 * @pipeline post_edition
10 * @param array $flux Arguments et contenu du pipeline "post_edition"
11 * @return Retourne le flux d'origine mais possiblement modifié
12 */
13function indexer_post_edition($flux){
14        include_spip('base/connect_sql'); // pour être sûr d'avoir objet_type()
15       
16        // On trouve le type de l'objet
17        if (isset($flux['args']['type'])){
18                $objet = $flux['args']['type'];
19        }
20        elseif (isset($flux['args']['table'])){
21                $objet = objet_type($flux['args']['table']);
22        }
23        // On trouve son identifiant
24        if (isset($flux['args']['id_objet'])){
25                $id_objet = $flux['args']['id_objet'];
26        }
27       
28        // Si on a ce qu'il faut, on continue
29        if ($objet and $id_objet){
30                include_spip('inc/indexer');
31               
32                // On récupère toutes les sources compatibles avec l'indexation
33                $sources = indexer_sources();
34               
35                // On parcourt toutes les sources et on garde celles on un rapport avec l'objet du pipeline
36                foreach ($sources as $alias => $source){
37                        // Si une méthode pour définir explicitement existe, on l'utilise
38                        if (method_exists($source, 'getObjet')){
39                                $objet_source = $source->getObjet();
40                        }
41                        // Sinon on cherche avec l'alias donné à la source
42                        else{
43                                $objet_source = objet_type(strtolower($alias));
44                        }
45                       
46                        // Si l'objet de la source est le même que dans l'édition, on met à jour l'indexation de l'objet
47                        if ($objet_source == $objet){
48                                // On va chercher l'indexeur du SPIP
49                                $indexer = indexer_indexer();
50                                // On va chercher l'unique document à indexer
51                                $document = $source->getDocuments($id_objet, $id_objet+1); // +1 car le test est normalement : id < $end
52                                // Et on le remplace (ou ajoute) dans l'indexation
53                                $indexer->replaceDocuments($document);
54                        }
55                }
56        }
57       
58        return $flux;
59}
Note: See TracBrowser for help on using the repository browser.