hook_theme e tpl

3 contenuti / 0 new
Ultimo contenuto
hook_theme e tpl

Ho utilizzato la hook_theme per cose relativamente semplici, purtroppo però non sono in grado di utilizzarla come si deve per rispondere ad altre necessità.
Tra l'altro ho letto le API, però non ho risolto tutti i miei dubbi.

In un tema, posso inserire i tpl che mi vanno, seguendo una serie di regolette per dar loro un nome rintracciabile dal core.
Via modulo, invece, devo utilizzare la hook_theme per importare i tpl di riferimento, altrimenti sono file inutili.

Con un modulo dovrei customizzare struttura e stile di alcuni blocchi depositati nella regione content, con una page definita. Ancora indeciso se overridare il tpl block- o block- (mi pare fosse questo l'ordine).

Vorrei sapere, in linea generale, quale set di istruzioni mi permette di poter fare questo lavoro? Se un tema importa uno stesso tpl del modulo, chi dei due ha precedenza?

Grazie.

Felagund wrote:
...
In un tema, posso inserire i tpl che mi vanno, seguendo una serie di regolette per dar loro un nome rintracciabile dal core.
Via modulo, invece, devo utilizzare la hook_theme per importare i tpl di riferimento, altrimenti sono file inutili.

Puoi aggiungere altri template nella tema tramite la funzione MIOTEMA_preprocess_page o MIOTEMA_preprocess_node, entrambi in template.php - devi solo aggiugerlo ai variabili:
$vars['template_files'][] = 'felagund-template';

Felagund wrote:
Con un modulo dovrei customizzare struttura e stile di alcuni blocchi depositati nella regione content, con una page definita. Ancora indeciso se overridare il tpl block-[regione] o block-[module-delta] (mi pare fosse questo l'ordine).

Vorrei sapere, in linea generale, quale set di istruzioni mi permette di poter fare questo lavoro? Se un tema importa uno stesso tpl del modulo, chi dei due ha precedenza?

Partendo con l'ultima domanda: il tema ha precedenza. Per esempio block.tpl.php di default (quello in modules/system) viene usato di solito, ma se lo copia nel tema e poi lo madifica, vedi le modifiche. Tema > Modulo.

Per la prima domanda (o conferma) si, l'ordine è (includes/theme.inc):

  $variables['template_files'][] = 'block-'. $variables['block']->region;
  $variables['template_files'][] = 'block-'. $variables['block']->module;
  $variables['template_files'][] = 'block-'. $variables['block']->module .'-'. $variables['block']->delta;

Questa lista va sempre letta alla rovescia finchè non trova un template con quel nome. Così usa block-[modulo] solo se non c'è un block-[modulo]-[delta], e block-[regione] solo se non c'è un block-[modulo] .

Ovviamente puoi accodare altri template nella lista (che avranno la priorità) tramite il tuo modulo usando la funzione MIOMODULO_preprocess_HOOK - descritto meglio in theme(). Chiaro che se il file template (tpl.php) viene copiato nel tema quella versione avrà la priorità.

HTH
John

Più imparo, più dubito.

Grazie della risposta, adesso ho capito qualcosa in più e mi son accorto che alcune cose che hai scritto le sapevo già! O.o

Attraverso hook_theme, sono in grado di definire delle funzioni che, presi dei parametri, restituiscono l'html dei dati. Riesco anche, via template.php, ad eseguire degli override di funzioni già implementate altrove.

Ciò che non riesco via hook_theme è definire i nuovi tpl o ad eseguire l'override di tpl già definiti, il tutto via modulo. Io so che, definendo un tpl, poi mediante una funzione si settano le variabili utilizzate poi nel tpl stesso.

Nel caso del posto precedente, vorrei fare override di un tpl che non esiste, ma che potrebbe essere implementato dal tema e caricato automaticamente, in questo caso block-<qualcosa>.tpl.php e implementare un custom tpl come lo è ad esempio block-tpl o node.tpl.

Grazie.