Back to top

Autore Topic: Modificare le opzioni di ricerca per "whole word" o "parola intera"  (Letto 4747 volte)

Offline McPuppa

  • Nuovo arrivato
  • *
  • Post: 25
  • Sesso: Maschio
    • Mostra profilo
Ciao a tutti

Il post e` un po' lungo, volendo saltare la parte introduttiva il problema e` che sostanzialmente dovrei andare ad aggiungere un'opzione di ricerca senza dover modificare un file (diciamo) di sistema di joomla, che perderei in caso di installazione di installazione di un update ufficiale.

mi sto sviluppando un modulo di ricerca custom per un componente che sto terminando (c'e` la visualizzazione ma manca la parte di amministrazione).

Per inquadrare la situazione il componente e` su un sito di acquariofilia mediterranea e si occupa di visualizzare le schede degli organismi marini. Si basa su 2 tabelle e su una di queste tabelle ho implementato il plugin di ricerca (forse in maniera non canonica, come spiegavo in un altro messaggio, ma funziona).

Facendo qualche prova sulla ricerca mi sono accorto che se cerco ad esempio la parola "actinia" che e` il genere di un organismo, oltre che i 2 organismi corrispondenti (a. cari e a. equina) mi escono anche le schede di organismi che nella classificazione contengono "Actiniaria", questo perche` ovviamente la ricerca esegue uno statement
Codice: [Seleziona]
genere LIKE '%actinia%' e quindi mi tirano dentro anche questi casi.

Ok mi sta bene, allora mi sono messo a smanettare per creare una ricerca per parola intera (o "whole word" in inglese) in modo che se cerco "actinia" tra i risultati mi escano le schede che contengono solo la parola "actinia" e non se questa fa parte di una parola. Ho trovato il modo usando la funzione di MySQL
Codice: [Seleziona]
MATCH () ... AGAINST () ma il problema e` di aggiungere questo tipo di ricerca oltre ai gia` presenti
Codice: [Seleziona]
Tutte le parole
Qualsiasi parola
Frase esatta

Smanetta che ti smanetta ho trovato anche questa soluzione andando a modificare il file
Codice: [Seleziona]
components\com_search\views\search\view.html.php
Il problema pero` e` che se un aggiornamento di joomla mi va a sovrascrivere questo file perdo la mia opzione di ricerca.
Quindi come si puo` fare in modo da aggiungerla senza andare a toccare la componente base? Derivandola in qualche modo?

Offline copesc

  • Appassionato
  • ***
  • Post: 500
    • Mostra profilo
Da quanto mi sembra di capire, i layout override di Joomla non ti permettono di sovrascrivere il file di view, ma solo i layout (tmpl/default.php ecc)

L'unica secondo me è creare un componente clone di com_search, chiamarlo com_mysearch ed usare quello. Però IMHO non è una cosa facile, probabilmente fai prima a controllare se il sito funziona dopo ogni aggiornamento ed in caso intervenire..

Sono benvenute smentite :)
Extensioni e Template per Joomla

Offline McPuppa

  • Nuovo arrivato
  • *
  • Post: 25
  • Sesso: Maschio
    • Mostra profilo
Citazione da: copesc
L'unica secondo me è creare un componente clone di com_search, chiamarlo com_mysearch ed usare quello. Però IMHO non è una cosa facile, probabilmente fai prima a controllare se il sito funziona dopo ogni aggiornamento ed in caso intervenire..

Piu` che clonarlo bisognerebbe derivarlo, solo che anche cosi` non servirebbe visto che viene fatto tutto dentro la funzione display...
Effettivamente visto che si tratta di aggiungere una riga e` piu` semplice ma piu` scomodo riportarla al momento dell'aggiornamento. :) Anche perche` l'aggiornamento non lo faccio io ma una persona che non mastica di programmazione. :)

Citazione da: copesc
Sono benvenute smentite :)

Sono benvenutissssssime!! :D

Offline chesslore

  • Appassionato
  • ***
  • Post: 297
  • Sesso: Maschio
  • Se sei casalingo ami il fuoco del fornello come me
    • Mostra profilo
Ciao a tutti... ;D ;D

Ho trovato questo post e siccome mi interesserebbe molto riuscire ad utilizzare la ricerca "whole word"
volevo sapere se qualcuno è riuscito ad ottenere dei risultati e come??

McPuppa credo che tu sia riuscito a fare quello che volevi... potresti indicare come ci sei arrivato?

Credo che sarebbe utile a molti. ::) ::)

Grazie!!!!

Offline McPuppa

  • Nuovo arrivato
  • *
  • Post: 25
  • Sesso: Maschio
    • Mostra profilo
chiedo scusa per il ridardo nella risposta.


McPuppa credo che tu sia riuscito a fare quello che volevi... potresti indicare come ci sei arrivato?

uhmm vediamo se riesco ad essere piu` dettagliato nella parte che riguarda la whole word.

Bisogna innanzitutto scriversi un plugin di ricerca personalizzato, per fare questo credo ci siano altre guide in giro per la rete; io ho copiato quello standard per le "newsfeeds" e l'ho modificato come mi serviva aggiungendo di fatto una ricerca sulle mie tabelle sfruttando pero` il motore di joomla.

Per quanto riguarda la parte "whole word" ho aggiunto uno switch alla funzione "plgSearchSchedelinks" che viene collegata dall'evento "onSearch" tramite la chiamata

$mainframe->registerEvent('onSearch', 'plgSearchSchedelinks');

che c'e` in testa al file.

Lo switch che ho aggiunto e` questo:
   case 'whole':
      $text = $db->Quote($db->getEscaped($text, true), false);
      $fieldList =& $model->getSearchableFieldsList();
      $where = 'MATCH('.$fieldList.') AGAINST ('.$text.' IN BOOLEAN MODE)';
      break;


La prima riga serve per formattare il testo da cercare con gli escape giusti e gli eventuali caratteri jolly.

La seconda riga chiama una funzione sul modello (che ho caricato prima) e che ritorna una stringa con i campi sui quali effettuare la ricerca separati da virgola.

La terza riga compone la where condition da usare per la ricerca. La sintassi l'ho scoperta spulciando i manuali di MySql o PHP non ricordo e serve esattamente per far fare al DB la ricerca per parole intere.

A questo punto il problema era (ed e` ancora perche` non ho piu` avuto tempo di cercare se c'e` una soluzione definitiva) di aggiungere l'opzione "whole world" alla pagina della ricerca di joomla senza doverla modificare fisicamente, perche` (come dicevo nel primo messaggio) un aggiornamento potrebbe sovrascrivere la pagina customizzata e farci perdere l'opzione.

Io l'ho risolto andando a modificare fisicamente il file e dicendo alla persona che segue il sito che quando fa gli aggiornamenti verifichi se la nuova opzione di ricerca esiste ancora, se non esiste si deve rimodificare il file nel modo seguente (fortunatamente e` una cosa semplice).
Il file da modificare e`

components\com_search\views\search\view.html.php

e precisamente bisogna cercare dove viene creato e riempito l'array delle opzioni

$searchphrases = array();
$searchphrases[] = JHTML::_('select.option', 'all', JText::_('All words'));
$searchphrases[] = JHTML::_('select.option', 'any', JText::_('Any words'));
$searchphrases[] = JHTML::_('select.option', 'exact', JText::_('Exact phrase'));


ed aggiungere la riga

$searchphrases[] = JHTML::_('select.option', 'whole', JText::_( 'Whole word' ) );

Fatto, a questo punto la nuova opzione viene aggiunta alla pagina di ricerca e viene gestita dal nostro plugin personalizzato, per gli altri plugin che non gestiscono l'opzione "whole" lo switch cade nell'opzione default che fa una ricerca normale.

Credo sia tutto se ci sono ancora dubbi fammi sapere che se posso li sbrogliamo.
« Ultima modifica: 26 Ago 2009, 18:59:42 da McPuppa »

Offline chesslore

  • Appassionato
  • ***
  • Post: 297
  • Sesso: Maschio
  • Se sei casalingo ami il fuoco del fornello come me
    • Mostra profilo
Grazieee!!!! ;D

Offline mdr3d

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Ciao ragazzi ho visto questo post e mi chiedo se mi daresti una mano...

io devo eliminare dalla ricerca la possibilità "qualsiasi parola"

sapresti dirmi come fare??

 



Web Design Bolzano Kreatif