Come promesso nella scorsa puntata, oggi vedremo come adattare Twitter Bootstrap alla nostra applicazione, donandole un aspetto professionale, usabile, adattabile a più dispositivi.
Twitter Bootstrap
Come i nostri lettori ricorderanno, in passato ci siamo già occupati di Twitter Bootstrap, rimandiamo dunque a quegli articoli per un’introduzione più generale e qualche dettaglio tecnico. Riassumiamo qui solamente le motivazioni che ci hanno spinto verso l’utilizzo di un CSS Framework, e di Twitter Bootstrap in particolare:
- velocizza enormemente la creazione di una web application, perché fornisce stili e convenzioni già pronti, ben disegnati, personalizzabili ma soprattutto… che non vanno creati da zero!
- aiuta a strutturare meglio il codice HTML, che sarà più corretto semanticamente e di conseguenza più SEO-friendly (ottimizzato per i motori di ricerca);
- se scelto bene e utilizzato correttamente, permette di mantenere un codice molto pulito e facilmente modificabile in futuro, qualora si vogliano re-implementare da zero tutti gli stili o si voglia passare ad un altro CSS Framework;
- le caratteristiche di responsive web design permettono di adattare la visualizzazione, senza modifiche al codice, a display mobile come tablet, cellulari, eccetera;
- ha una grandissima base di utilizzatori ed è attivamente sviluppato e migliorato.
Vediamo quindi come adatteremo il framework alla struttura della nostra applicazione. Come ricorderete, abbiamo creato un template generico, che verrà richiamato da tutti i controller. Questo template è memorizzato in
application/views/includes/template.php
che include a sua volta le pagine (nella stessa directory) header.php e footer.php.
Prima di modificare queste pagine, dobbiamo creare una directory assets nella directory principale (o root) della nostra applicazione, e copiarvi tutte le risorse necessarie, reperibili nella distribuzione standard di Twitter Bootstrap ovvero queste directory:
- css: directory dei fogli di stile, dove ne aggiungeremo altri creati da noi o necessari ad altri componenti;
- img: immagini e icone utilizzate dall’applicazione;
- js: sorgenti Javascript.
Fatto ciò, possiamo modificare il file header.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>PhotoCloud</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="PhotoCloud"> <meta name="author" content="Dimitri De Franciscis per www.internetpost.it"> <base href="<?php echo base_url();?>" /> <!-- Le styles --> <link href="assets/css/bootstrap.min.css" rel="stylesheet"> <style type="text/css"> body { padding-top: 60px; padding-bottom: 40px; } </style> <link href="assets/css/bootstrap-responsive.min.css" rel="stylesheet"> <link href="assets/css/jquery.lightbox-0.5.css" rel="stylesheet" type="text/css" media="screen" /> <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> <!--[if lt IE 9]> <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <!-- Le fav and touch icons --> <link rel="shortcut icon" href="images/favicon.ico"> <link rel="apple-touch-icon" href="images/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png"> <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png"> <script src="assets/js/jquery.js"></script> <script src="assets/js/bootstrap-transition.js"></script> <script src="assets/js/bootstrap-carousel.js"></script> </head> <body> <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <a class="brand" href="#">Photocloud</a> <ul class="nav"> <li ><?php echo anchor('/', 'Home'); ?></li> <li class="divider-vertical"></li> <li ><?php echo anchor('collection/index', 'Collezioni'); ?></li> <li class="divider-vertical"></li> <li ><?php echo anchor('/home/about', 'About'); ?></li> </ul> <div class="nav-collapse pull-right"> <?php if (isset($this->session->userdata['logged_in'])) { echo anchor('login/logout', '<i class="icon-user"></i>Logout', 'class="btn"'); } else { echo anchor('login/index', '<i class="icon-user"></i>Login', 'class="btn"'); } ?> </div> </div><!-- class="container" --> </div><!-- class="navbar-inner" --> </div><!-- class="navbar" --> <div class="container"> <?php if (isset($this->session->userdata['logged_in'])) { echo '<div class="pull-right">'; echo 'Logged in as <em>' . $this->session->userdata['username'] . '</em>'; echo '</div>'; } ?> <?php if (isset($show_masthead)) { ?> <div class="hero-unit"> <h1>Photocloud</h1> <p>Gallery fotografica basata su PHP e Cloud Storage.</p> </div> <?php } $flashErrorMessages = $this->session->flashdata('errorMessages'); $showErrors = isset($errorMessages) || ! empty($flashErrorMessages); if ($showErrors) { echo '<div class="alert alert-error"><h3>Errore</h3>'; if (isset($errorMessages)) { // TODO better formatting print_r($errorMessages); } if (isset($flashErrorMessages)) { // TODO better formatting print_r($flashErrorMessages); } echo '</div>'; } ?>
Come potete notare, ne abbiamo approfittato per aggiungere diversi elementi al template:
- una navigation barin cima alla pagina, con diversi link e pulsanti:
- link alla homepage e alla pagina “Collezioni” (che vedremo in un’altra puntata);
- pulsante di Login, che viene mostrato quando l’utente non è entrato come administrator;
- pulsante di Logout se siamo entrati come administrator;
- un <div> con l’attributo class=”hero-unit”: è il classico mega-titolone che va tanto di moda oggi. Viste le dimensioni ingombranti, abbiamo deciso di mostrarlo solo se la variabile $show_masthead è definita.
La pagina footer.php invece rimane identica:
</div> <!-- /container --> </body> </html>
Così come il template principale, template.php, che riportiamo qui per completezza:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?> <?php $this->load->view('includes/header'); ?> <?php $this->load->view($main_content); ?> <?php $this->load->view('includes/footer'); ?>
Una volta fatte queste modifiche, la homepage avrà un aspetto decisamente più professionale e curato:
Sviluppi
Nella prossima puntata vedremo come creare una sezione amministrativa e proteggerla con username + password.
Links
- Twitter Bootstrap;
- Responsive Web Design (Wikipedia);
- Ottimizzazione (motori di ricerca) (Wikipedia);
- Soluzioni cloud di Hostingsolutions;
- Amazon S3 PHP Class.