Personal tools
batching results from ATTopic
Questo documento e' sostanzialmente il resoconto di quanto fatto per /portal.ictp.it/pio/italiano/servizi/cs L'obiettivo e' avere un page template che visualizzi dei link a contenuti che sono ricercabili e ordinati secondo uno SmartFolder (Topic, cercatore)
(nota: testato su plone 2.5.4)
Prima di tutto bisogna creare un Topic. Supponiamo che il nostro si chiami mytopic e sia nella directory corrente. Il topic contiene tutti i criteri che ci interessano e riordina i risultati, di modo che il page template debba semplicemente visualizzarli nella mnaiera corrente.
Il page template conterra' come al solito la chiamata alla macro master, che fornisce la grafica standard dei contenuti plone:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en"
metal:use-macro="here/main_template/macros/master"
i18n:domain="plone">
<body>
A questo punto importiamo il modulo Batch da plone e definiamo quali siano i risultati che ci interessano:
<div metal:fill-slot="main"
tal:define="results python:context.mytopic.queryCatalog();
Batch python:modules['Products.CMFPlone'].Batch;
size python:20;
start python:0;
start request/b_start | start;">
Ora dobbiamo fare una parentesi. Non mi e' chiaro se si tratti di un bug o meno, ma se cerchiamo per il valore start (quindi definento start request/start | start; invece che start request/b_start o qualsiasi cosa diversa da request/start) nella GET avremo un errore. Questo perche' probabilmente la request arriva anche alla chiamata queryCatalog() che per qualche motivo si incasina. Mi ha fatto perdere un pomeriggio, quindi mi raccomando: non usate mai ``request/start``
update su una istanza nuova si ottiene un errore molto piu' evidente. A quanto pare, il codice di getFolderContents, di queryCatalog etc... vanno a leggere la request; non sono ancora riuscito a capire dove questo generi problemi, ma un effetto collaterale e' che in qualsiai directory si puo', aggiungendo ?start:int=n all'URL, vedere i risultati dall' n-esimo in poi.
A questo punto possiamo creare una variabile batch che contiene le pagine che ci interessano, ad esempio cosi':
<div tal:condition="results"
tal:define="batch python:Batch(results, size, int(start), orphan=1);">
Se vogliamo possiamo sfruttare una macro per la navigation, inserendo (prima del repeat, magari!):
<div metal:use-macro="here/batch_macros/macros/navigation" />
A questo punto siamo pronti per il repeat:
<tal:items tal:repeat="item batch">
<tal:item tal:define="item_url item/getURL|item/absolute_url;
item_title_or_id item/pretty_title_or_id;
item_description item/Description;
item_type item/portal_type;
item_type_title item/Type;
item_type_class python: 'contenttype-' + normalizeString(item_type);
item_wf_state item/review_state|python: wtool.getInfoFor(item, 'review_state', '');
item_wf_state_class python:'state-' + normalizeString(item_wf_state);
item_modified item/ModificationDate;
item_eff item/EffectiveDate|item/ModificationDate;
item_date python: test(item.EffectiveDate != 'None', item.EffectiveDate, item.ModificationDate);">
<p>
<span tal:content="python:toLocalizedTime(item_eff,long_format=0)" />
</p>
<p>
<span tal:condition="python:item_type != 'Link'">
<a href="#"
tal:attributes="href python:item_url+'/view';
class string:$item_wf_state_class ;
title item_description;"
tal:content="item_title_or_id">
Item Title
</a>
</span>
</p>
<br /> <br />
</tal:item>
</tal:items>
il codice precedente contiene probabilmente piu' del necessario, ma la sostanza immagino sia chiara