Bookmark and Share
Document Actions

Generazione della site map di Plone 3.0
medio

Come viene costruita la site map di Plone 3.0

La site map che si ottiene da Plone standard nasce dal template sitemap.pt che troviamo in plone_templates di portal_skins.

Dal template risulta chiaro che il grosso del lavoro è delegato alla vista sitemap_view.

Andiamo quindi a scoprire cosa si cela in tale vista, che troviamo definita in CMFPlone.browser.sitemap.SitemapView.

Per prima cosa osserviamo che SitemapView implementa ISitemapView, il cui unico metodo è createSiteMap, nome abbastanza eloquente da non lasciare equivoci. Di fatto SitemapView non fa altro che restituire il rendering del template portlet_navtree_macro, dopo aver ottenuto i dati per la costruzione della site map da una ulteriore vista, ricavata adattando il contesto e la request al nome

“sitemap_builder_view”:: view = getMultiAdapter((context, self.request), name='sitemap_builder_view') data = view.siteMap() 

Il livello di annidamento delle logiche aumenta: scopriamo come è costruito questo adapter, definito in CMFPlone.browser.navigation.CatalogSiteMap. CatalogSiteMap implementa l'interfaccia ISiteMap, dotata di un solo metodo: siteMap.

Ancora una volta troviamo una implementazione piuttosto semplice, che restituisce il risultato del metodo buildFolderTree, “reciclato” da plone.app.layout.navigation.navtree (a pensarci un attimo, è piuttosto ovvia la parentela tra la site map e l'albero di navigazione..).

buildFolderTree realizza un meccanismo piuttosto complesso che, dato il contesto, produce come risultato gli elementi corrispondenti ad una specifica query a cui si è interessati, rispettando una strategia con cui modulare gli esiti della query.

Per capirci, tramite la query definiamo la richiesta da operare a catalogo per ottenere ad esempio tutti gli elementi figli del contesto e delle eventuali sottocartelle fino a una certa profondità. Con la strategia possiamo andare a modulare I risultati ottenuti chiedendo ad esempio di mostrare “esplosi” solo i figli del contesto il cui titolo inizia per “A” (ricordate che questo è solo un povero esempio ;)).

Nel caso della sitemap di Plone il queryBuilder è definito mediante il SitemapQueryBuilder, definito in CMFPlone.browser.navtree, e può essere sintetizzato così:

self.query['path'] = {'query' : portal_url.getPortalPath(), 'depth' : sitemapDepth} 

Di fatto non fa altro che chiedere il calcolo dell'albero che ha origine nel portale per una profondità parametrizzata, modificabile dal pannello di controllo di Plone.

Per quanto riguarda la strategia, invece, essa è chiaramente mantenuta identica a quella definita per l'albero di navigazione, e ottenuta per adattamento del contesto e della CatalogSiteMap all'interfaccia INavtreeStrategy.

Il nostro scoprire le carte si ferma qui, e per quanto riguarda i punti critici per la realizzazione del nostro intento, l'unico inconveniente è rappresentato dalla “cablatura” della radice dell'albero al portale definita in SitemapQueryBuilder.

 
by Maurizio Delmonte last modified 2008-12-12 20:13