CakePHP: impostare il layout automaticamente in base alla sezione del sito

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

All'interno di un controller è possibile impostare il layout della pagina tramite la proprietà $this->layout. Per impostare una regola generale per la gestione dei layout dell'applicazione è possibile scrivere una funzione apposita all'interno dell'app_controller. In un caso reale potremmo ad esempio avere 4 layout diversi:

  1. public: per la visualizzazione del sito pubblico
  2. admin: per il pannello di amministrazione
  3. fornitore: un layout che verrà visualizzato agli utenti che eseguono il login come fornitori
  4. ajax: per le richieste asincrone tramite javascript

Utilizzando i prefissi per le sezioni del sito diverse da quella pubblica la funzione sarà:


function _setLayout(){
    //imposta layout standard per il sito pubblico
    $this->layout = 'public';
    //modifica in base al prefisso
    if(isset($this->params['prefix'])){
        switch($this->params['prefix']){
         case 'admin':
          $this->layout = 'admin';
          break;
         case 'fornitore':
          $this->layout = 'fornitore';
          break;
        }
    }
    //layout per le richieste ajax
    if($this->RequestHandler->isAjax()){
        $this->layout = 'ajax';
    }
}

Ovviamente all'interno dello switch è possibile inserire tanti "case" quante sono le sezioni gestite tramite prefisso. La funzione sarà richiamata all'interno del metodo beforeFilter(): in questo modo sarà anche possibile gestire eventuali eccezioni tramite i metodi dei controllers in quanto il callback beforeFilter viene richiamato prima di ogni altro metodo dell'applicazione. Ad esempio:


class HomeController extends AppController{ 
 //pagina con layout non standard
 function index(){
  $this->layout = "layout_non_standard";
 }
}

Condividi questo post


Commenti