Skip to main content

Collegamento di librerie PHP di terze parti in Joomla

20 Gennaio 2025
Autore: Sergey Tolkachyov
Tradotto da: Pietro Strada
Link originale: https://magazine.joomla.org/all-issues/january-2025/connecting-third-party-php-libraries-in-joomla
Collegamento di librerie PHP di terze parti in Joomla

Quando si sviluppano siti Web o estensioni per Joomla, a volte sorgono attività che sono già state risolte da qualcuno. Nel mondo dello sviluppo, tali soluzioni sono progettate come librerie - insiemi di file e classi che consentono semplicemente di collegarli allo script e utilizzare codice scritto e ben testato da altri sviluppatori. Queste possono essere librerie php per l'elaborazione delle immagini, lavorare con PDF, connettersi a servizi di terze parti tramite l'API REST e molto altro ancora.

Le librerie PHP sono convenienti perché sono accessibili da qualsiasi punto dell'Applicazione: Questo articolo spiega come collegare correttamente un SDK PHP di terze parti al tuo progetto.

Composer

Joomla non supporta direttamente il lavoro con Composer. Per utilizzare la libreria nel tuo lavoro, devi "includerla" in un tipo di estensione Joomla chiamato library e installarlo. Nei progetti seri, viene adottato l'approccio di fissare le versioni di tutti i componenti del progetto: il codice viene controllato più di una volta, testato e abilitato a lavorare in produzione.

Crei un pacchetto con la tua libreria, e installalo ovunque ne hai bisogno. Man mano che vengono rilasciate nuove versioni della libreria, aggiorni il tuo wrapper e ottieni tutti i vantaggi di lavorare con le estensioni di Joomla: aggiornare le estensioni in modo standard, anche attraverso la CLI, visualizzare il Changelog dell'estensione nell'area di amministrazione PRIMA dell'aggiornamento, ecc.

Visualizzare l'estensione Changelog nell'area di amministrazione PRIMA dell'aggiornamento a Joomla 5.

Visualizza l'estensione Changelog nell'area di amministrazione PRIMA dell'aggiornamento a Joomla 5.

Joomla, PSR, Symfony

Joomla è conforme agli standard PSR, quindi è conveniente lavorare con esso in questo senso. Alcuni pacchetti Symfony sono inclusi nel core di Joomla (console, string, vardumper, yaml, error-handler e altri), quindi se decidi di aggiungerne altri, si adatteranno e funzioneranno bene. Puoi vedere cos'altro vale in Joomla oltre ai componenti Symfony in libraries/vendor.

Come includere una libreria PHP di terze parti in un'estensione Joomla?

Niente di complicato. I file della libreria si trovano di solito nel folder src. Accanto a questa cartella, è necessario creare un file XML manifest dell'estensione Joomla in base alla documentazione (manual.joomla.org). Poi compattiamo tutto in un archivio zip e abbiamo terminato! Può essere installato.

Se è necessario disporre di tabelle proprie nel database affinché la libreria funzioni, è necessario aggiungere i file necessari con query SQL durante l'installazione o l'aggiornamento. Poiché Joomla 4+ funziona con i namespaces, è importante specificare questo spazio dei nomi nel manifesto XML per l'estensione. Ecco un esempio abbreviato di un file XML manifest per la libreria Joomla.

<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" method="upgrade">
     <name>WebTolk AmoCRM library</name>
     <libraryname>Webtolk/Amocrm</libraryname>
     <version>1.2.1</version>
     ...
     <namespace path="src">Webtolk\Amocrm</namespace>
     <files>
          <folder>src</folder>
          <filename>amocrm.xml</filename>
     </files>
</extension>

Il tag <libraryname> significa che la cartella src dal nostro archivio verrà copiata in JPATH_SITE/libraries/Webtolk/Amocrm. Nella sezione <files>, indichiamo cosa deve essere compilato dall'archivio. E <namespace path="src">Webtolk\Amocrm</namespace> indica che il namespace Webtolk\Amocrm deve essere registrato per la cartella src in JPATH_SITE/libraries/Webtolk/Amocrm.

Note importanti!

Prima di Joomla 4.2.7, infatti, il tag namespace del file manifest XML non funzionava. Pertanto, era necessario aggiungere un plugin di sistema al pacchetto della libreria che registrasse lo spazio dei nomi sul file al verificarsi dell'evento onAfterInitialize (Event Dispatcher) utilizzando la classe JLoader. Di conseguenza, era necessario creare un pacchetto dalla libreria e dal plugin. A partire da Joomla 4.2.7, questo limite è stato risolto e puoi fare a meno del plugin.

Finora, l'aggiornamento della libreria = reinstallazione. Cioè, l'estensione viene rimossa e installata. Questa decisione è stata presa da qualche parte nelle profondità delle versioni di Joomla 3.x. Perché? - nascosto sotto le montagne di PR. Sono necessarie ulteriori ricerche per scoprire le ragioni per prendere tale decisione. Perché questo è importante? Perché quando si installa qualsiasi estensione, viene creata una voce nel "registro" delle estensioni - nel database e nella tabella #__extensions. Questa tabella ha 2 colonne di tipo TEXT - params e custom_data. E questa, dovete ammetterlo, è una notevole quantità di dati. Se si memorizzano alcuni parametri della libreria in un database utilizzando Joomla\CMS\Helper\LibraryHelper, quindi è necessario tenere conto di questo comportamento del programma di installazione e pre-salvare e quindi aggiungere nuovamente i parametri salvati allo script del programma di installazione dell'estensione durante l'aggiornamento della libreria.

<?php
use Joomla\CMS\Helper\LibraryHelper;
use Joomla\CMS\Cache\Cache;

/**
 * Function called before extension installation/update/removal procedure commences.
 *
 * @param   string            $type     The type of change (install or discover_install, update, uninstall)
 * @param   InstallerAdapter  $adapter  The adapter calling this method
 *
 * @return  boolean  True on success
 *
 * @since   1.0.0
 */
public function preflight(string $type, InstallerAdapter $adapter): bool
{
    if ($type == 'uninstall')
    {
        return true;
    }

    /**
     *
     *  Joomla when updating extensions of the library type, it actually deletes them (along with the data in the database),
     *  and then installs it again.
     *  In order to avoid losing library data from the database, we are writing this crutch.
     *
     * @see https://github.com/joomla/joomla-cms/issues/39360
     *
     */

    if ($type == 'update')
    {
        $lib_params = LibraryHelper::getParams('Webtolk/Amocrm');
        $jconfig    = $this->app->getConfig();
        $options    = [
            'defaultgroup' => 'wt_amo_crm_temp',
            'caching'      => true,
            'cachebase'    => $jconfig->get('cache_path'),
            'storage'      => $jconfig->get('cache_handler'),
        ];
        $cache      = Cache::getInstance('', $options);
        $cache->store($lib_params, 'wt_amo_crm_temp');

    }

    return true;

}

Affinché la libreria funzioni, deve essere abilitata nel gestore estensioni (Menu - Sistema - Gestione - Estensioni).

Spesso, per far funzionare la libreria sono necessari determinati parametri (chiavi API, token, ecc.), che devono essere specificati nell'area di amministrazione di Joomla. Per questo scopo, è conveniente scrivere un plugin (un tipo di estensione library non dispone di una propria interfaccia per la configurazione dei parametri). Non importa se si tratta di quello di sistema o del tuo gruppo personalizzato. All'interno della tua libreria, puoi ottenere i parametri del plugin abbastanza rapidamente, in questo modo:

<?php
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Registry\Registry;

if (PluginHelper::isEnabled('system', 'wt_amocrm'))
   {
      $plugin        = PluginHelper::getPlugin('system', 'wt_amocrm');
      $params        = \json_decode($plugin->params);
      $param = $params->param;
      // OR you can use Joomla\Registry\Registry
      $params = new Registry($plugin->params);
      $param = $params->get('param', 'defatul value if empty');
   }

Questo articolo è stato originariamente pubblicato in russo su habr.com e sul sito web dell'autore. Poi tradotto in inglese e pubblicato su dev.to.

Alcuni articoli pubblicati sul Joomla Community Magazine rappresentano l'opinione personale o l'esperienza dell'Autore sull'argomento specifico e potrebbero non essere allineati alla posizione ufficiale del Progetto Joomla