Elaborare pagine HTML dinamiche con PHP: le basi

Conoscere varie tecniche per elaborare pagine HTML con PHP è fondamentale per creare siti interattivi e con un’elevata User Experience (UX).

A monte è lo User Experience Designer, ma anche il Web Designer (più genericamente), a creare un workflow di animazioni per un ipotetico prototipo di sito web (con strumenti come Figma).

Dopodiché sarà il programmatore, o i programmatori ripartiti in lavori back-end e front-end, a realizzare il sito web effettivo.

PHP è molto utilizzato per creare pagine web dinamiche. Quando ti sarà presentato un prototipo di sito web tu dovrai essere in grado di eseguire quanto viene richiesto.

Le basi partono proprio da qui: conoscere come elaborare una pagina HTML nel migliore dei modi.

In un’articolo futuro vedremo come interfacciare AJAX (Asyncronous Javascript and XML) con file PHP che rispondono a determinate richieste HTTP dell’utente (nel caso di web app o siti con un elevato grado di interattività).

Oggi vedremo alcune tecniche veramente basilari che ogni programmatore junior alle prime armi deve conoscere.

Affronteremo l’elaborazione dell’HTML a partire dalle stringhe, dagli array, da strutture di controllo, da funzioni con parametri e altro.

L’elaborazione dell’HTML tramite PHP può diventare, in determinati casi, un lavoro molto specifico e talvolta complesso. Ad esempio, quando un determinato template deve essere elaborato a partire da decine di variabili.

Il lavoro che toccherà fare a te in autonomia dopo questa guida sarà sperimentare: cercare di arrivare a nuove tecniche di elaborazione dell’HTML sporcandoti le mani.

Elaborare codice HTML a partire da una stringa

singola variabile, generare testo da variabile, heredoc, nowdoc (questi ultimi due come accenno)

Generare HTML a partire da una variabile è la via più semplice.

Ipotizziamo che dobbiamo generare una stringa di testo, esempio un messaggio di errore, a partire da alcune variabili.

<?php

// Prepariamo alcune variabili per costruire la stringa
$codice_errore = '404';
$tipologia_errore = 'pagina non trovata';
$url_corrente = 'https://michelemincone/programmare-senza-php';

// Questa è la stringa da costruire (il messaggio)
$messaggio = '<p>Si è verificato un errore <b class="red">' . $codice_errore . '</b> per <b class="black">' . $tipologia_errore . '</b> sulla pagina: <b class="italic">' . $url_corrente . '</b></p>';

// Stampo su schermo la stringa;
echo $messaggio;

Come vedi ho messo i tag <p></p> in modo tale che contengano la stringa per creare un testo in HTML e i tag <b></b> per mettere in grassetto i testi dati in output dalle variabili.

In più ho incluso l’attributo HTML class per i tag <b>. In modo tale possono modificare il CSS di quel preciso elemento.

Output del codice:

Si è verificato un errore 404 per pagina non trovata sulla pagina: https://michelemincone.com/programmare-senza-php

Cambiando il contenuto delle variabili all’inizio del codice puoi cambiare dinamicamente il contenuto della stringa.

Come vedi per la variabile $messaggio ho utilizzato il classico modo per concatenare i dati delle variabili. Ma avremmo potuto usare tranquillamente i doppi apici evitando il punto per concatenare:


... codice precedente

// Questa è la stringa da costruire (il messaggio)
$messaggio = "<p>Si è verificato un errore <b class="red">{$codice_errore}</b> per <b class="black">{$tipologia_errore}</b> sulla pagina: <b class="italic">{$url_corrente}</b></p>';

... codice successivo

Alternativamente andava bene anche l’heredoc.

Elaborare HTML da un array in PHP con loop foreach

Capita spesso di dover eseguire un loop su un array per generare dell’HTML.

Prendiamo come esempio questo array:

<?php

// Prepariamo l'array
$nomi = ["Michele", "Giovanni", "Marco", "Antonio"];

// Prepariamo una variabile per il template HTML
$html = '';

// Inseriamo nel template un testo introduttivo e prepariamo i tag HTML
$html .= "<p>";
$html .= "Nella nostra classe ci sono: <ul>";

// Eseguiamo un foreach loop dell'array e costruiamo il template
foreach ($nomi as $nome) {
    $html .= "<li>{$nome}</li>";
}

// Chiudiamo gli elementi HTML paragrafo e lista non ordinata
$html .= "</ul>";
$html .= "</p>";

// Stampiamo su schermo la stringa
echo $html;

Creare una struttura HTML da una funzione PHP

Per elaborare una struttura HTML tramite una funzione in PHP possiamo seguire due strade.

Possiamo usare funzioni che mostrano nella pagina web la struttura HTML utilizzando il costrutto echo o funzioni di ritorno che ci permetteranno poi di manipolare la struttura.

In entrambi i casi possiamo utilizzare o no i parametri.

HTML da funzioni PHP

Realizziamo una funzione che stampa su schermo una struttura HTML. Subito dopo il costrutto echo realizziamo una semplice struttura di una sezione header tra doppi apici:

<?php

// Definiamo una funzione che contenga una struttura HTML
function website_header() {
    echo "<header id='header'>
                <div class='logo'><img src='.../logosrc'></div>
                <div class='menu'>
                    <nav>  
                        <ul>
                            <li>Blog</li>
                            <li>Chi siamo</li>
                            <li>Contatti</li>
                            <li>Barra di ricerca</li>
                        </ul>
                    </nav>
                </div>
            </header>";
}

?>

Subito dopo chiamiamo la funzione per ottenere la struttura HTML desiderata, ad esempio in un documento HTML di riferimento:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php website_header(); ?>
</body>
</html>

Visitando la pagina vedrete la struttura HTML contenuta nella funzione che abbiamo appena chiamato.

Possiamo rendere queste funzioni ancor più flessibili aggiungendo dei parametri. Ad esempio, possiamo dinamizzare l’URL del logo e le singole voci del menù.

Dato che per le voci del menu (parametro $menu_items) avremo un array, useremo un foreach loop per costruire i singoli elementi della lista.

In questa funzione, come avrai notato, concateneremo tutto nella variabile $html che inizializziamo all’inizio della funzione:

<?php

function website_header($logo_url, $menu_items) {
    $html = ''; // Inizializza

    $html = "<header id='header'>
                <div class='logo'><img src='{$logo_url}'></div>
                <div class='menu'>
                    <nav>  
                        <ul>";
    
    foreach ($menu_items as $item) {
        $html .= "<li>{$item}</li>";
    }

    $html .= "</ul>
                     </nav>
                     </div>
                     </header>";

    echo $html;
}

?>

Allo stesso modo, chiamiamo la funzione nel punto del documento HTML in cui vogliamo mostrare l’header inserendo come parametri l’URL per l’immagine del logo e le singole voci del menù in un array:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php website_header('https://sitoesempio.com/asset/img/img1.png', array('Blog', 'Chi siamo', 'Contatti', 'Ricerca')); ?>
</body>
</html>

Come risultato avremo sempre l’header di prima ma questa volta possiamo manipolare i dati in modo dinamico.

HTML da funzioni PHP di ritorno

Vediamo come mostrare la stessa struttura HTML con una funzione di ritorno.

<?php


function website_header($logo_url, $menu_items) {
    $html = ''; // Inizializza

    $html = "<header id='header'>
                <div class='logo'><img src='{$logo_url}'></div>
                <div class='menu'>
                    <nav>  
                        <ul>";
    
    foreach ($menu_items as $item) {
        $html .= "<li>{$item}</li>";
    }

    $html .= "</ul>
              </nav>
              </div>
              </header>";

    return $html;    // Al posto di echo usiamo RETURN
}
?>

In questo esempio dobbiamo sostituire il costrutto echo con il costrutto return.

Ora proviamo a chiamare la funzione nello stesso modo di prima:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php website_header('https://sitoesempio.com/asset/img/img1.png', array('Blog', 'Chi siamo', 'Contatti', 'Ricerca')); ?>
</body>
</html>

Visualizzando la pagina non vedremo nulla. Questo perché le funzioni di ritorno servono a passare dei dati senza però essere mostrati direttamente su una pagina web.

Quindi abbiamo due scelte:

  • o affianco alla funzione utilizziamo echo
  • oppure utilizziamo delle funzioni per manipolare l’output della funzione (la struttura HTML) e poi utilizziamo echo.

Quindi la potenza delle funzioni di ritorno sta proprio nella possibilità di manipolare i dati in output e mostrarli soltanto dopo questa operazione.

Ad esempio, posso contenere tutta la struttura HTML in ritorno dalla funzione website_header() in una variabile che possiamo chiamare, ad esempio, $header:

<?php

$header = website_header('https://sitoesempio.com/asset/img/img1.png', array('Blog', 'Chi siamo', 'Contatti', 'Ricerca'));

// Pagina HTML...

In seguito, ad esempio, posso utilizzare un’espressione REGEX per eliminare il menù e rimpiazzarlo con qualsiasi altro contenuto:

<?php

// Codice di prima
$header = website_header('https://sitoesempio.com/asset/img/img1.png', array('Blog', 'Chi siamo', 'Contatti', 'Ricerca'));

// Utilizziamo un'espressione REGEX per togliere il menù cercando i tag <nav></nav>
$$header = preg_replace('/<nav>\s*(.*?)\s*<\/nav>/', 'Menù rimosso', $header);

// Pagina HTML...

L’espressione regex “/<nav>\s*(.*?)\s*<\/nav>/” nella funzione preg_replace andrà a identificare i tag del menù di navigazione e poi andiamo a rimpiazzare tale struttura con una stringa “Menù rimosso“.

Ora vediamo il risultato di questa operazione trasformando i tag HTML in entità leggibili come normali stringhe in modo da apprezzarne la struttura:

//... Codice di prima

echo "<pre>";
var_dump(htmlentities($header));
echo "</pre>";

// Pagina HTML...

Ed ecco il risultato vedendo la pagina:

string(282) "<header id='header'>
                <div class='logo'><img src='https://sitoesempio.com/asset/img/img1.png'></div>
                <div class='menu'>
                    Menù rimosso
              </div>
              </header>"

Abbiamo rimosso con successo il menù di navigazione. Adesso proviamo a mostrare il contenuto manipolato, contenuto nella variabile $header, con il costrutto echo:

<?php

function website_header($logo_url, $menu_items) {
    $html = ''; // Inizializza

    $html = "<header id='header'>
                <div class='logo'><img src='{$logo_url}'></div>
                <div class='menu'>
                    <nav>  
                        <ul>";
    
    foreach ($menu_items as $item) {
        $html .= "<li>{$item}</li>";
    }

    $html .= "</ul>
              </nav>
              </div>
              </header>";

    return $html;
}

$header = website_header('https://sitoesempio.com/asset/img/img1.png', array('Blog', 'Chi siamo', 'Contatti', 'Ricerca'));

$header = preg_replace('/<nav>\s*(.*?)\s*<\/nav>/', 'Menù rimosso', $header);

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
	<?php echo $header;    // Mostriamo l'header manipolato ?>
</body>
</html>

Un altro esempio di manipolazione di una struttura HTML con una funzione di ritorno potrebbe essere quello con la concatenazione.

<?php
// Definiamo la nostra funzione di ritorno
function website_header($logo_url, $menu_items) {
    $html = ''; // Inizializza

    $html = "<header id='header'>
                <div class='logo'><img src='{$logo_url}'></div>
                <div class='menu'>
                    <nav>  
                        <ul>";
    
    foreach ($menu_items as $item) {
        $html .= "<li>{$item}</li>";
    }

    $html .= "</ul>
              </nav>
              </div>
              </header>";

    return $html;
}

// Salviamo l'HTML di ritorno dalla funzione in una variabile $header
$header = website_header('https://sitoesempio.com/asset/img/img1.png', array('Blog', 'Chi siamo', 'Contatti', 'Ricerca'));

// Contenuto da concatenare in una nuova variabile
$bottom_header = "<div>Spedizione gratuita sopra i 50€ di spesa</div>";

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
	<?php 
            // Utilizziamo echo e poi concateniamo $header e $bottom_header
            echo $header . $bottom_header; 
        ?>
</body>
</html>

Quindi una volta definita la funzione di ritorno salviamo il contenuto in una variabile $header inserendo tutti i parametri del caso.

Poi in una variabile $bottom_header inseriamo altro HTML che vogliamo aggiungere al nostro header.

Dopo, nel documento HTML tra tag <body></body>, andiamo a eseguire una concatenazione tra le due variabili.

Se concatenavo prima di $header, ad esempio, una variabile $top_header potevo aggiungere una struttura HTML prima dell’header:

<?php
// CODICE DI PRIMA...


// Aggiungiamo un top_header
$top_header = "<div id='top-header'>
                                <ul>
                                    <li>Accedi</li>
                                    <li>Registrati</li>
                                    <li>Accedi</li>
                                </ul>
                            </div>";

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
	<?php 
            // Utilizziamo echo e poi concateniamo $header e $bottom_header
            echo $top_header . $header . $bottom_header; 
        ?>
</body>
</html>

Ciò che rimane da fare è abbellire la struttura HTML con un po’ di CSS.

Blocchi condizionali PHP e generazione di contenuti HTML

Possiamo realizzare, attraverso una funzione o tramite del codice direttamente su una pagina web, una struttura che si adatta in base a determinate condizioni, ad esempio:

  • mostra un paragrafo o altro contenuto se l’utente ha effettuato l’accesso o meno
  • mostra un prodotto specifico in base agli acquisti effettuati da un utente
  • reindirizza l’utente alla thank you page dopo aver effettuato un ordine sul tuo eCommerce
  • e molto molto altro.

Quindi i blocchi condizionali if, if else, if else if ci permettono distribuire i contenuti HTML in modo specifico e sotto determinate condizioni.

Ecco un esempio molto semplificato:

<?php

$html = "";    // Inizializziamo una variabile $html

$eta_utente = 27;    // Variabile "età" per mostrare contenuti HTML in modo condizionale

// La nostra struttura HTML
$html .= "<div id='primary'>";
	
    // Defianiamo una condizione in base all'età dell'utente
    if ($eta_utente >= 18) {
        $html .= "<div id='prodotto-numero-1' class='content card'>";
        	$html .= "<div class='card-image'>";
            	$html .= "<img src='' alt=''>";
            $html .= "</div>";
            
            $html .= "<div class='card-title'>";
            	$html .= "<h4>Prodotto numero 1</h4>";
            $html .= "</div>";
            
            $html .= "<div class='card-desc'>";
            	$html .= "<p>Descrizione prodotto</p>";
            $html .= "</div>";
            
            $html .= "<div class='card-add-to-cart'>";
            	$html .= "<button>Aggiungi al carrello</button>";
            $html .= "</div>";
        $html .= "</div>";
    } else {
        $html .= "<h1>Non hai il permesso di accedere a questo sito web</h1>";
        $html .= "<p>Solo chi ha 18 anni o più può visualizzare i contenuti di questo sito web</p>";
    }

$html .= "</div>";

// Mostriamo l'intera struttura HTML
echo $html;

?>

Inizializziamo una variabile $html e poi definiamo un’età di esempio in un’altra variabile $eta_utente.

In seguito costruiamo una struttura HTML con un blocco if-else con una condizione in base all’età dell’utente.

Infine mostriamo il contenuto con echo.

Naturalmente si tratta di un esempio molto semplificato. Potremmo estendere questo codice con l’utilizzo delle variabili globali $_SESSION, $_POST e $_GET per avere un codice che si avvicini di più ad un esempio reale e utente-centrico.

Contenere template HTML nelle variabili e manipolare il contenuto

nowdoc, heredoc, variabile semplice, concatenazione e manipolazione del contenuto (esempio rimuovi parole offensive)

In PHP possiamo contenere qualsiasi struttura HTML all’interno di semplici variabili:

<?php

// Definiamo dei markup HTML nelle variabili
$apertura_div = "<div class='container main-section'>";
$chiusura_div = "</div>";

$titolo = "<h1>Ciao, benvenuto sul nostro sito web</h1>";
$sottotitolo = "<p>Esplora tutti i nostri servizi e contattaci per ottenere maggiori informazioni</p>";
$listaservizi = "<ul>
                                <li>Realizzazione siti web</li>
                                <li>Realizzazione siti eCommerce</li>
                                <li>Realizzazione Applicazioni Mobile</li>
                                <li>Realizzazione Web Applications</li>
                                <li>Realizzazione Siti Web Aziendali</li>
                                <li>Realizzazione Portali</li>
                            </ul>";

In seguito posso concatenare queste variabili per comporre una struttura HTML:

// Variabili di prima...

// Concateniamo le variabili
echo $apertura_div .
              $titolo .
              $sottotitolo .
              $listaservizi .
          $chiusura_div;

?>

Visualizzando la pagina otterrai questo risultato:

struttura html a partire da markup html nelle variabili php concatenandole

Rimuovere parole offensive da una variabile che contiene codice HTML

Nel caso dei forum e dei commenti è fondamentale avere un sistema per rimuovere determinate parole che possono risultare offensive.

Qui sotto ho definito in una variabile array di $parole_proibite la lista di parole che voglio eliminare dal contenuto in $post per poterle rimpiazzare con un’altra stringa tramite la funzione str_ireplace():

<?php

$parole_proibite = ['Lorem', 'dolor', 'enim', 'anim', 'laborum'];

$post = "<div id='post-1' class='card post'>
			<h2>Nuovo post da user #8495</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 				tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 			 quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 				consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 				cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 			  proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
		 </div>";
         
$post = str_ireplace($parole_proibite, '<b>#/****</b>', $post);

echo $post;

?>

Risultato:

filtrare parole con funzione str_ireplace()

Nota bene: utilizziamo la funzione str_ireplace e non str_replace perché vogliamo che tutte le parole indicate nell’array vengano rimosse a prescindere dal tipo di carattere maiuscolo o minuscolo.

Heredoc e Nowdoc

Posso contenere delle strutture HTML anche con la sintassi heredoc e nowdoc.

Partiamo con la sintassi heredoc che equivale alla sintassi a doppi apici dove possiamo inserire direttamente delle variabili, ma in questo caso non abbiamo bisogno di effettuare l’escape di singoli o doppi apici:

<?php

$titolo = "Il mio titolo";
$paragrafo = "Paragrafo";

$heredoc = <<<HTML
<div>
    <h1>{$titolo}</h1>
    <p>{$paragrafo}</p>
</div>
HTML;

echo $heredoc;

?>

In questo esempio ho definito due variabili, $titolo e $paragrafo, che poi vado a inserire nella stringa heredoc. Infine mostro il risultato con echo.

Con il nowdoc invece non posso inserire delle variabili nel contenuto, quindi va usata con delle strutture HTML predefinite:

<?php

$titolo = "Il mio titolo";
$paragrafo = "Paragrafo";

$heredoc = <<<'HTML'
<div>
	<h1>{$titolo}</h1>
    <p>{$paragrafo}</p>
</div>
HTML;

echo $heredoc;

?>

Se volessi modificare il contenuto HTML dovrei utilizzare uno str_replace() per inserire il contenuto desiderato.

Nota bene: l’heredoc inizia con <<<TEXT e finisce con TEXT;, il nowdoc ha i singoli apici all’inizio <<<'TEXT' e finisce semplicemente con TEXT;

Conclusioni non conclusive

In realtà i modi per generare codice HTML o intere pagine tramite PHP possono essere molteplici, con gradi di difficoltà diversi e comprendere numerose variabili.

Io vi ho mostrato le vie più semplici e alcuni esempi avevano qualche grado di difficoltà in più degli altri.

Nella mia esperienza e su alcuni progetti che ho sviluppato in locale, i modi con cui ho affrontato la generazione dell’HTML con PHP erano veramente molti.

Ogni modo era diverso in base al progetto in casi specifici, perché cambiava la complessità e la natura del progetto web.

In ogni caso, PHP serve proprio a questo!

Quindi sbizzarrisciti anche tu a scoprire ulteriori modi oltre a quelli che ti ho mostrato.

Questo esercizio ti sarà utile per uscire dalla tua zona di comfort, sviluppare il tuo modo di scrivere il codice in determinati modi e imparare a sperimentare piuttosto che copiare e vedere video su YouTube continuamente.

A presto, da qui è tutto.

Michele.