Realizzare un Calendario dell'Avvento

Dettagli della notizia

Potere all'immaginazione! In Joomla 5.2 è stato introdotto il nuovissimo Modulo Articoli, un modulo super flessibile che ti consente di mostrare i tuoi articoli.

Contenuto

In questo articolo, Viviana ci mostra come è possibile utilizzare questo modulo per creare un Calendario dell'Avvento. Lasciati ispirare e scatena la tua creatività!

Il Calendario dell'Avvento ha una lunga tradizione in Germania e negli ultimi anni è diventato popolare anche in altri paesi. Originariamente sviluppato per aiutare i bambini a contare i giorni prima di Natale, si è evoluto per trattare anche gli adulti con dolci o piccoli regali, uno ogni giorno fino a Natale. E naturalmente ci sono anche calendari dell'avvento online.

Alcuni anni fa c'era un'estensione per Joomla per creare calendari dell'avvento e l'ho usata per diversi anni per un cliente. Un'organizzazione per la protezione degli animali ha utilizzato il calendario dell'avvento per presentare belle storie, chiedere aiuto o introdurre animali domestici speciali. Questa estensione non viene più sviluppata attivamente e come un altro cliente mi ha chiesto un calendario dell'avvento per il loro sito web ho dovuto cercare una nuova soluzione. Volevo qualcosa di leggero che non necessitasse di manutenzione in quanto è un requisito "una volta all'anno".

Joomla 5.2 ha introdotto un nuovo modulo, il modulo articoli (internamente noto come "modulo contenuto per governarli tutti" - liberamente adattato da "Il Signore degli Anelli"). Cinque (dei sette) moduli dell'articolo precedente sono stati combinati per fornire maggiore flessibilità (per maggiori informazioni consultare la pagina di aiuto: https://docs.joomla.org/Help5.x:Site_Modules:_Articles). Uso già il modulo su nuovi siti web e ho anche creato alcuni override per questo. In questo articolo voglio mostrarvi come ho intenzione di implementare un calendario dell'avvento per il mio cliente utilizzando il modulo Articoli.

Preparazione

Per creare il Calendario dell'Avvento, abbiamo bisogno di:

  • Una categoria (l'ho chiamata "Avvento")
  • Un campo personalizzato dal tipo Calendario per gli articoli (Ho creato per la prima volta un gruppo di campi "Avvento" e assegnato il campo denominato "Giorno" al gruppo e alla categoria). Useremo questo campo per definire quale "porta" nel calendario dell'avvento può essere aperta ogni giorno
  • 24 articoli (ad esempio Giorno 1, Giorno 2, ..., Giorno 24) ciascuno con un'immagine introduttiva e un giorno assegnato (Giorno 1 = 1 ° dicembre e così via). Il contenuto dell'articolo può essere quello che vuoi: una ricetta, una poesia, un'immagine...

Screenshot campo personalizzato

Override

Il modulo Articoli è composto da tre file:

  • default.php
  • default_items.php
  • default_titles.php

Dal momento che userò solo alcuni parametri dal modulo ho creato un solo file denominato advent.php e riscrivi il codice per visualizzare una griglia (6x4) contenente solo le immagini introduttive degli articoli. Gli articoli saranno cliccabili quando il giorno assegnato corrisponde oggi: Il giorno 2 è assegnato al 2 dicembre, l'articolo può essere visto prima, ma diventerà cliccabile il 2 dicembre. L'articolo si aprirà su una finestra modale.

advent.php

<?php

/**
 * @package     Joomla.Site
 * @subpackage  mod_articles
 *
 * @copyright   (C) 2024 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
use Joomla\CMS\Router\Route;

/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
$wa = $app->getDocument()->getWebAssetManager();
$wa->useScript('joomla.dialog-autocreate');

if (!$list) {
    return;
}

$items = $list;

$today = Factory::getDate()->format('Y-m-d');

// Set up the modal options that will be used for module editor
$popupOptions = [
    'popupType'  => 'iframe',
    'className'  => 'adventskalender',
];

?>

<div class="advent-grid">
    <?php foreach ($items as $item) : ?>
       <?php
            // Get the images for this article
            $images  = json_decode($item->images);

            // Get the custom fields for this article
            $jcfields = FieldsHelper::getFields('com_content.article', $item, true);

            // Create an associative array for easier access by field name
            foreach($jcfields as $jcfield) {
                $jcfields[$jcfield->name] = $jcfield;
            }

            // Ensure the field exists and is a valid date
            $openDay = isset($jcfields['day']) ? date('Y-m-d', strtotime($jcfields['day']->value)) : null;

            // Set up popup options
            $popupOptions['src'] = Route::_('index.php?option=com_content&view=article&id=' . $item->id . '&catid=' . $item->catid . '&layout=modal&tmpl=component', false);
            $popupOptions['textHeader'] = $item->title;

            $layoutAttr = [
                'src' => $images->image_intro,
                'alt' => empty($images->image_intro_alt) ? '' : $images->image_intro_alt,
            ];
        ?>
        <div class="mod-articles-advent-item-content">

            <?php if ($openDay <= $today) : ?>
            <button type="button"
                data-joomla-dialog="<?php echo htmlspecialchars(json_encode($popupOptions, JSON_UNESCAPED_SLASHES)) ?>"
                class="btn btn-link advent-link"
                aria-label="<?php echo $item->title; ?>"
                id="title-<?php echo $item->id; ?>"
                data-module-id="<?php echo $item->id; ?>">
                <figure class="advent-item-image">
                    <?php echo LayoutHelper::render('joomla.html.image', $layoutAttr); ?>
                </figure>
            </button>
            <?php else : ?>
                <figure class="advent-item-image">
                    <?php echo LayoutHelper::render('joomla.html.image', $layoutAttr); ?>
                </figure>
            <?php endif; ?>

        </div>
    <?php endforeach; ?>
</div>

 

Spiegazione delle righe 

Con questa riga otteniamo lo script per creare finestre modali, questa funzione fa parte del core di Joomla:

$wa->useScript('joomla.dialog-autocreate');

Il modulo contiene il codice per visualizzare l'immagine introduttiva dell'articolo, ma per evitare conflitti con altri parametri impostati per il sito web, ho deciso di riscrivere anche questa parte. Con queste righe otteniamo le immagini dagli articoli e impostiamo alcuni attributi:

$images  = json_decode($item->images);
$layoutAttr = [
	'src' => $images->image_intro,
	'alt' => empty($images->image_intro_alt) ? '' : $images->image_intro_alt,
];

Abbiamo anche bisogno del campo personalizzato:

$jcfields = FieldsHelper::getFields('com_content.article', $item, true);
            foreach($jcfields as $jcfield) {
                $jcfields[$jcfield->name] = $jcfield;
            }

Questi

// Set up the modal options that will be used for module editor
$popupOptions = [
    'popupType'  => 'iframe',
    'className'  => 'adventskalender',
];

e questi

$popupOptions['src'] = Route::_('index.php?option=com_content&view=article&id=' . $item->id . '&catid=' . $item->catid . '&layout=modal&tmpl=component', false);
$popupOptions['textHeader'] = $item->title;

sono opzioni per la finestra modale. Utilizziamo il titolo dell'articolo come titolo della finestra modale.

Otteniamo la data corrente:

$today = Factory::getDate()->format('Y-m-d');

Controlliamo se il campo esiste e convertiamo il valore nello stesso formato di data:

$openDay = isset($jcfields['day']) ? date('Y-m-d', strtotime($jcfields['day']->value)) : null;

e confrontiamo i due valori:

<?php if ($openDay <= $today) : ?>

Gli articoli assegnati a "oggi" o a giorni precedenti diventano cliccabili tramite un pulsante attorno all'immagine. Gli articoli assegnati a giorni futuri mostrano solo l'immagine:

<?php if ($openDay <= $today) : ?>
<button type="button"
	data-joomla-dialog="<?php echo htmlspecialchars(json_encode($popupOptions, JSON_UNESCAPED_SLASHES)) ?>"
	class="btn btn-link advent-link"
	aria-label="<?php echo $item->title; ?>"
	id="title-<?php echo $item->id; ?>"
	data-module-id="<?php echo $item->id; ?>">
	<figure class="advent-item-image">
		<?php echo LayoutHelper::render('joomla.html.image', $layoutAttr); ?>
	</figure>
</button>
<?php else : ?>
	<figure class="advent-item-image">
		<?php echo LayoutHelper::render('joomla.html.image', $layoutAttr); ?>
	</figure>
<?php endif; ?>

CSS

Ho aggiunto il seguente CSS al file user.css di Cassiopeia:

.advent-grid {
    display: grid;
    grid-template-columns: repeat(6,minmax(100px,1fr));
    gap: .5rem;
    figure {
        margin: 0;
    }
    .advent-link {
        padding: 0;
        text-decoration: none;
        color: currentColor;
        width: 100%;
        height: 100%;
    }
    .mod-articles-advent-item-content {
        aspect-ratio: 1;
        transition: all .2s ease-in-out;
        display: flex;
        justify-content: center;
        align-items: center;
        box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.16);
        &:hover {
            transform: scale(1.025);
        }
    }
    span {
        font-size: 4rem;
        color: #fff;
    }
}
@media (max-width: 768px) {
    .advent-grid {
        grid-template-columns: repeat(3,minmax(80px,1fr));
    }
}

 

Modulo

Come accennato in precedenza, utilizzeremo solo alcuni parametri del modulo:

  • Modalità: Normale
  • Articoli da visualizzare: 24
  • Seleziona la categoria (ad esempio, Avvento)
  • In Ordinamento seleziona "Casuale"
  • In Avanzate seleziona il layout "Avvento"

Configurazione modulo categoria avvento

Configuration module

Configuration module

Puoi posizionare il modulo (ad esempio top-a in Cassiopea) oppure inserirlo in un articolo collegato a una voce di menu.

Il risultato è il seguente:

Screenshot from Advent Calendar

Cliccando su una "porta" si ottiene il contenuto dell'articolo corrispondente in una casella modale:

Article opened on a modal window

Se il collegamento all'articolo non funziona, puoi modificare popupOptions in:

$popupOptions['src'] = 'index.php?option=com_content&view=article&id=' . $item->id . '&catid=' . $item->catid . '&layout=modal&tmpl=component';

In alternativa, puoi creare una voce di menu per la categoria. Per mantenere segreti gli articoli, puoi impostare la voce di menu in modo che non venga visualizzata nel menu.

Layout alternativo

Un'altra opzione per creare un calendario dell'avvento è quella di usare un'immagine di sfondo e visualizzare gli articoli come riquadri con il numero del giorno. Il codice di override è il seguente:

advent2.php

<?php

/**
 * @package     Joomla.Site
 * @subpackage  mod_articles
 *
 * @copyright   (C) 2024 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
use Joomla\CMS\Router\Route;

/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
$wa = $app->getDocument()->getWebAssetManager();
$wa->useScript('joomla.dialog-autocreate');

if (!$list) {
    return;
}

$items = $list;

$today = Factory::getDate()->format('Y-m-d');

// Set up the modal options that will be used for module editor
$popupOptions = [
    'popupType'  => 'iframe',
    'className'  => 'adventskalender',
];

?>

<div class="advent-grid advent-bg">
    <?php foreach ($items as $item) : ?>
        <?php
            // Get the images for this article
            $images  = json_decode($item->images);

            // Get the custom fields for this article
            $jcfields = FieldsHelper::getFields('com_content.article', $item, true);

            // Create an associative array for easier access by field name
            foreach($jcfields as $jcfield) {
                $jcfields[$jcfield->name] = $jcfield;
            }

            // Ensure the field exists and is a valid date
            $openDay = isset($jcfields['day']) ? date('Y-m-d', strtotime($jcfields['day']->value)) : null;

            // Set up popup options
            $popupOptions['src'] = Route::_('index.php?option=com_content&view=article&id=' . $item->id . '&catid=' . $item->catid . '&layout=modal&tmpl=component', false);
            $popupOptions['textHeader'] = $item->title;

            $layoutAttr = [
                'src' => $images->image_intro,
                'alt' => empty($images->image_intro_alt) ? '' : $images->image_intro_alt,
            ];
        ?>
        <div class="mod-articles-advent-item-content">

            <?php if ($openDay <= $today) : ?>
            <button type="button"
                data-joomla-dialog="<?php echo htmlspecialchars(json_encode($popupOptions, JSON_UNESCAPED_SLASHES)) ?>"
                class="btn btn-link advent-link"
                aria-label="<?php echo $item->title; ?>"
                id="title-<?php echo $item->id; ?>"
                data-module-id="<?php echo $item->id; ?>">
                <span><?php echo date('j', strtotime($openDay)); ?></span>
            </button>
            <?php else : ?>
                <span><?php echo date('j', strtotime($openDay)); ?></span>
            <?php endif; ?>

        </div>
    <?php endforeach; ?>
</div>

Invece dell'immagine introduttiva dell'articolo ho estratto il giorno dal valore del campo:

<?php echo date('j', strtotime($openDay)); ?>

Sono necessarie alcune righe CSS aggiuntive:

.advent-bg {
    padding: .5rem;
    background-image: url(../../../../../images/advent/christmas-background-4621177_1920.jpg);
    background-repeat: no-repeat;
    background-size: cover;
    .mod-articles-advent-item-content {
        box-shadow: 3px 3px 3px rgba(255, 255, 255, 0.5);
        border: 1px solid #d5d5d5;
    }
}

E il risultato è molto bello:

Second variant of the Advent Calendar
Naturalmente l'idea non si limita ai calendari dell'avvento. Puoi utilizzarla anche per un evento promozionale, ad esempio per offrire sconti su prodotti o servizi durante la Black Week. Puoi modificare il codice per far aprire le "porte" solo nel giorno assegnato:

<?php if ($openDay == $today) : ?>
 
Se ho mille idee e solo una si rivela buona, sono soddisfatto - Alfred Nobel

 

Con questo spirito: prova il nuovo modulo Articoli, gioca con i parametri e trova nuove idee per il tuo sito web!

Un grande ringraziamento a Stefan Wendhausen per aver verificato e migliorato il codice.

Le immagini provengono da Pixabay.

Alcuni articoli pubblicati sulla rivista Joomla Community Magazine rappresentano l'opinione personale o l'esperienza dell'autore su un argomento specifico e potrebbero non essere in linea con la posizione ufficiale del progetto Joomla.

Informazioni Articolo

Categoria:
Traduzioni Joomla Magazine
Autore:
Viviana Menzel
Pubblicato:
19 Dicembre 2025
Visualizzazioni:
461
Traduttore:
Gioacchino Cipriano
Note del traduttore:

Alcune note tecniche relative alla traduzione.
Il codice php fa riferimento in alcune parti a termini in inglese.
Il campo personalizzato denominato "Giorno", nel codice viene richiamato come

$jcfields['day']

 Pertanto occorre trascrivere questi parti ad esempio come

$jcfields['giorno']

Anche la data è espressa come

date('Y-m-d')

che andrà modificata per l'italiano in:

date('d-m-Y')
Link Articolo Originale:
https://magazine.joomla.org/all-issues/november-2024/how-to-create-an-advent-calendar-using-the-new-articles-module-in-joomla-5-2
Livello Difficoltà:
Intermedio
Versioni di Joomla:
Joomla 5.x Joomla 6.x

Altri articoli della stessa categoria