Critère de correspondance pour la recherche SEBLOD

14882 vues
29 octobre 2014
Cyril
seblodbyoctopoosinline

 

Un des points essentiels abordés lors de la formation SEBLOD est sa capacité à construire une multitude de type de recherche...

La recherche qui est à mon sens le plus utile et bien pensée est le plugin de champ 'search_generic' qui permet de rechercher dans autant de champ qu'on veut la valeur tapée dans un input type text... mais que faire si l'on ne veut pas qu'il fasse un LIKE mais une recherche EXACT du mot tapé ?

il ne le propose pas car ca devient vite compliqué de faire une recherche du mot EN ENTIER seulement dans un champ de type text... mais pas de souci, tonton LETO va vous montrer comment faire notre petite tambouille :)


Pour la correspondance, il faut modifier le fichier
 /administrator/components/com_cck/helpers/helper_workshop.php

et rajouter la correspondance dans le select :

JHtml::_( 'select.option', 'search_generic_any', JText::_( 'search_generic_any' ) ),//ajout joachim correspondance

DONC maintenant, dans le backOffice Seblod, dans l'onglet 'recherche' de votre 'liste et type de recherche', cliquez sur l'onglet à droite 'correspondance' et choisissez la correspondance que vous venez d'ajouter : 'search_generic_any'

Il faut ensuite modifier le fichier
/plugins/cck_storage/custom/custom.php
ET/OU
 /plugins/cck_storage/standard/standard.php
 (en fonction du champ de recherche, dans le doute, modifiez les deux, on ne fait que des ajouts de code, on ne supprime rien)

et rajouter un cas au switch case :

case 'search_generic_any'://ajout joachim correspondance
                $value=str_replace('+', '\+', $value); // pour pouvoir taper des termes tels que 'C#' dans la recherche
                $value=str_replace('#', '\#', $value);// pour pouvoir taper des termes tels que 'C++' dans la recherche
                
                $separator    =    ( $field->match_value ) ? $field->match_value : ' ';
                $values        =    explode( $separator, $value );
                if ( count( $values ) ) {
                    $fragments    =    array();
                    foreach ( $values as $v ) {
                        if ( strlen( $v ) > 0 ) {
                            $v=str_ireplace(array('e','é','è','ê'), '(e|é|è|ê)', $v);
                            $v=str_ireplace(array('a','à','â'), '(a|à|â)', $v);
                            $v=str_ireplace(array('o','ô','ö'), '(o|ô|ö)', $v);
                            $v=str_ireplace(array('i','î','ï'), '(i|î|ï)', $v);
                            $v=str_ireplace(array('u','û','ü'), '(u|û|ü)', $v);
                            $fragments[]     =    $target.' REGEXP '.JCckDatabase::quote( '[[::]]', false );
                            // $fragments[]     =    $target.'  REGEXP '.JCckDatabase::quote( JCckDatabase::escape( $v, true ).'[^a-zA-Z]|[^a-zA-Z]'.JCckDatabase::escape( $v, true ), false );
                        }
                    }
                    if ( count( $fragments ) ) {
                        $sql    =    '((' . implode( ') OR (', $fragments ) . '))';
                    }
                }
                break;

 

Et voila !!! maintenant, la recherche se fait sur le terme EXACT tapé dans le champ de recherche ! merci qui ? merci Pulsar !!!

 

(vous pouvez tout aussi bien me suivre sur google + (because que ca fait rudemment plaisir)  : 

 mon compte google +

 

Merciii