[Plone-IT] cercatori (o smart folder)
Giacomo Zanobini
g.zanobini a arpat.toscana.it
Lun 19 Ott 2009 13:03:37 UTC
a conclusione del dibattito, volevo riassumere ciò che ho fatto, perchè
penso che potrebbe tornare utile a qualcuno, in futuro.
come ha detto Yuri:
>
> Con i cercatori puoi usare solo criteri in AND, mi pare, quindi non
> puoi fare questo tipo di ricerche.
>
> Ti conviene fare una query al catalogo direttamente (usando la
> sintassi che trovi qui:
> http://www.dieter.handshake.de/pyprojects/zope/AdvancedQuery.html) che
> è supportata da Plone, copiare il folder_view passandogli gli elementi
> risultanti.
>
> Oppure segui la dritta qui:
>
> http://groups.google.it/group/plone-users/browse_thread/thread/7435080ae6c5fb6d
>
>
> cioè crei un indice specializzato che dica si o no (risultato di uno
> script) a seconda del fatto che debba o meno essere incluso nei
> risultati. Dopo di che, alla query che include cani e gatti, aggiungi
> un criterio booleano su quell'indice.
mi pare che entrambe le soluzioni non siano facili per un utente di
bassa lega che voglia modificare i criteri di ricerca.
la mia soluzione è con due due external method:
il primo unisce i risultati di due cercatori,
il secondo li ordina (per esempio potrei passare il criterio "Title",
oppure data di pubblicazione)
in qualsiasi page template, posso quindi definire due liste (popolate
con i risultati di due cercatori)
che successivamente fondo e riordino sulla base di un campo passato come
parametro (purché comune a tutti gli elementi delle due liste)
ecco un esempio (ricordo il problema iniziale: avere una lista che
contenesse l'unione dei risultati di due o piu' cercatori)
siano list1 e list2 due cercatori (uno per i cani e l'altro per i gatti)
ho messo il seguente codice in un page template che mi serve per
visualizzare
> <tal:foldercontents define="
> folderContents1
> python:container.list1.queryCatalog();
> folderContents2
> python:container.list2.queryCatalog();
> folderContents
> python:context.list_join(folderContents1, folderContents2);
> folderContents
> python:context.sort_by_attr(folderContents,'Title');
DOMANDA:
mi rimane da capire un misterioso comportamento (di python e dei
cercatori) che mi causava un errore (non sempre, dipendeva da come avevo
definito i due cercatori)
date due liste folderContents1 e folderContents2 che contengono i
risultati di due cercatori (simili come criteri, ma non uguali)
python:folderContents1 + folderContents1 NON dà errore
python:folderContents2 + folderContents2 NON dà errore
python:folderContents1 + folderContents2 DA' ERRORE a runtime e dice
che non posso unire stringhe a liste (eppure sono due liste non vuote)
python:folderContents2 + folderContents1 DA' ERRORE a runtime
diverso da quello della riga precedente (ovvero cambiando l'ordine degli
addendi, cambia l'errore)
in sostanza non posso unire due liste usando l'operatore di somma
mi è toccato usare (nel codice python dell'ExternalMethod) l'operatore
"+=" che è piu' "tollerante".
def list_join(list1, list2):
intermed = []
intermed += list1
intermed += list2
return intermed
e in questo modo non vengono segnalati errori e tutto sembra funzionare
Giacomo
-----------------------------------------------------
#questa è la funzione che ordina sulla base di un attributo (il cui nome
viene passato come parametro)
def sort_by_attr(seq, attr, reverse=False):
intermed = [ (getattr(seq[i], attr), i, seq[i]) for i in
xrange(len(seq)) ]
intermed.sort(reverse=reverse)
return [ tup[-1] for tup in intermed ]
#funzione che attacca assieme due liste
def list_join(list1, list2):
intermed = []
intermed += list1
intermed += list2
return intermed
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.plone.org/pipermail/plone-plone-it/attachments/20091019/f32b7d6a/attachment.html>
Maggiori informazioni sulla lista
Plone-IT