Nota: questo snippettino è stato testato con i temi fusion e zen (e subtemi). con il tema garland sembra non funzionare
Problema: nel mio sito esistono pagine con o senza "tabs", sono viste, nodi, profili utente; come faccio a sapere quando una determinata pagina ha o meno le tabs in modo da applicare gli stili corrispondenti?
Soluzione: genero due body class has-tabs
e no-tabs
nel file template.php del mio tema:
<?php
//nel caso in cui non sia presente, creo la funzione MIOTEMA_preprocess_page()
function MIOTEMA_preprocess_page(&$vars) {
//in base alla presenza o meno di $tabs tra le variabili disponibili nella pagina
//inserisco la classe opportuna
//notare lo spazio prima del nome della classe
$vars['body_classes'] .= (($vars['tabs'])) ? ' has-tabs' : ' no-tabs';
}
?>
A questo punto mi basta creare due serie di regole nel mio CSS, una per le pagine con le tabs una per le pagine senza:
/*ad esempio*/
.has-tabs #content{
padding-top:10px;
}
.no-tabs #content{
padding-top:0;
}
[UPDATE]
Altro esempio pratico: aggiungere alle body classes il termine del nodo che si sta visualizzando per uno specifico vocabolario.
Nella fattispecie a me serviva nascondere un fieldgroup per una specifica categoria.
(testato solo su fusion, ma dovrebbe andare anche per zen, no garland)
<?php
/**
* Da inserire in template.php nella funzione
* function MYTHEME_preprocess_page(&$vars)
*/
// inserisco qualche condizione necessaria
// più una supplementare per il tipo di nodo
if (module_exists('taxonomy') && $vars['node']->nid && $vars['node']->type == 'MYTYPE') {
$node = node_load($vars['node']->nid);
//nel mio caso l'ID del vocab era 1
foreach (taxonomy_node_get_terms_by_vocabulary($node,1) as $term) {
$vars['body_classes'] = $vars['body_classes'] . ' ' . strtolower(eregi_replace('[^a-z0-9]', '', $term->name));
}
}
?>
Ciao Bohz, la cosa sembrerebbe interessarmi (anzi, mi interessa molto...) e posso intuire che hai fatto un ottimo lavoro (e quando non ne fai? :-) ...)
Forse con un esempio più da "comuni mortali" riescirò/riusciremo a comprenderlo meglio...
Grazie come sempre per le news che introduci!
Ciao
kipper
DC Torino? ...90% ci sarò anch'io
mah,
a me sembra molto semplice: 1 riga di codice.
Anche il problema mi sembra realistico: quando si vogliono integrare le tabs con il resto del design è importante sapere se una pagina ha le tabs o no. Nel mio caso dovevo sostituire lo sfondo della parte alta delle pagine quando non c'erano le tab.
Se mi dici cosa non è chiaro posso provare a spiegare...
Certified to Rock
ok, se ti riferisci a queste "Tabs" non mi è chiaro qualcosa o mi sfugge:
Thema Garland
Ho inserito la funzione in
template.tpl.php
Ho sostituito "MIOTEMA" con "garland"
Svuotato la Cache
Ho inserito le 2 classi in
style.css
del temaFatto alcune prove: colore testo, bordo, padding, margin etc...
...ma non cambia nulla!
Mi illumini Bohz???
Grazie
Ciao
Kipper
non avevo capito che non funzionasse proprio...
in effetti con garland sembra non funzionare, io ho testato il codice solo con zen e fusion.
in garland la funzione in template.php dovrebbe essere
phptemplate_preprocess_page()
In realtà in garland la variabile $body_classes viene incrementata correttamente con le due classi has-tabs e no-tabs, però non viene stampata.
al momento non capisco bene il perchè.
Per ora prova con un altro tema...
ho aggiornato il post
Certified to Rock
ok Bohz, appena puoi, se risolvi con Garland mi farebbe piacere...
Ciao
Kipper
Due osservazioni:
Prima: il codice di ©Carlo™ ha abbondato le parentesi (( .. )):
è sufficiente:
ma questo è un esempio di "polizia del codice" (code police) - non cambia minimamente la funzionalità.
Secondo: il codice funziona se il tema usa il variabile
$body_classes
(di solito si) ma questo non è il caso di Garland - per motivi suoi presumo.Quindi basta controllare per il tuo tema che nel
page.tpl.php
(ed i suoi derivati) che l'elemento<body>
viene scritto simile a:<body class="<?php print $body_classes; ?>">
se si, allora il lavoro è completo.
Altrimenti, come per Garland, bisogna lavorare di più (o rinunciare se non conosci molto di $P->H->P).
Non presento la modifica per Garland perchè un pò pesante (bisogna modificare una funzione e la sua chiamata) - meglio scegliere un altro tema, o un'altra soluzione.
Più imparo, più dubito.
OK, e grazie anche a John per i suoi soliti preziosi interventi ma, a questo punto, sto perdendo di vista lo scopo di questo script...
Allora, io la questione la vedo così:
Bisogna assegnare degli stili ai Primary e Secondary tabs? ...dal mio punto di vista i casi sono 2, o si o no! ...giusto? ...magari mi sbaglio ...se fosse così chiedo scusa, abbiate pazienza...
Ma, se si tratta di assegnare degli stili alle Tabs, che penso sia la cosa fondamentale io lavoro direttamente di *.css; senza nemmeno toccare PHP... boh, magari ho detto un'eresia...
Una piccola demo (forse ho esagerato un pò...) - ogni elemento è sotto controllo separatamente e si può intuire il potenziale livello di customizzazione di queste Tabs, appunto:
Ciao
Kipper
No Kipper, lo script di Carlo non serve per assegnare gli stili ai Primary e Secondary tabs (cosa che come hai detto anche te si risolve semplicemente con i css), se rileggi bene il suo post vedrai che lo scopo del suo script è quello di "intercettare" se nella pagina ci siano o meno delle "tabs" e a questo punto agire sullo stile della pagina.
OK sylpheed, come non detto...
Sarò duro di comprendonio ma continuo a non capire... se una pagina non ha delle Tabs non le ha e basta... non capisco cosa dovrebbe essere intercettato (per un eventuale controllo del *.css;) in una pagina priva di tabs... abbiate pazienza...
Buone cose a tutti...
Ciao
Kipper
Tranquillo Kipper, come direbbe John "it's too simple", la prima cosa da focalizzare è che per usare uno script del genere ti devi trovare nell'ambito theming.
Themare una pagina con le tabs comporta nella stragrande maggioranza dei deisgn uno stile diverso da quello di una semplice pagina, come ad esempio l'immagine di sfondo, un bordino intorno al div container, ecc. ecc. tutte piccolezze che vengono decise in fase di design, ovvero della serie: se il grafico è molto "artistico" ti puoi trovare in una situazione di questo tipo.
Un po' più chiaro ora? :)
Essendo un grafico, è quello che faccio quotidianamente... ma non ho ancora capito e non sento l'esigenza di questo script (non lo capisco...); e ti assicuro che lavoro su templates molto complessi (quasi maniacali...)... in ogni caso sylpheed ho apprezzato molto il tuo intervento...
P.S. A questo punto mi viene il dubbio di essere clamorosamente "ingenuo" boh... sarà.... e, come dico sempre, non me ne vergogno... se ci sono altri approcci per farmelo capire sono sempre in "ascolto"...
Ciao
Kipper
confermo quanto scritto da sylpheed: nel mio caso si tratta della necessità di spostare lo sfondo della parte bassa delle tabs da ul.tabs alla div successiva (.content), quando le tabs non sono presenti.
mi ha colpito la semplicità della soluzione di un problema in apparenza molto difficile.
Ovviamente il problema si può risolvere anche ricostruendo il markup e/o il CSS in modo da non aver bisogno di questo stratagemma, ma non in 5 minuti, almeno per me!
@john: grazie per le correzioni ;)
poi: mi sembrava che $body_classes fosse una variabile presente nel core (theme.inc?); sarei interessato a sapere comunque come si può fare con garland...
Certified to Rock
Ciao Bohz, mamma mia che periodo!!!
Hai perfettamente ragione... una sorta di Drush per il Theming! (più o meno... credo...)
Attendiamo fiduciosi le news di The Doctor ;-)
Ciao a tutti
Kipper
Il codice di Carlo si base su due presupposti: che
$body_classes
viene usato, e che il contenuto ha un<div id="content">
. Purtroppo entrambi mancano in Garland, quindi non c'è una soluzione 'in 5 minuti' - bisogna smanettarepage.tpl.php
Mentre è buona regola aggiungere variabili definiti dal core, non c'è nessun regola che dice che un tema deve usare certi nomi identificatori nel HTML. Quindi occhio ragazzi...
Più imparo, più dubito.
Grazie per i tuoi preziosi consigli John...
Ciao
Kipper