Override template - parte 2 - file per modificare "Lista Categorie"

Override JoomlaRipartiamo con l'override e vediamo la pagina "Lista Categorie", utile per visualizzare in un colpo solo tutte le macroaree d'interesse del portale. Inoltre, vi faccio un piccolissimo regalo, una modifica chiesta spesso nei vari template.
Funziona su Joomla 2.5


Un particolare ausilio per la navigabilità dei nostri portali, è l'utilizzo di sitemap. Talvolta, possiamo presentare una versione "generale": una sorta di sitemap di macroaree. O meglio, un elenco di categorie e sottocategorie, per visualizzare le tematiche trattate.Esempio Pagina Categorie

Per i più esperti, interesserà il codice, mentre per altri potrei consigliare una lettura integrale dell'articolo. Per accontentare tutti, riporto un piccolo "menù" per questo articolo: scegliete voi dove andare e buona lettura!


Come Settare "Lista di tutte le categorie"

Lista categoriePer comprendere meglio di cosa sto parlando, ti consiglio la lettura della wiki a questo link Joomla2.5! Struttura i contenuti con le Categorie in particolar modo con la figura 7.

Per riassumere:

  1. Volate in Gestione menù ed aggiungete una nuova voce ad un menù di vostra scelta.
  2. In "Tipo di Voce Menù" fate click su seleziona e scegliete "Lista di tutte le  categorie".
  3. Nel pannello "Impostazioni Richieste" scegliete la categoria di partenza
    Root, indica la "macro-categoria" contente tutte quelle di 1° livello.
  4. In "Opzioni Categorie", decidete quanto mostrare della vostra infrastruttura, quanto andare in profondità. Inoltre potete impostare una descrizione. della categoria di partenza, "alternativa" a quella fornita dalla stessa.

Gli altri pannelli sono "secondari": influenzano solamente le modalità di visualizzazione della pagina, quante sottocategorie visualizzare e quale grado di profondità raggiungere.

Attenzione: d'ora in avanti farò riferimento a questa voce del menu come "Lista Categorie".


Dove Prelevare i file

I file con cui lavoreremo sono in questa cartella:

root/components/com_content/views/categories/tmpl

ovvero:Suddivisione per file, della visualizzazione di tutte le categorie

  • default.php (clicca qui per visualizzarne le caratteristiche)
    Usato per mostrare la categoria iniziale (di root) e le sue sottocategorie (di 1° livello). Quando la categoria da visualizzare, non contiene al suo interno altre categorie (di 1° livello) ma solo i propri articoli, verrà utilizzato un altro file. 
  • default_item.php (clicca qui per visualizzarne le caratteristiche)
    Viene invocato per stampare le singole categorie (di qualunque livello) all'interno del file default.php. In sostanza visualizza i "figli" della categoria principale ed, in caso di sottocategorie presenti nelle categorie figlie, si "auto-invoca" per visualizzarle.


Dove Copiarli

Prima di tutto copiamo i precedenti file, all'interno della cartella html del vostro template

root/templates/mio_template/html/categories/

mantendo gli stessi nomi. Se nel vostro template la cartella html o article non è presente createla voi.Solo successivamente possiamo modificarli.


Analisi Codice

Come nell'altro articolo, anche questa volta analizzeremo il codice, riga dopo riga, istruzione dopo istruzione.


Default.php

Questo file permette di visualizzare le informazioni relative alla categoria principale scelta, ed eventuali sue sottocategorie.

Torna alla lista


Le prime 14 righe

Sono fondamentali per il funzionamento del template: non tanto per la parte commentata, ma per queste istruzioni

<?php
/**
* @package Joomla.Site
* @subpackage com_content
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/</p>
<p>// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers');
 
?>
L'ultima istruzione, permette di invocare l'helpers, ovvero una serie di file per determinare il percorso, la query da effettuare ed altre informazioni necessarie al funzionamento. Quindi, queste istruzioni non si toccano.

Torna alla lista


Apertura div

Partiamo da questa linea di codice

<div class="categories-list<?php echo $this->pageclass_sfx;?>">
Cosa fa? Semplicemente apre un div e fornisce la nostra classe scelta, preceduta dal prefisso "categories-list". 
Domanda, dove si imposta questa classe nel backend?
Risposta, all'interno di  "Lista Categorie", scegliete il panello "Opzioni visualizzazione pagina" e compilate il campo "Classe pagina".
Torna alla lista


Intestazione Pagina

Nel Backend di "Lista Categorie",  alla voce "Opzioni di visualizzazione pagina", compilate i campi

  • Mostra intestazione pagina, su SI
  • Intestazione Pagina, date un titolo interessante

Il codice seguente

<?php if ($this->params->get('show_page_heading', 1)) : ?>
<h1>
 <?php echo $this->escape($this->params->get('page_heading')); ?>
</h1>
<?php endif; ?>
si preoccupa di visualizzare il titolo che avrete dato alla vostra pagina.
Torna alla lista


Descrizione Categoria

Pannello Opzioni CategorieLa descrizione della categoria è un pò particolare. Infatti, sempre nel Backend di "Lista Categorie", nel riquadro "Opzioni categorie", abbiamo il 1° campo "Descrizione categorie principale" con le seguenti opzioni:

  • Usa Globali
    Si riferisce alle impostazioni definite in Backend->Gestione Categorie->Opzioni->Categorie->Descrizione Categoria Principale.
  • Nascondi
    Nasconde la descrizione fornita dalla voce del menù, visualizzando quella della categoria.
  • Mostra 
    Duale di Nascondi, visualizza la descrizione fatta nel pannello (sempre della nostra voce "Lista Categorie") "Opzioni categorie" nel 2° campo "Descrizione categorie principale" dove è possibile inserire del testo.

Il codice contiene il controllo per visualizzare una qualunque descrizione, sia il controllo che precisa quale debba essere.

<?php if ($this->params->get('show_base_description')) : ?>
Ora, dobbiamo verificare quale valore abbia il 1° campo "Descrizione categorie principale" tramite questa istruzione
<?php //If there is a description in the menu parameters use that; ?>
<?php if($this->params->get('categories_description')) : ?>

Torna alla lista


Descrizione Categoria: Dalla voce del menù

Se impostiamo Mostra (o nelle impostazioni globali è stato settato mostra), il controllo risulterà positivo e quindi questa istruzione

<?php echo  JHtml::_('content.prepare', $this->params->get('categories_description'), '', 'com_content.categories'); ?>
visualizzerà il contenuto del 2° campo "Descrizione categorie princpale".
Torna alla lista


Descrizione Categoria: Dalla categoria principale

Se impostiamo Nascondi (o nelle impostazioni globali è stato settato nascondi), il controllo risulterà negativo e quindi passerà alla voce "else" presente. Di fatto vengono elaborate queste istruzioni

<?php else: ?>
<?php //Otherwise get one from the database if it exists. ?>
 <?php if ($this->parent->description) : ?>
 <div class="category-desc">
 <?php echo JHtml::_('content.prepare', $this->parent->description, '', 'com_content.categories'); ?>
 </div>
 <?php endif; ?>
Come sempre, viene verificata la presenza di una descrizione da mostrare. Può capitare di avere alcune categorie senza descrizione, pertanto in questa situazione, il controllo successivo all'else, darebbe esito negativo. Pertanto , non verrebbe visualizzata alcuna descrizione.
Torna alla lista


Visualizzazione delle categorie di livello inferiore

Bene, ora che abbiamo dato una intestazione alla pagina, possiamo cominciare a visualizzare le sottocategorie. Invochiamo il successivo file, con questa istruzione

<?php
echo $this->loadTemplate('items');
?>
</div>
Chiudiamo, ovviamente, il div iniziale, aperto qui.
Torna alla lista


Default_items.php

Questo file visualizza ogni singola categoria, contenuta nella categoria principale. Inoltre, in presenza di categorie di 2° livello ("figlie di figle" della categoria principale), richiama se stesso.

Torna alla lista


Le prime 13 Righe

Come per il file precedente, abbiamo alcune righe da non toccare, per mantenere il corretto funzionamento del nostro portale.

<?php
/**
* @package Joomla.Site
 * @subpackage com_content
 * @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */
// no direct access
defined('_JEXEC') or die;
$class = ' class="first"';
if (count($this->items[$this->parent->id]) > 0 && $this->maxLevelcat != 0) :
?>
Prepara la variabile "$class" per indicare il primo elemento e poi, successivamente, l'ultimo. Il controllo, verifica che esista qualcosa da visualizzare  e verifica che non si vada oltre un certo limite. Ovvero:

  • Conta quanti elementi ci sono e verifica che il totale sia maggiore di 0
  • "$MaxLevelCat" è un contatore a numeri negativi. Man mano si raggiungono sotto livelli aumenta (si avvicina sempre più a 0). Lo ritroviamo più avanti.

Torna alla lista


Iniziamo ad elencare

Se c'è qualcosa da visualizzare, si prosegue con questa istruzione

<ul>
<?php foreach($this->items[$this->parent->id] as $id => $item) : ?>
Un semplice foreach, preceduto dall'apertura del tag "unorder list".

Torna alla lista


Autorizzazione

Ora che possiamo visualizzare le categorie, dobbiamo chiederci se ve ne siano (sia dirette che figlie) e sopratutto se possiamo visualizzare le categorie vuote. In un colpo solo, effettuiamo questo controllo con questa istruzione

if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) :
Pertanto, tutto ciò che seguirà avviene all'interno di questo if; se questo controllo dovesse fallire, si passa all'elemento successivo.

Torna alla lista


È l'ultimo

Per un maggior controllo, all'ultimo elemento viene assegnata la classe "last" all'ultimo elemento.

if (!isset($this->items[$this->parent->id][$id + 1]))
{
$class = ' class="last"';
}
?>

Torna alla lista


Stampiamo l'elemento

Da ora in avanti, cominciamo a trattare ogni singolo elemento dell'elenco, ovvero ogni singola categoria presente a questo livello.

<li<?php echo $class; ?>>
<?php $class = ''; ?>
Solo a questo punto possiamo svuotare la variabile "$class".

Torna alla lista


Titolo della categoria

Visualizziamo il titolo della categoria in esame

<span class="item-title"><a href="<?php echo JRoute::_(ContentHelperRoute::getCategoryRoute($item->id));?>">
<?php echo $this->escape($item->title); ?></a>
</span>
In un colpo solo recuperiamo il percorso della categoria e ne stampiamo il nome.

Torna alla lista


Visualizzare la descrizione

Vediamo il frammento di codice

<?php if ($this->params->get('show_subcat_desc_cat') == 1) :?>
<?php if ($item->description) : ?>
<div class="category-desc">
<?php echo JHtml::_('content.prepare', $item->description, '', 'com_content.categories'); ?>
</div>
<?php endif; ?>
Il primo controllo effettuato, verifica se in caso di categorie di 2° o livelli inferiori, rispetto a quella corrente, possano visualizzare la loro descrizione. Infatti, possiamo scegliere nel backend la profondità con cui vogliamo visualizzare le descrizioni delle sottocategorie, tramite il pannello "Opzioni categoria" del ListaCategorie. Basterà settare il campo "Descrizioni sottocategorie", in combinazione con "Livello massimo sottocategorie" per assecondare i nostri scopi.

Il secondo controllo, invece, verifica che ci sia effettivamente qualcosa da visualizzare.

Torna alla lista


Visualizzare la descrizione: Piccolo regalo ~ visualizzare l'immagine della categoria

Aggiungendo una semplice istruzione, possiamo visualizzare le immagini assegnate alle categorie. Io preferisco farlo vicino alla descrizione, aggiungendo queste tre linee di codice

<?php 
if($item->getParams()->get('image')):?>
<img src="<?php echo $item->getParams()->get('image'); ?>"/>
<?php endif;?>
Questo codice non è presente, è una mia aggiunta!

Torna alla lista


Visualizzare il numero di articoli presenti

Al di fuori del 1° controllo fatto per visualizzare la descrizione, si trovano le istruzioni per verificare le impostazioni di visualizzazioni per il numero di articoli presenti nella categoria in esame.

<?php if ($this->params->get('show_cat_num_articles_cat') == 1) :?>
<dl><dt>
<?php echo JText::_('COM_CONTENT_NUM_ITEMS'); ?></dt>
<dd><?php echo $item->numitems; ?></dd>
</dl>
<?php endif; ?>
Con l'istruzione "JText::_('COM_CONTENT_NUM_ITEMS')", viene stampata la frase "Conteggio articoli" presente nel file root/language/it-IT.com_content.ini alla riga 40. Subito dopo viene visualizzato il totale degli articoli.

Torna alla lista


Controllare che non vi siano sottocategorie in quella corrente

L'ultima parte di codice, deve affrontare due casi:

  • La categoria non contiene altre sottocategorie
  • La categoria possiede altre sottocategorie

Ovviamente, deve chiudere l'elemento

  • e settare alcune variabili per la prossima iterazione.
    <?php if (count($item->getChildren()) > 0) :
    $this->items[$item->id] = $item->getChildren();
    $this->parent = $item;
    $this->maxLevelcat--;
    echo $this->loadTemplate('items');
    $this->parent = $item->getParent();
    $this->maxLevelcat++;
    endif; ?>
    </li>
    Il primo controllo verifica se esistono delle sottocategorie ed in caso di un conteggio positivo non nullo, si prepara a fornire i nuovi dati per la successiva iterazione. Innanzitutto

    • Carica le categorie figlie nell'oggetto items
    • Nell'oggetto parent ripone la categoria in esame (ricordate nel foreach che cosa accadeva?)
    • La variabile "$maxLevelcat" viene decrementata, ad indicare il livello delle sottocategorie
    • Viene stampato a video, il risultato dell'invocazione di questo stesso file.
    • Ricolloca in parent, la categoria padre di quella in esame (contenuta in item)
    • Incrementa maxLevelcat per indicare se
      • Questa è l'ultima invocazione, pertanto ho raggiunto il valore $maxLevelCat=0 (ed in questo controllo è una condizione di falsità).
      • Non si tratta dell'ultima invocazione, ma del completamento della visualizzazione delle sottocategorie. Pertanto, al concludersi delle istruzioni presenti in questa pagina, ritornerò al livello precedente per continuare la visualizzazione delle categorie.

    Torna alla lista

    Andrea Rossi MasterTheBest

    CommentaCommenta questo articolo sul forum