Skip to main content

Come leggere dati dal database usando le API di Joomla

| Gianluca Gabella | Joomla!
share on facebook share on twitter share on linkedin

Index:


Scopri come recuperare dati dal database di Joomla partendo da un semplice form HTML inserito tramite il plugin Sourcerer. Guida passo-passo su come creare un form per la ricerca di articoli e gestire la richiesta con codice PHP usando le API di Joomla.

Come tutti i CMS Joomla! viene principalmente utilizzato per fare siti web vetrina, blog e, in alcuni casi, per interfacciare l'utente con funzionalità più avanzate come e-commerce, forum ecc...

In realtà Joomla! è molto di più! In pochi semplici passi è possibile utilizzare il nostro amato CMS per leggere/scrivere su database, per fare ricerche avanzate o per chiamare funzioni o API esterne: l'unico limite è l'immaginazione!

Ecco un riassunto veloce di quello che andremo a fare, passo passo:

  1. Installazione del plugin "Sourcerer": ci servirà per poter scrivere HTML e PHP nei nostri articoli
  2. Creazione di un form dove andremo a settare gli input che veranno processati dalla nostra query
  3. Creazione di una pagina di "atterraggio" dove creare la query e stampare i risultati

Installiamo e configuriamo "Sourcerer"

Il plugin "Sourceror" è uno dei più utilizzati in ambito Joomla! perchè permette di scrivere codice (PHP, Javascript, CSS, ecc..) direttamente negli articoli/moduli senza preoccuparsi di abilitare/disabilitare filtri di sicurezza e senza aver paura di perdere la formattazione del nostro codice a casa dell'editor utilizzato. Vediamo passo passo come installarlo e configurarlo:

  1. Scaricare il plugin dal sito ufficiale: https://regularlabs.com/sourcerer (va benissimo la versione gratuita)
  2. Installiamo il plugin nel nostro Joomla! nello stesso modo di tutte le altre estensioni:
    1. Menu di sinistra -> sistema
    2. Blocco "installa" -> "Estensioni"
    3. Clicchiamo su "carica file pacchetto" e installiamo il file ZIP che abbiamo appena scaricato dal sito ufficiale

Non c'è bisogno di  configurare nulla, il plugin sarà già attivo e funzionante appena installato

Creiamo un semplice form dove andremo ad inserire gli input che ci interessa cercare nel database

Andiamo in gestione articoli e creiamo un nuovo articolo, possiamo intitolarlo "form di ricerca".

All'interno del testo clicchiamo sul pulsante "CMS CONTENT" -> "CODE" nel caso stiate usando TinyMCE oppure sul pulsante "CODE" in basso sotto l'editor nel caso stiate usando JCE.

Una volta cliccato si aprirà un modale dove poter inserire il codice.

Incolliamo il codice qui sotto:

<form action="index.php?option=com_content&view=article&id=ID_ARTICOLO_TARGET" method="post">
    <label for="title">Titolo:</label>
    <input type="text" id="title" name="title">
    <button type="submit">Cerca</button>
</form>

Come vedete nell'action c'è un placeholder: ID_ARTICOLO_TARGET, è normale. Per il momento lasciamolo così com'è.

A questo punto, per comodità, agganciamo l'articolo appena creato ad una voce di menù: può essere nel vostro menù principale o in un menù nascosto, come preferite.

Per farlo basta semplicemente creare una nuova voce di menù di tipo "singolo articolo" e selezionare l'articolo appena creato.

La pagina creatà dovrebbe risultare grossomodo così:

form di ricerca standard

NOTA BENE: questo form di ricerca può essere inserito anche all'interno di un modulo, non deve essere per forza all'interno di un articolo. I passaggi sono gli stessi!

Creiamo una pagina di "atterraggio" che vada ad effettuare la ricerca

Ok, siamo arrivati a metà strada: abbiamo creato il form di partenza, ci serve la pagina di atterraggio per il nostro form.

Molto semplicemente creiamo un nuovo articolo e lo intitoliamo "risultati ricerca" e inseriamo il seguente codice sempre attraverso il pulsante "CODE" di Sourcerer:

<?php
defined('_JEXEC') or die;

// Ottieni il valore del titolo dal POST
$title = JFactory::getApplication()->input->post->get('title', '', 'STRING');

if ($title) {
    // Inizializza il database di Joomla
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);

    // Costruisci la query per cercare gli articoli con il titolo corrispondente
    $query->select($db->quoteName(array('id', 'title', 'introtext')))
          ->from($db->quoteName('#__content'))
          ->where($db->quoteName('title') . ' LIKE ' . $db->quote('%' . $title . '%'));

    $db->setQuery($query);
    $results = $db->loadObjectList();

    // Mostra i risultati
    if ($results) {
        echo '<h2>Risultati della ricerca:</h2>';
        echo '<ul>';
        foreach ($results as $article) {
            echo '<li><a href="/en/pixed-blog/joomla/'%20.%20$article--?gt;id___'=">' . $article->title . '</a></li>';
        }
        echo '</ul>';
    } else {
        echo '<p>Nessun articolo trovato con il titolo "' . htmlspecialchars($title) . '"</p>';
    }
} else {
    echo '<p>Inserisci un titolo per la ricerca.</p>';
}
?>

 Ok è un bel pezzo di codice, ma NIENTE PANICO! Andiamo a capire passo passo di cosa si tratta e come funziona:

  • Innanzitutto si tratta di codice PHP: questo linguaggio di programmazione è quello usato da Joomla! per funzionare. Il nostro CMS è scritto con questo linguaggio quindi è necessario conoscerlo un minimo se si vuole andare a lavorare con il core.
  • defined('_JEXEC') or die; : questa prima istruzione serve a controllare di star lavorando effettivamente all'interno dell'ambiente Joomla! Questo impedisce al codice di essere utilizzato da altre parti o di essere richiamato da sorgenti esterne al CMS (quindi per esempio da bot, hacker, ecc..)
  • $title = JFactory::getApplication()->input->post->get('title', '', 'STRING'); :  questo pezzo di codice ci serve per recuperare il dato che abbiamo inviato con il form tramite POST.

Prima di andare avanti cerchiamo però di capire cos'è esattamente un form e come funziona.


Come funziona un form HTML?

Un form HTML è uno strumento essenziale per raccogliere dati dagli utenti e inviarli a un server (tramite un'altra pagina o un indirizzo raggiungibile) per l'elaborazione. I dati del form possono essere trasmessi utilizzando due metodi HTTP: POST e GET. Questi metodi determinano come i dati vengono inviati e gestiti.

Metodo POST:
Quando si utilizza il metodo POST, i dati del form vengono inviati nel corpo della richiesta HTTP. Questo metodo è ideale per inviare dati sensibili o di grandi dimensioni, poiché non appaiono nell'URL del browser, garantendo una maggiore sicurezza e riservatezza. Inoltre, POST non ha limiti significativi sulla quantità di dati che possono essere inviati. Questo metodo è comunemente usato per operazioni che modificano lo stato del server, come la creazione di un nuovo record in un database.

Metodo GET:
Con il metodo GET, i dati del form vengono aggiunti all'URL della richiesta HTTP come parametri di query. Questo metodo è adatto per richieste a database e di lettura, come la ricerca di informazioni, dove i dati inviati sono generalmente piccoli e non sensibili. Un vantaggio del metodo GET è che le richieste possono essere facilmente condivise e memorizzate nei segnalibri, poiché i parametri sono visibili nell'URL. Tuttavia, GET ha limitazioni sulla lunghezza dell'URL e non è sicuro per trasmettere informazioni riservate.

I dati raccolti da tutti gli input del form vengono quindi inviati ad una pagina (specificata nell'attributo action del form) tramite GET o POST e nella pagina di destinazione possono quindi essere elaborati.


 Ciò detto  possiamo continuare con l'analisi del nostro codice PHP:

  • $db = JFactory::getDbo(); : tutto il codice che parte da qui in avanti è quello che serve per la costruzione della query al database. Maggiori informazioni possono essere trovate qui

Ma partiamo dalle basi.

Cos'è una query?

Una query, in termini semplici, è una richiesta di informazioni fatta ad un database. Immagina un database come una grande libreria organizzata, dove ogni libro è un insieme di dati. Una query è come chiedere al bibliotecario di trovarti tutti i libri che soddisfano certi criteri, per esempio "tutti i libri scritti da J.K. Rowling" o "tutti i libri pubblicati nel 2020". Una query può essere utilizzata non solo per leggere, ma anche per inserire o modificare dati all'interno del database. Diciamo quindi che si tratta di un sistema di comunicazione a due vie tra noi (utenti/programmi) ed un database SQL.

Cosa sono "select", "from" e "where"?

"SELECT", "FROM" e "WHERE" sono parole chiave fondamentali del linguaggio SQL (Structured Query Language), utilizzato per interagire con i database. Ecco cosa significano e come vengono utilizzate:

  •  La parola chiave "SELECT" viene utilizzata per indicare quali colonne di dati vuoi ottenere dal database.
  •  La parola chiave "FROM" specifica da quale tabella vuoi ottenere i dati.
  • .La parola chiave "WHERE" viene utilizzata per filtrare i dati in base a determinate condizioni.

Combinando queste parole chiave, si crea una query completa. Ecco un esempio di una query SQL che utilizza tutte e tre le parole chiave:
SELECT nome, cognome
FROM utenti
WHERE età > 30;

Questa query significa: "Seleziona i dati delle colonne 'nome' e 'cognome' dalla tabella 'utenti' dove l'età è maggiore di 30".

Nel nostro caso cosa andiamo a cercare? E in che modo?

Questo è il pezzo di codice che effettua la nostra query:

$query->select($db->quoteName(array('id', 'title', 'introtext')))
          ->from($db->quoteName('#__content'))
          ->where($db->quoteName('title') . ' LIKE ' . $db->quote('%' . $title . '%'));

 Possiamo tradurla come 'seleziona i dati nelle colonne "id", "title" e "introtext" nella tabella "#__content" però solo se nel "title" è contenuto quello che ti ho passato in input, e salvato dentro la variabile $title'

Tenete a mente che la tabella #__content è scritta in questo modo perchè tutte le tabelle di Joomla hanno un prefisso random, quindi questo placeholder server per rendere universale questa query.

Una volta tirati fuori i dati cosa succede?

Per come è fatta una query su Joomla! i dati vengono tutti immagazzinati dentro una variabile chiamata $results che può poi essere manipolata con PHP per avere un output strutturato. Nel nostro esempio i dati dentro $results sono iterati con foreach e vengono stampati tramite un echo.

Testiamo il nostro sistema!

Ci siamo! E' arrivato il momento di testare il nostro piccolo sistema di interrogazione del database.

Per prima cosa dobbiamo annotarci l'ID dell'articolo dove abbiamo inserito il codice con la query (l'articolo "risultati di ricerca" diciamo). Lo troviamo nell'ultima colonna nella lista degli articoli:

 

come trovare l'id nella lista articoli

e lo andiamo a mettere nel codice del primo articolo, quello dove abbiamo inserito il form HTML nella riga dove c'è l'attributo "action":

<form action="index.php?option=com_content&view=article&id=ID_ARTICOLO_TARGET" method="post">

nel nostro caso diventa:

<form action="index.php?option=com_content&view=article&id=167" method="post">

 chiudiamo e salviamo l'articolo dal backend e andiamoci da frontend. 

Se tutto è andato a buon fine se scrivete qualcosa nell'input e cliccate su "cerca" dovreste arrivare nell'articolo "risultati di ricerca" e nell'output dovrebbe esserci la lista degli articoli di joomla che hanno il vostro input nel titolo:

test di ricerca

ed ecco il risultato:

risultati della query

Conclusioni

Bene, abbiamo capito come fare una query al database di Joomla e tirare fuori dei risultati. La domanda che sorge spontanea ora è: "ok ma quindi? Cosa mi serve? Non posso usare la semplice ricerca di Joomla?

Certo, se devi solo cercare nel titolo e nel testo. Ma se devi cercare per esempio tutti gli articoli di un utente? O gli articoli solo dal 12 giugno 2017 al 20 settembre 2020? Se devi cercare solo gli articoli che hanno un determinato valore in un custom field?

Per farlo hai bisogno di query ad hoc! E con questo sistema puoi crearti tutte le query che vuoi!

Ecco qualche esempio che potrebbe esserti utile per le tue query. Ricorda che tutti i "where" vanno aggiunti uno sotto l'altro, in questo modo:

$query->select($db->quoteName(array('id', 'title', 'introtext')))
          ->from($db->quoteName('#__content'))
          ->where($db->quoteName('title') . ' LIKE ' . $db->quote('%' . $title . '%'))
          ->where($db->quoteName('state') . ' = 1');
  • Selezionare solo gli articoli pubblicati (ignorando quelli spubblicati, cestinati, ecc...):
->where($db->quoteName('state') . ' = 1');
  • Selezionare solo da una data ad un'altra di pubblicazione:

Aggiungere all'inizio del PHP per prendere i parametri "start_date" e "end_date" dall'URL:

$startDate = JFactory::getApplication()->input->post->get('start_date', '', 'STRING');
$endDate = JFactory::getApplication()->input->post->get('end_date', '', 'STRING');

e alla query:

->where($db->quoteName('publish_up') . ' >= ' . $db->quote($startDate))
->where($db->quoteName('publish_up') . ' <= ' . $db->quote($endDate));
  •  Selezionare solo se il valore del campo aggiuntivo di ID XXX è uguale al valore YYY preso dall'URL

Aggiungere all'inizio del PHP per sapere quale dev'essere il valore che mi serve per la query.

$fieldValue = JFactory::getApplication()->input->post->get('field_value', '', 'STRING');

 a questo punto mi creo una query che comprenda una join con la tabella dei campi aggiuntivi:

$query->select($db->quoteName(array('c.id', 'c.title', 'c.introtext')))
          ->from($db->quoteName('#__content', 'c'))
          ->join('INNER', $db->quoteName('#__fields_values', 'fv') . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('fv.item_id'))
          ->where($db->quoteName('c.title') . ' LIKE ' . $db->quote('%' . $title . '%'))
          ->where($db->quoteName('fv.field_id') . ' = XXX')
          ->where($db->quoteName('fv.value') . ' = ' . $db->quote($fieldValue));

Dove XXX è l'ID del campo aggiuntivo che volete controllare, lo trovate come per gli articoli nella lista dei campi aggiuntivi.


Se questo articolo ti è stato utile lascia un feedback!

Ti è stato utile questo articolo?

Come mai?

Ogni feedback è assolutamente benvenuto!

If you liked this article, please share it!

share on facebook share on twitter share on linkedin
condividi su Facebookcondividi su Twittercondividi su LinkedIncondividi su WhatsAppcondividi su Telegram