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
_______________________________________________
Plone-IT mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/plone-it
http://www.nabble.com/Plone---Italy-f21728.html