stampa questa pagina feed di signalkuppe.com/

You are hereDrupal: separare il tema di amministrazione.

Drupal: separare il tema di amministrazione.

By lioz - Posted on 23 April 2007

logo drupalUna delle più importanti caratteristiche che un buon CMS deve avere è quella di consentire una separazione tra il tema di amministrazione e quello del frontend. Spesso infatti il tema di presentazione contiene troppi elementi grafici per gestire agevolmente tutti i task che un gestore di contenuti deve svolgere. Un altro requisito importante (a volte fondamentale nel caso di siti dui pubblica amministrazione) è che il tema di amministrazione sia realizzato con un template XHTML validato. Vediamo come sia possibile realizzare questo obiettivo con Drupal 5. La nuova versione del cms nasce con uno switch nativo dei due temi. Lo switch però non copre a mio avviso tutti i casi in cui si passa da una pagina di frontend ad una di backend. Prendiamo ad esempio il caso in cui dobbiamo creare un nuovo contenuto sul portale: questa azione ci porta alla pagina node/add che presenta il tema di presentazione del sito. La stessa cosa vale per la pagina di gestione dei blocchi o per qualsiasi pagina di modifica del contenuto (node/edit). Sono tutte funzionalità amministrative che devono presentare un loro tema dedicato.

Per risolvere questo problema, utilizziamo il motore phptemplate dei temi di Drupal. Immaginiamo ad esempio di voler utilizzare come tema di amministrazione il tema di default "Garland" e come tema di presentazione il tema "Pushbutton".Per prima cosa impostiamo l'administration theme nella pagina admin/settings/admin su "system default" mentre scegliamo come tema del sito il tema Pushbutton alla pagina admin/build/themes. In questo modo Drupal utilizzerà solamente il tema Pushbutton. A questo punto passiamo allo switch vero e proprio. Facciamo una copia del page template che troviamo nella cartella /themes/pushbutton (page.tpl.php) e rinominiamolo come "page-default.tpl.php". Apriamo page.tpl.php e inseriamo questo codice.

<?php
if (arg(0)=="admin") {/* se siamo nel pannello di amministrazione*/
   
include 'page-admin.tpl.php'; /*carica page-admin.tpl.php */
   
return; }

if ((

arg(0)=='node') && (arg(1)=='add')) { /* se stiamo creando un contenuto*/
   
include 'page-admin.tpl.php';
    return;
    }

if ((

arg(0)=='user') && (arg(1)=='')) { /* se siamo nella pagina di login*/
   
include 'page-admin.tpl.php';
    return;
    }

include

'page-default.tpl.php'; /*altrimenti carica il page-default.tpl.php */
   
return;
?>

Arg(0) legge la prima parte dell'url del sito. Grazie a delle semplici condizioni, possiamo dire a Drupal di usare un page template diverso per tutte le pagine "amministrative" (admin, node/add/, user ecc...). Non ci rimane che creare il page-admin. Abbiamo deciso di utilizzare il tema Garland. Andiamo quindi nella cartella del tema e rinominiamo il page.tpl.php in page-admin.tpl.php. Copiamo il page-admin.tpl.php dentro la cartella di pusbutton, avendo cura di copiare anche tutti i files che riguardano il tema. In questo caso dobbiamo includere anche la cartella images e il file garland.css. Il page-admin richiede qualche piccola modifica, in particolare sulla chiamata che aggiunge i fogli stile al page template. La funzione

<?php
print $styles
?>

carica automaticamente tutti i fogli stile presenti nel tema. Noi vogliamo che page admin richiamo solo gli stili di sistema di Drupal ed il nostro garland.css. Per far questo eliminiamo la chiamata

<?php
print $styles
?>

e colleghiamo manualmente i diversi fogli stile.

<style type="text/css" media="all">@import "modules/node/node.css";</style>
<style type="text/css" media="all">@import "modules/system/admin.css";</style>
<style type="text/css" media="all">@import "modules/system/defaults.css";</style>
<style type="text/css" media="all">@import "modules/system/system.css";</style>
<style type="text/css" media="all">@import "modules/user/user.css";</style>
<style type="text/css" media="all">@import "themes/pushbutton/garland.css";</style>

Salviamo il file page-admin.tpl.php andiamo su Drupal e verifichiamo il funzionamento dello switch. Spesso occore qualche altro accorgimento per far funzionare tutto al meglio. Verifichiamo ad esempio che i due temi non utilizzino regioni con lo stesso nome, come "sidebar_left" o sidebar_right". In questo caso rinominiamo esclusivamente le regioni del template di FE utilizzando il file di configurazione template.php che troviamo nella cartella del tema.

Definiamo le nostre regioni utilizzando questo codice.

<?php

function pushbutton_regions() {
    return array(
       
'header' => t ('header'),
       
'content' => t('content'),
       
'sidebar_left' => t('sidebar_left'),
       
'sidebar_right' => t('sidebar_right'),
       
'footer' => t('footer')
       
'sinistra' => t('sinistra'),

    );
}

?>

Sinistra diventerà in pushbutton quella che prima era la sua sidebar-left. Per far questo apriamo il nostro page-default.tpl.php e sostituiamo "sidebar_left" con "sinistra". E' buona norma utilizzare regioni distinte per il frontend e per il backend in modo da evitare potenziali conflitti, lasciando esclusivamente la regione "content" in comune. Verificato il funzionamento dello switch possiamo sbizzarrirci nel definire il comportamento del nostro cambio di tema. Ad esempio inserendo condizioni come.

<?php

if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'workflow') {/* se siamo nel workflow*/
   
include 'page-admin.tpl.php'; /*load a custom page-admin.tpl.php */
   
return; }

if (

arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'outline') {/* se siamo in una pagine del libro*/
   
include 'page-admin.tpl.php'; /*load a custom page-admin.tpl.php */
   
return; }

if (

arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'votes') {/* se siamo nei sondaggi*/
   
include 'page-admin.tpl.php'; /*load a custom page-admin.tpl.php */
   
return; }

if (

arg(0) == 'user' && is_numeric(arg(1)) && arg(2) == '') {/* se siamo nel profilo utente */
   
include 'page-admin.tpl.php'; /*load a custom page-admin.tpl.php */
   
return; }

?>

A questo punto nulla ci vieta di creare un template xhtml ad hoc ed utilizzarlo come template di amministrazione. Forte Drupal vero?

emanuele's picture

ciao a tutti....
volevo chiedere dopo aver eseguito tutto le operazioni sopra descritte perchè mi appare il seguente errore quando cerco di premere qualsiasi pulsante all'interno di admin....
il tema f.e. che uso è uno mio personale, mentre quello di admin è garland...

Fatal error: Call to undefined function phptemplate_body_class() in C:\xampplite\htdocs\suburbanlab\themes\suburbanTemp\page-admin.tpl.php on line 19

nella linea 19 c'è la seguente linea di codice:

<body>

cosa può significare?

grazie

emanuele

disc_nr's picture

Ciao

Nel caso si utilizzi chameleon come template cosa si modifica?

il .theme? che risulta essere un php mascherato da theme :P

Grazie per la risposta che so arriverà

djordj's picture

Tra l'altro ho scoperto questo interessante meccanismo nella 5.x

http://drupal.org/node/104316

Ciao

leoni.matteo's picture

ciao, grazie per la segnalazione, c'era un errore di trascrizione nel codice ;)

djordj's picture

Ottimo articolo!
Ti segnalo che...

if ((arg(0)=='user') && (arg(1)==")) { /* se siamo nella pagina di login*/
include 'page-admin.tpl.php';
return;
}

I've got an error ;)

arg(1)=="

Mavimo's picture

Bell'articolo... interessante, anche per la possibilità di creare temi differenti per vedere sezioni differenti del sito ;)

Ciao
Mavimo

Utente anonimo ?

Registrati o effettua l'accesso su Signalkuppe! per contattarmi via mail

Contribuisci

Marinelli is and will always be free. However, if you enjoyed it, please consider a donation. Your contributions speed theme development.


paypal

Vota per Drupal!

cms award