Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gestire i template di pagina

PHP ed FTP. In questo capitolo vedremo come creare un template di pagina per i nostri post e come gestirlo dinamicamente con PHP.
PHP ed FTP. In questo capitolo vedremo come creare un template di pagina per i nostri post e come gestirlo dinamicamente con PHP.
Link copiato negli appunti

Nel nostro sito statico sia le pagine che i post sono normali file HTML. Di conseguenza dobbiamo creare uno o più template HTML di base che avranno al loro interno dei segnaposto (come ad esempio {segnaposto}) che verranno sostituiti dinamicamente da PHP con i valori effettivi.

Template e segnaposto

Per esempio il template di base dei nostri post, che chiameremo template-post (l'estensione non è necessaria in quanto si tratta comunque di file testuali) potrebbe avere i seguenti contenuti.

<!DOCTYPE html>
<html>
<head>
<title>{title}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{description}">
<link rel="stylesheet" href="/assets/css/style.css" type="text/css" media="screen">
</head>
<body>
<main id="site">
        <header id="site-header">
                <h2 id="site-title">Sito</h2>
                <nav id="site-navigation"><!--...--></nav>
        </header>
        <section id="site-contents">
                <article class="post">
                        <header>
                                <h1>{title}</h1>
                                <p><time>{post_date}</time></p>
                        </header>
                        <div class="post-content">
                              {post_content}
                        </div>
                </article>
        </section>
        <footer id="site-info">
            <!--...-->
        </footer>
</main>
</body>
</html>

I segnaposto che andranno sostituiti sono:

  1. {title}: il titolo del post;
  2. {description}: la descrizione SEO del post;
  3. {post_date}: il formato della data di pubblicazione;
  4. {post_content}: il contenuto HTML del post.

La classe PHP

A questo punto possiamo implementare una classe che, dato un array di variabili, effettua la sostituzione dei segnaposto e crea il file HTML finale. Useremo la funzione str_replace() perché si tratta di sostituzioni semplici che non necessitano delle espressioni regolari.

class Template {
    const TEMPLATE_DIR = '/templates/';
    public static function parse($data = []) {
        if(count($data) === 0) {
            return '';
        }
        $file = $_SERVER['DOCUMENT_ROOT'] . self::TEMPLATE_DIR . 'template-post';
        $html = file_get_contents($file);
        $variables = ['{{title}}', '{{description}}',
                    '{{post_date}}', '{{post_content}}'];
        $html_content = str_replace($variables, $data, $html);
        return $html_content;
    }
    public static function save($data = [], $filename = 'post.html') {
        $html = self::parse($data);
        if(!empty($html)) {
            file_put_contents( $_SERVER['DOCUMENT_ROOT'] . '/' . $filename, $html);
        }
    }
}

Definiamo come costante il percorso della directory dove si trovano i nostri template. Quindi leggiamo come stringa il contenuto del template ed effettuiamo le sostituzioni restituendo la stringa HTML finale.

Quindi il metodo Template::save() crea il file di destinazione utilizzando la funzione file_put_contents().

Prestiamo attenzione al nome del file. Solitamente si usa come nome la versione abbreviata del titolo del post, ossia il suo slug. Quindi se il titolo fosse "Lorem ipsum dolor", lo slug sarebbe lorem-ipsum-dolor. Di conseguenza nel nostro caso avremo che il post sarebbe raggiungibile online attraverso l'URL https://sito.tld/lorem-ipsum-dolor.html oppure https://sito.tld/post.html qualora non avessimo specificato il valore del parametro $filename.

In alcuni casi, tuttavia, si preferisce avere un URL basato sulle directory, ossia https://sito.tld/lorem-ipsum-dolor/. In questo caso, sfruttando l'indicizzazione delle directory da parte del web server, il nome del file dovrà sempre essere index.html mentre per la directory useremo lo slug del post. In tal caso occorre prima creare la directory e poi salvare il file.

public static function saveWithDir($data = [], $slug = 'post') {
        $html = self::parse($data);
        if(!empty($html)) {
          $dest = $_SERVER['DOCUMENT_ROOT'] . '/' . $slug;
          if(!file_exists($dest)) {
              mkdir($dest, 0755);
          }
            file_put_contents( $dest . '/index.html', $html);
        }
    }

Una caratteristica interessante della funzione mkdir() è che accetta un terzo parametro booleano che indica se il path fornito come primo argomento preveda o meno la creazione di un albero di directory. Se infatti volete ottenere un URL strutturato come https://sito.tld/anno/mese/giorno/slug/ ossia una serie di directory annidate, potete usare una soluzione simile alla seguente.

public static function saveWithDir($data = [], $slug = 'post') {
        $html = self::parse($data);
        if(!empty($html)) {
          $dest = $_SERVER['DOCUMENT_ROOT'] . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/' . $slug;
          if(!file_exists($dest)) {
              mkdir($dest, 0755, true);
          }
            file_put_contents( $dest . '/index.html', $html);
        }
    }

Quando si creano file e directory è sempre opportuno effettuare dei test di lettura e scrittura sul proprio spazio web. Infatti la funzione mkdir(), ad esempio, restituisce un Warning se non si hanno i permessi necessari per poter creare file e directory nel percorso specificato. In locale il discorso è il medesimo, ossia bisogna verificare che PHP possa scrivere in una determinata directory.

Dato che PHP dipende direttamente dal web server utilizzato, è necessario che l'applicativo abbia i giusti permessi di lettura e scrittura. Su Windows e MacOS il problema viene risolto utilizzando ambienti LAMP/LEMP come Ampps o MAMP, su Linux spesso è sufficiente creare il proprio spazio web sotto la directory predefinita per tale scopo (solitamente /var/www).

Conclusione

In questo capitolo abbiamo visto come sia semplice creare e gestire dei template HTML con PHP. Nei prossimi capitoli vedremo come creare i dati per popolare i template.

Ti consigliamo anche