Fino ad ora ci siamo limitati a richiamare le viste e stampare il loro codice HTML staticamente. Ma la vera potenza del modello MVC risiede nella capacità di passare dinamicamente variabili alle viste per generare risultati dinamici.
I dati dinamici possono essere passati alla View utilizzando un array associativo come secondo parametro. In realtà è possibile utilizzare anche un oggetto, le cui proprietà verranno convertite automaticamente in proprietà di un array. Utilizzare un array è il metodo privilegiato dalla maggior parte di utilizzatori di Code Igniter:
<?php
class Welcome extends CI_Controller {
// array di variabili che verranno passati alla View
$data = array(
'h1' => 'Welcome',
'subtitle' => 'This is the welcome page',
'num' => 10
);
public function index() {
$this->load->view('template/doctype');
$this->load->view('template/header', $data);
}
}
?>
A Questo punto non dovremo fare altro che utilizzare le precedenti variabili, che saranno direttamente disponibili nella vista con il nome del relativo indice dell'array. Nel nostro esempio, la variabile $h1
sarà disponibile con valore 'Welcome', la variabile $subtitle
avrà valore 'This is the welcome page' e la variabile $num
avrà valore 10:
<header>
<h1> <?php echo $h1; ?> </h1>
<p> <?php echo $subtitle; ?> </p>
<p> <?php echo $num; ?> </p>
</header>
Iterare i dati
Se tra gli indici del nostro array $data
che viene passato alla View forniamo un array come valore, questo potrà essere iterato in un loop come qualsiasi vettore. Questo è molto vantaggioso nel caso in cui dobbiamo iterare tra oggetti contenenti dati relativi ad un database, che verranno prodotti dal Model, gestiti e passati dal Controller e stampati dalla View. Ad esempio:
Codice Controller:
<?php
class Welcome extends CI_Controller {
// array di variabili che verranno passati alla View
$data = array(
'h1' => 'Welcome',
'subtitle' => 'This is the welcome page',
'num' => 10,
'database-data' => array(
'name' => 'Riccardo',
'lastname' => 'Degni',
'born' => 'Italy'
)
);
public function index() {
$this->load->view('template/doctype');
$this->load->view('template/header', $data);
}
}
?>
Codice View:
<header>
<h1> <?php echo $h1; ?> </h1>
<p> <?php echo $subtitle; ?> </p>
<p> <?php echo $num; ?> </p>
<ul>
<?php foreach ($database-data as $key =>$item):?>
<li><?php echo $key . " " . $item;?></li>
<?php endforeach;?>
</ul>
</header>
Salvare la View in una variabile
Il comportamento di default del metodo load->view
consiste nello stampare l'output HTML direttamente nel browser. Se invece vogliamo restituire questo output e salvarlo in una variabile, occorre utilizzare un terzo parametro ed impostarlo al valore booleano true
. In questo modo l'output non verrà stampato ma restituito. Questa funzionalità è utile ad esempio nel caso in cui abbiamo la necessità di gestire o parsare in qualche modalità l'output restituito dalla View:
$view = $this->load->view('template/header', '', true);
Gestire l'output finale in modo dinamico
Un'altra ottima feature offerta da Code Igniter risiede nel dare la possibilità allo sviluppatore di "bloccare" l'output che normalmente verrebbe stampato dal browser, per poterlo gestire dinamicamente. Per fare ciò, occorre dichiarare all'interno del Controller un metodo speciale, come nel caso di _remap
, chiamato _output
.
Quando un Controller possiede un metodo cosi denominato, l'output che normalmente verrebbe stampato nel browser, come nel caso dell'output HTML generato dal loading delle View, viene invece "congelato" e passato come parametro al suddetto metodo. In questo modo sarà possibile effettuare operazioni specifiche e lavorare sulla stringa di output finale.
class Welcome extends CI_Controller {
public function index()
{
$this->load->view('welcome_message');
}
// invece che stampare l'output HTML dalla view 'welcome_message'
// viene passato come parametro al metodo _output
public function _output($output)
{
// stampa la versione maiuscola dell'output
echo STRTOUPPER($output);
}
}