Changeset 82625 in spip-zone


Ignore:
Timestamp:
May 20, 2014, 6:02:05 PM (5 years ago)
Author:
marcimat@…
Message:

Autre proposition d'itérateur capilotracté, qui boucle par défaut sur les résultats directement, et nécessite, pour avoir les metas données d'utiliser des balises spécifiques #SPHINX_META, #SPHINX_QUERY, #SPHINX_FACETS. Ces balises ne fonctionnent qu'à l'intérieur de la boucle. On peut les faire fonctionner dans les parties 'avant' et 'après' en utilsiant, dans la boucle #SPHINX_SAVE_META. Pas moyen par contre de les utiliser dans la partie alternative (<B_...). Il reste à gérer la pagination qui ne fonctionne pas.

Location:
_plugins_/indexer/trunk
Files:
2 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/content/sphinx2.html

    r82621 r82625  
    11
    2 <h1>Test SPHINX</h1>
     2<h1>Test SPHINX 2</h1>
    33
    44[(#FORMULAIRE_RECHERCHE{#SELF})]
     
    3333
    3434
    35 <BOUCLE_recherche_sphinx(SPHINX)
     35
     36
     37<B_recherche_sphinx>
     38        <h1>Dans la boucle (SPHINX2)</h1>
     39
     40        <h2>Documents trouvés</h2>
     41
     42        [<pre>(#SPHINX_QUERY)</pre>]
     43
     44        <small>
     45        [(#SPHINX_META|table_valeur{total}|=={1000}|?{'+ de '}) ][(#SPHINX_META|table_valeur{total}) ]résultats
     46                ([(#SPHINX_META|table_valeur{time}|mult{1000})] ms)
     47        </small>
     48
     49        <div class='liste long resultats'>
     50                [<div class="pagination">(#ENV{debut_recherche_sphinx}|?{#PAGINATION,#ANCRE_PAGINATION})</div>]
     51                <ul class='liste-items'>
     52
     53
     54<BOUCLE_recherche_sphinx(SPHINX2)
    3655        {index #ENV{source,spip}}
    3756        {recherche #ENV*{recherche}}
     
    4867        {facet tag,    properties.tags ORDER BY COUNT(*) DESC}
    4968        {facet annee, YEAR(date) ORDER BY date DESC}
     69
     70        {pagination 10}
    5071>
     72        [(#REM) The hack pour les # SPHINX_* des parties alternatives. ]
     73        #SPHINX_SAVE_META
    5174
    52         <h1>Dans la boucle (SPHINX)</h1>
    53         <pre>#QUERY</pre>
    54 
    55         [(#INCLURE{fond=liste/sphinx_documents,docs,meta,env})]
    56         [(#INCLURE{fond=liste/sphinx_facettes,facets,env})]
    57         [(#INCLURE{fond=liste/sphinx_metas,meta,env})]
     75        [(#SET{properties,#PROPERTIES|json_decode{1}})]
     76        <li class='item'>
     77                <article class='entry article hentry'>
     78                        <strong class='h3-like entry-title'>#SCORE/#ENV{max} = [(#SCORE|mult{100}|div{#ENV{max}}|intval)%] <a href="#URI">#TITLE</a></strong>
     79                        <p class="publication">
     80                                [<time pubdate="pubdate" datetime="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</time>][<span class="authors"><span class="sep">, </span> <:par_auteur:> (#GET{properties}|table_valeur{authors}|implode{', '})</span>]
     81                        </p>
     82                        [<div class="introduction entry-content">(#SNIPPET|sinon{#SUMMARY})</div>]
     83                </article>
     84        </li>
    5885
    5986</BOUCLE_recherche_sphinx>
     87                </ul>
     88        </div>
     89[<div class="pagination">(#PAGINATION)</div>]
    6090
    6191
     92[(#INCLURE{fond=liste/sphinx_facettes,facets=#SPHINX_FACETS,env})]
     93[(#INCLURE{fond=liste/sphinx_metas,meta=#SPHINX_META,env})]
     94
     95</B_recherche_sphinx>
     96        <h2>Pas de résultat pour :</h2>
     97        <pre>#SPHINX_QUERY</pre>
     98<//B_recherche_sphinx>
  • _plugins_/indexer/trunk/iterateur/sphinx2.php

    r82621 r82625  
    2121 *     Description de la boucle complétée des champs
    2222 */
    23 function iterateur_SPHINX_dist($b) {
    24         $b->iterateur = 'SPHINX'; # designe la classe d'iterateur
     23function iterateur_SPHINX2_dist($b) {
     24        $b->iterateur = 'SPHINX2'; # designe la classe d'iterateur
    2525        $b->show = array(
    2626                'field' => array(
    27                         'docs' => 'ARRAY',
    28                         'meta' => 'ARRAY',
    29                         'facets' => 'ARRAY',
    30                         'query' => 'STRING',
    31                         #'*' => 'ALL' // Champ joker *
     27                        '*' => 'ALL' // Champ joker *
    3228                )
    3329        );
     
    4137 * La boucle SPHINX n'a toujours qu'un seul élément.
    4238 */
    43 class IterateurSPHINX implements Iterator {
     39class IterateurSPHINX2 implements Iterator {
    4440
    4541        /**
     
    4743         * @var string
    4844         */
    49         protected $type = 'SPHINX';
     45        protected $type = 'SPHINX2';
    5046
    5147        /**
     
    7470
    7571        /**
    76          * Résultat de la requête à Sphinx
     72         * Résultats par la requête à Sphinx
    7773         * @var array
    7874         */
    7975        protected $result = array();
     76
     77        /**
     78         * Données de la requête (hors documents récupérés)
     79         *
     80         * ArrayObject pour avoir 1 seul objet non dupliqué
     81         *
     82         * @var ArrayObject
     83         */
     84        protected $data = null;
     85
    8086
    8187        /**
     
    148154                }
    149155
    150                 $this->result = $result;
     156                $this->result = $result['query'];
     157                unset($result['query']['docs']);
     158                $this->data = new ArrayObject($result['query']);
     159
    151160                return true;
    152161        }
     
    428437        }
    429438
     439
     440
     441        // pour #SPHINX_*, permet de récupérer tous les champs de metadata
     442        public function getMetaData() {
     443                return $this->data;
     444        }
     445
     446
    430447        /**
    431448         * Revenir au depart
     
    433450         */
    434451        public function rewind() {
    435                 reset($this->result);
    436                 list($this->cle, $this->valeur) = each($this->result);
     452                reset($this->result['docs']);
     453                list($this->cle, $this->valeur) = each($this->result['docs']);
    437454        }
    438455
     
    466483         */
    467484        public function next(){
    468                 if ($this->valid())
    469                         list($this->cle, $this->valeur) = each($this->result);
     485                if ($this->valid()) {
     486                        list($this->cle, $this->valeur) = each($this->result['docs']);
     487                        // on transmet, pour chaque ligne les metas données avec…
     488                        // histoire d'être certain qu'on les verra dans $Pile[$SP]
     489                        // (feinte de sioux)
     490                        if (is_array($this->valeur)) {
     491                                $this->valeur['_sphinx_data'] = $this->data;
     492                        }
     493                }
    470494        }
    471495
     
    476500        public function count() {
    477501                if (is_null($this->total))
    478                         $this->total = count($this->result);
     502                        $this->total = count($this->result['docs']);
    479503          return $this->total;
    480504        }
     
    489513 * @param object $crit
    490514 */
    491 function critere_SPHINX_index_dist($idb, &$boucles, $crit) {
     515function critere_SPHINX2_index_dist($idb, &$boucles, $crit) {
    492516        $boucle = &$boucles[$idb];
    493517        // critere unique
     
    505529 * @param object $crit
    506530 */
    507 function critere_SPHINX_recherche_dist($idb, &$boucles, $crit) {
     531function critere_SPHINX2_recherche_dist($idb, &$boucles, $crit) {
    508532        $boucle = &$boucles[$idb];
    509533        // critere unique
     
    523547 * @param object $crit
    524548 */
    525 function critere_SPHINX_select_dist($idb, &$boucles, $crit) {
     549function critere_SPHINX2_select_dist($idb, &$boucles, $crit) {
    526550        $boucle = &$boucles[$idb];
    527551        // critere multiple
     
    542566 * @param object $crit
    543567 */
    544 function critere_SPHINX_snippet_dist($idb, &$boucles, $crit) {
     568function critere_SPHINX2_snippet_dist($idb, &$boucles, $crit) {
    545569        $boucle = &$boucles[$idb];
    546570        // critere multiple
     
    564588 * @param object $crit
    565589 */
    566 function critere_SPHINX_facet_dist($idb, &$boucles, $crit) {
     590function critere_SPHINX2_facet_dist($idb, &$boucles, $crit) {
    567591        $boucle = &$boucles[$idb];
    568592        // critere multiple
     
    582606 * @param object $crit
    583607 */
    584 function critere_SPHINX_filter_dist($idb, &$boucles, $crit) {
     608function critere_SPHINX2_filter_dist($idb, &$boucles, $crit) {
    585609        $boucle = &$boucles[$idb];
    586610        // critere multiple
     
    603627 * @param object $crit
    604628 */
    605 function critere_SPHINX_par_dist($idb, &$boucles, $crit) {
    606         return critere_SPHINX_parinverse($idb, $boucles, $crit);
     629function critere_SPHINX2_par_dist($idb, &$boucles, $crit) {
     630        return critere_SPHINX2_parinverse($idb, $boucles, $crit);
    607631}
    608632
     
    614638 * @param object $crit
    615639 */
    616 function critere_SPHINX_inverse_dist($idb, &$boucles, $crit) {
     640function critere_SPHINX2_inverse_dist($idb, &$boucles, $crit) {
    617641        $boucle = &$boucles[$idb];
    618642        if ($crit->not) {
    619                 critere_SPHINX_parinverse($idb, $boucles, $crit);
     643                critere_SPHINX2_parinverse($idb, $boucles, $crit);
    620644        } else {
    621645                // sinon idem parent.
     
    637661 * @param object $crit
    638662**/
    639 function critere_SPHINX_parinverse($idb, $boucles, $crit, $sens = '') {
     663function critere_SPHINX2_parinverse($idb, $boucles, $crit, $sens = '') {
    640664        $boucle = &$boucles[$idb];
    641665        if ($crit->not) {
     
    662686}
    663687
    664 function critere_SPHINX_pages_dist($idb, &$boucles, $crit) {
     688function critere_SPHINX2_pages_dist($idb, &$boucles, $crit) {
    665689        $boucle = &$boucles[$idb];
    666690
     
    674698}
    675699
     700
     701/**
     702 * Récupère pour une balise `#SPHINX_QQC` la valeur de 'qqc'
     703 * dans les meta données associées à la requête
     704 *
     705 * - `#SPHINX_QUERY`
     706 * - `#SPHINX_META`
     707 * - `#SPHINX_FACETS`
     708 *
     709 * @param Champ $p
     710 * @return Champ
     711**/
     712function balise_SPHINX__dist($p){
     713        $champ = $p->nom_champ;
     714        if ($champ == 'SPHINX_') {
     715                $msg = _T('zbug_balise_sans_argument', array('balise' => ' SPHINX_'));
     716                erreur_squelette($msg, $p);
     717                $p->interdire_scripts = true;
     718                return $p;
     719        };
     720        $champ = substr($champ, 7);
     721        return calculer_balise_SPHINX_CHAMP($p, $champ);
     722}
     723
     724
     725
     726
     727/**
     728 * Récupère pour une balise `#SPHINX_QQC` la valeur de 'qqc'
     729 * dans les meta données associées à la requête.
     730 *
     731 * On les puise soit directement dans l'iterateur si on l'a (partie centrale de boucle),
     732 * soit dans une globale (conjointement à l'utilisation de `#SPHINX_SAVE_META`
     733 *
     734 * @param Champ $p
     735 * @param string $champ
     736 * @return Champ
     737**/
     738function calculer_balise_SPHINX_CHAMP($p, $champ) {
     739        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
     740        if ($b === '' || !isset($p->boucles[$b])) {
     741                $msg = array('zbug_champ_hors_boucle', array('champ' => '#SPHINX_' . $champ));
     742                erreur_squelette($msg, $p);
     743                $p->interdire_scripts = true;
     744                return $p;
     745        }
     746
     747        $champ = strtolower($champ);
     748        $p->code =
     749                // iterateur présent ?
     750                "(isset(\$Iter) ? "
     751                . "((\$d = \$Iter->getIterator()->getMetaData()) ? \$d['$champ'] : '') : "
     752                // sinon sauvegarde de #SPHINX_SAVE_META
     753                . "(isset(\$GLOBALS['SphinxSave']['$b']['$champ']) ? \$GLOBALS['SphinxSave']['$b']['$champ'] : '') )";
     754        $p->interdire_scripts = false;
     755        return $p;
     756}
     757
     758/**
     759 * Sauvegarde les meta données de requête Sphinx pour une
     760 * utilisation ultérieure dans les parties alternatives de la boucle…
     761 *
     762 * - `#SPHINX_SAVE_META`
     763 *
     764 * Permet l'usage dans 'avant' ou 'apres' des boucles Sphinx des
     765 * balises :
     766 *
     767 * - `#SPHINX_QUERY`
     768 * - `#SPHINX_META`
     769 * - `#SPHINX_FACETS`
     770 *
     771 * @param Champ $p
     772 * @return Champ
     773**/
     774function balise_SPHINX_SAVE_META_dist($p){
     775        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
     776        // doit être dans la partie centrale de la boucle
     777        if ($b === '' || !isset($p->boucles[$b])) {
     778                $msg = array('zbug_champ_hors_boucle', array('champ' => '#SPHINX_SAVE_META' ));
     779                erreur_squelette($msg, $p);
     780                $p->interdire_scripts = true;
     781                return $p;
     782        }
     783
     784        $p->code =
     785                  "(!isset(\$GLOBALS['SphinxSave']) ? vide(\$GLOBALS['SphinxSave'] = array()) : '') . "
     786                . "(!isset(\$GLOBALS['SphinxSave']['$b']) ? vide(\$GLOBALS['SphinxSave']['$b'] = \$iter->getInnerIterator()->getMetaData()) : '')"
     787                #. " . ('<pre>' . print_r( \$GLOBALS['SphinxSave'] , true) . '</pre>')"
     788                ;
     789        $p->interdire_scripts = false;
     790        return $p;
     791}
Note: See TracChangeset for help on using the changeset viewer.