Cambiare le icone nel menu di navigazione
Up to Plone Forum
ciao, ho un quesito da porvi che mi sta facendo perdere molto tempo.
Sto lavorando alla realizzazione di un portale per la mia tesi di laurea. Come cms open source la scelta è ricaduta su Plone.
Il mio problema è questo: vorrei cambiare le icone dei link contenuti nel menu di navigazione. Ho visto che di di default visualizza delle cartelline oppure è possibile modificare la parte di file css relativa e non mostrare nulla (ossia semplici link). Per ogni link vorrei inserire un'icona personalizzata, cioè, ad esempio se il menu contiene i link 'blog' e 'forum' abbinare un'icona per blog ed una diversa per forum.
Ho esaminato il file navigation.pt che si occupa della costruzione dell'albero di navigazione. ad un certo punto del file viene costruito il sottoalbero richiamando questa istruzione:
......
<li tal:replace="structure view/createNavTree">
SUBTREE
</li>
per cui penso che si debba modificare questa createNavTree. Dove posso trovare il relativo codice?
Grazie anticipatamente per l'aiuto.
Ciao Floriana,
si interviene così pesantemente quando si deve fare qualcosa di strutturale, ma se vuoi dare un'occhiata al codice niente di male, anzi!
In questo caso ti consiglio di fare un giro nella ZMI del tuo sito Plone, entrare nel tool portal_types e vedere quale icona viene utilizzata (faccio un esempio: document_icon.gif).
A questo punto trovata l'informazione che cercavi dovresti andare in un altro tool chiamato portal_skins, cliccare sul tab find, cercare document_icon.gif ed una volta trovata "customizzarla" usando l'apposito pulsante. Customizzare significa creare una tua versione modificata di una risorsa esistente (template, css, ecc) che verrà spostata in una cartella a più alta priorità (cartella custom, o meglio layer).
Quando Plone cercherà document_icon.gif troverà la tua versione che avrai modificato e non più quella di default, senza modificare nulla a livello di codice. Se decidi di tornare alla versione di default ti basta semplicemente cancellare la tua versione nella cartella custom.
Quindi un tema plone è un insieme di layer ordinati con un ordine di precedenza; Plone cerca le sue risorse dentro questi layer. In realtà poi scoprirai che ci sono anche altre cose dietro a un sito Plone ma per ora dovrebbe bastare così.
Spero di essere stato utile 
davide
Ciao, ti ringrazio per la risposta.
si si, queste cose mi sono chiare. Però, così come mi hai suggerito, quando si crea l'albero di navigazione, tutti i link hanno la stessa iconcina. Io vorrei abbinare per ciascun link icone diverse.
Previously Davide Moro wrote:
Ciao Floriana,
si interviene così pesantemente quando si deve fare qualcosa di strutturale, ma se vuoi dare un'occhiata al codice niente di male, anzi!
In questo caso ti consiglio di fare un giro nella ZMI del tuo sito Plone, entrare nel tool portal_types e vedere quale icona viene utilizzata (faccio un esempio: document_icon.gif).
A questo punto trovata l'informazione che cercavi dovresti andare in un altro tool chiamato portal_skins, cliccare sul tab find, cercare document_icon.gif ed una volta trovata "customizzarla" usando l'apposito pulsante. Customizzare significa creare una tua versione modificata di una risorsa esistente (template, css, ecc) che verrà spostata in una cartella a più alta priorità (cartella custom, o meglio layer).
Quando Plone cercherà document_icon.gif troverà la tua versione che avrai modificato e non più quella di default, senza modificare nulla a livello di codice. Se decidi di tornare alla versione di default ti basta semplicemente cancellare la tua versione nella cartella custom.
Quindi un tema plone è un insieme di layer ordinati con un ordine di precedenza; Plone cerca le sue risorse dentro questi layer. In realtà poi scoprirai che ci sono anche altre cose dietro a un sito Plone ma per ora dovrebbe bastare così.
Spero di essere stato utile
davide
Aspetta,
allora avevo capito male.
Plone dovrebbe già fare come dici, di default oggetti di tipo diverso hanno icone diverse.
Cosa non ti è chiaro?
così è più chiaro.
Se vuoi creare delle cartelle standard e associare delle icone in base a delle tue logiche puoi andare in portal_types, copiare l'elemento Folder e aggiungere dei tuoi tipi semplici di cartelle che chiamerai Blog, Forum per esempio e su ognuno di questi elementi potrai definire un'icona diversa che includerai in portal_skins.
L'approccio è valido solo se non hai bisogno di aggiungere nuovi campi, saranno delle cartelle standard e avranno di diverso solo il nome.
Una volta fatto questo dovresti trovare nel menu a tendina due tipi nuovi di cartella pronti per essere aggiunti.
Ho capito. Ciò di cui tu parli è il repurposing (creazione di nuovi tipi di dato da quelli esistenti).
Allora, questa cosa nel mio portale è stata fatta. A partire dal tipo Folder ho creato altri due tipi di dati : Viabilita e Forum. nella portlet di navigazione ho così :
- Home
- Viabilita
- Forum
Sono andata in portal_types. Cliccando ad esempio su Forum, sotto il tab Properties, trovo un campo Icon con scritto folder_icon.gif. Dici di inserire qui il nome dell'icona? tipo forum.gif, Perchè se è così non cambia l'icona nel menu di navigazione ma nel pannello di controllo della ZMI.
In portal_skins dove inserisco il nome dell'icona? (custom o plone_images?) (forum.gif è in custom ora)
Ho cercato di seguire un'altra strada, ossia individuare i file che costruiscono la portlet di navigazione e cambiare il codice. ho trovato navigation.pt e portlet_navtree_macro. in quest'ultimo file ho visto che costruisce l'albero. Ad un certo punto richiama in un img l'icona dell'elemento da inserire nell'albero e lì ho pensato di mettere un tal:condition in modo che se la mia condizione è verificata prende come immagine forum.gif altrimenti l'icona classica, ma non va. il codice è questo:
<metal:main define-macro="nav_main">
<tal:navitem repeat="node children">
<li class="navTreeItem visualNoMarker"
tal:define="children node/children;
item node/item;
useView python:item.portal_type in viewActions;
item_icon_forum here/forum.gif
item_icon python:plone_view.getIcon(item);
itemUrl python:test(useView, item.getURL() + '/view', item.getURL());
isCurrent node/currentItem;"
tal:condition="python: bottomLevel <= 0 or level < bottomLevel-1">
<tal:level define="item_wf_state_class python: 'state-' + normalizeString(item.review_state);"
<div tal:define="itemClass string:$item_wf_state_class;
itemClass python:test(isCurrent, itemClass + ' navTreeCurrentItem', itemClass);">
<!-- Controllo se l'elemento è Forum. Se è così prendo l'icona che dico io -->
<span tal:condition="python: 'Forum' in item/Title">
<a tal:attributes="href itemUrl;
title item/Description;
class string:$itemClass">
<img width="16" height="16"
src="" alt=""
tal:attributes="src item_icon_forum/url;
alt item_icon_forum/description;
title item_icon_forum/title;
width item_icon_forum/width;
height item_icon_forum/height;" />
<span tal:replace="item/Title">Selected Item Title</span>
</a>
</span>
<span tal:condition="python: 'Forum' not in item/Title">
<a tal:attributes="href itemUrl;
title item/Description;
class string:$itemClass">
<img width="16" height="16"
src="" alt=""
tal:condition="item_icon/url"
tal:attributes="src item_icon/url;
alt item_icon/description;
title item_icon/title;
width item_icon/width;
height item_icon/height;" />
<span tal:replace="item/Title">Selected Item Title</span>
</a>
</span>
</div>
<ul tal:attributes="class python:'navTree navTreeLevel'+str(level)"
tal:define="level python:level+1;"
tal:condition="nocall:children">
<metal:recurse use-macro="here/portlet_navtree_macro/macros/nav_main"/>
</ul>
</tal:level>
</li>
</tal:navitem>
</metal:main>
</tal:master>
Ti ringrazio
Ciao Floriana,
se vuoi usare l'approccio consigliato ti basta creare un tuo tipo in portal_types e fare l'upload delle tue icone nella custom del portal_skins tool (fai attenzione che abbiano lo stesso id che hai inserito in portal_types!).
Potresti anche utilizzare dei prodotti Plone che si occupano di gestire blog e forum (ma non so di preciso il tuo caso d'uso).
Tornando al codice posso dirti che non è una buona norma modificare direttamente i pacchetti di Plone, meglio estenderlo in un tuo plugin. Se fai tante modifiche e poi devi migrare ad una versione successiva praticamente devi rifare tutto!
Ciao,
davide