Joomla Developer Manual

Manual Index

Esempio: Indice

Introduzione

Questo articolo fornisce un esempio di plugin di contenuto per illustrare la codifica utilizzando le ultime convenzioni di codifica di Joomla. Il codice completo è disponibile su GitHub. Puoi scaricarlo e installarlo o semplicemente decomprimerlo per ispezionare il codice.

C'è una sezione sullo Sviluppo di Plugin e ulteriori esempi nella Documentazione per Programmatori Joomla, copiata su questo sito per comodità.

Questo plugin genera un Indice dei Contenuti dalle intestazioni in qualsiasi articolo contenente un segnaposto {cefjdemostoc}. Il risultato è illustrato nell'ultima schermata di questo articolo.

Struttura del Codice Sorgente

La seguente è un'illustrazione schematica della struttura del codice sorgente utilizzato per creare l'estensione:

cefjdemos-plg-toc
|-- .vscode (folder for build settings)
|-- plg_content_cefjdemostoc (folder compressed to create an installable zip file)
    |-- language/en-GB/ (language folder, kept with the extension code)
        |-- plg_content_cefjdemostoc.ini
        |-- plg_content_cefjdemostoc.sys.ini
    |-- media
        |-- css
            |-- cefjdemostoc.css (layout styles)
    |-- services (folder for dependency injection)
        |-- provider.php (the DI code)
    |-- src (folder for namespaced classes)
        |-- Extension (folder for extension specific code)
            |-- Cefjdemostoc.php (the extension class code)
    |-- tmpl (folder for layouts)
        |-- default.php (the table of contents layout)
    |-- cefjdemostoc.xml (the manifest file)
|-- .gitignore (items not to include in the git repository)
|-- build.xml (instructions for building the extension with phing)
|-- LICENSE (the license statement)
|-- README.md (brief description and instructions on use)

Questa è la struttura come appare nell'IDE VSCode o VSCodium:

Plugin development file structure in vscodium

Il File Manifesto

Ogni estensione deve avere un file di manifest in formato xml. Viene utilizzato da Joomla per scopi di installazione, aggiornamento e rimozione. Questo è il file di manifest per questa estensione:

<?xml version="1.0" encoding="UTF-8"?>
<extension type="plugin" group="content" method="upgrade">
    <name>plg_content_cefjdemostoc</name>
    <author>Clifford E Ford</author>
    <creationDate>2024-12-23</creationDate>
    <copyright>(C) 2024 Clifford E Ford</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
    <authorEmail>cliff@xxxx.yyyy.co.uk</authorEmail>
    <authorUrl>jdocmanual.org</authorUrl>
    <version>0.2.2</version>
    <description>PLG_CONTENT_CEFJDEMOSTOC_XML_DESCRIPTION</description>
    <namespace path="src">Cefjdemos\Plugin\Content\Cefjdemostoc</namespace>
    <files>
        <folder plugin="cefjdemostoc">services</folder>
        <folder>src</folder>
        <folder>language</folder>
    </files>
    <media destination="plg_content_cefjdemostoc" folder="media">
        <folder>css</folder>
    </media>
    <changelogurl>https://raw.githubusercontent.com/ceford/cefjdemos-plg-content-toc/main/changelog.xml</changelogurl>
    <updateservers>
        <!-- Note: No spaces or linebreaks allowed between the server tags -->
        <server type="extension" priority="2" name="Cefjdemostoc Update Site">https://raw.githubusercontent.com/ceford/cefjdemos-plg-content-toc/main/updates.xml</server>
    </updateservers>
    <config>
        <fields name="params">
            <fieldset name="basic">
                <field
                    name="help"
                    type="list"
                    label="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_APPLIES_LABEL"
                    description="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_APPLIES_DESC"
                    default="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_APPLIES_DEFAULT"
                >
                    <option value="">PLG_CONTENT_CEFJDEMOSTOC_PARAMS_APPLIES_DEFAULT</option>
                </field>

                <field
                    name="toc_class"
                    type="text"
                    label="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_CARD_CLASS_LABEL"
                    description="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_CARD_CLASS_DESC"
                />

                <field
                    name="toc_head_class"
                    type="list"
                    label="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_CARD_HEAD_CLASS_LABEL"
                    description="PLG_CONTENT_CEFJDEMOSTOC_PARAMS_CARD_HEAD_CLASS_DESC"
                    default="center"
                >
                    <option value="text-center">text-center</option>
                    <option value="text-start">text-start</option>
                </field>
            </fieldset>
        </fields>
    </config>
</extension>

Il file servizi/provider.php

Lo scopo di questo file è registrare un fornitore di servizi e dichiarare gli strumenti necessari. Questo plugin particolare non richiede molto. Se il tuo plugin personalizzato avesse bisogno di effettuare query al database, lo dichiari qui. Dai un'occhiata a un plugin di autenticazione. Richiedono strumenti per database e utenti.

<?php

/**
 * @package     Cefjdemostoc.Plugin
 * @subpackage  Content.cefjdemostoc
 *
 * @copyright   (C) 2024 Clifford E Ford <https://jdocmanual.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Cefjdemos\Plugin\Content\Cefjdemostoc\Extension\Cefjdemostoc;

return new class () implements ServiceProviderInterface {
    /**
     * Registers the service provider with a DI container.
     *
     * @param   Container  $container  The DI container.
     *
     * @return  void
     *
     * @since   4.3.0
     */
    public function register(Container $container)
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $plugin     = new Cefjdemostoc(
                    $container->get(DispatcherInterface::class),
                    (array) PluginHelper::getPlugin('content', 'cefjdemostoc')
                );
                $plugin->setApplication(Factory::getApplication());

                return $plugin;
            }
        );
    }
};

La Classe di Estensione

Lo scopo del file src/Extension/Cefjdemostoc.php è preparare i dati per l'output. Il file è lungo 91 righe, quindi non viene riprodotto qui. Tuttavia, alcune parti di esso meritano ulteriori spiegazioni.

Direttive Codesniffer

Righe da 16 a 18 hanno questo:

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

Le righe commentate evitano segnalazioni di errori da parte del CodeSniffer. Non hanno altri scopi.

funzione pubblica onContentPrepare()

Questo è l'evento a cui il plugin risponde. Viene passato un contesto, i dati dell'articolo e i parametri dell'articolo. Un Indice dovrebbe essere generato solo se la pagina resa è un singolo articolo. Altrimenti, il segnaposto {cefjdemostoc} deve essere rimosso.

Per generare un indice, alcuni parametri dell'articolo sono impostati e ogni titolo nell'articolo viene modificato per aggiungere un numero di sequenza id, quindi <h2>Introduction</h2> diventa <h2 id="cefjemostoc0">Introduction</h2>. Viene quindi caricata una template per aggiungere l'indice renderizzato.

Il file tmpl/default.php

Lo scopo di questo file è quello di rendere l'output con i dati forniti. Il file può essere sovrascritto e lo vedrai tra le sostituzioni di plugins/contents per il modello Cassiopeia.

Il file è riprodotto di seguito. Nota che alcuni elementi hanno classi CSS hardcoded e alcuni ottenuti dai parametri dell'articolo. Le classi fs- sono dimensioni del carattere di Bootstrap. Le intestazioni sono memorizzate nell'array $headings2.

<?php

/**
 * @package     Cefjdemostoc.Plugin
 * @subpackage  Content.cefjemostoc
 *
 * @copyright   (C) 2024 Clifford E Ford.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;

/**
 * @var Joomla\CMS\WebAsset\WebAssetManager $wa
 * @var \Joomla\Plugin\Content\Cefjdemostoc\Extension\Cefjdemostoc $this
 */
$wa = $this->getApplication()->getDocument()->getWebAssetManager();
$wa->registerAndUseStyle('plg_content_cefjdemostoc', 'plg_content_cefjdemostoc/cefjdemostoc.css');

?>
<div class="card cefjdemostoc <?php echo $toc_class; ?>">
    <div class="card-header">
        <div class="<?php echo $toc_head_class; ?> fs-2">
            <?php echo Text::_('PLG_CONTENT_CEFJDEMOSTOC_CONTENTS'); ?>
        </div>
    </div>
    <div class="card-body">
        <ul class="list-group">
            <?php foreach ($headings2 as $i => $heading) : ?>
                <li class="list-group-item fs-<?php echo $heading[1] + 2; ?> ps-<?php echo $heading[1] + 2; ?>">
                    <a href="#cefjemostoc<?php echo $i; ?>" class="link-underline-light">
                        <?php echo $heading[2]; ?>
                    </a>
                </li>
            <?php endforeach; ?>
        </ul>
    </div>
</div>

Il gestore delle risorse web

Senza ulteriori stili, l'indice dei contenuti (ToC) occuperebbe l'intera larghezza dello schermo nella posizione del segnaposto {cefjemostoc} nel testo originale. Questo a volte si vede nelle pubblicazioni tecniche, ma potrebbe non essere quello che desideri. Su schermi ampi è spesso meglio spostare il ToC e permettere al testo dell'articolo di fluire intorno ad esso. Tuttavia, ciò può diventare inutilizzabile su schermi stretti. La soluzione migliore è fornire un foglio di stile con media query personalizzate. Su schermi ampi il ToC è spostato a destra, ma su schermi stretti non lo è.

Il codice default.php sopra mostra come includere un foglio di stile personalizzato per il plugin. Il CSS si trova nel file media/css/cefjdemostoc.css. I valori lì presenti sono a scopo illustrativo di questo tutorial.

Risultato

The resulting table of contents

Tradotto da openai.com