Le regioni possono essere stampate all'interno di un modello di nodo?


25

Le regioni possono essere stampate all'interno di un modello di nodo oppure le aree sono strettamente limitate ai modelli di pagina?

Risposte:


48

È possibile stampare aree all'interno di qualsiasi modello, ma non sono disponibili immediatamente nel node.tpl.phpmodello. Per renderli disponibili, creerai una nuova variabile da utilizzare nel tuo node.tpl.phpmodello che conterrà tutto il contenuto della regione.

La creazione di nuove variabili di modello viene eseguita utilizzando una funzione di preelaborazione. Nel template.phpfile del tuo tema , crea una funzione simile alla seguente:

function mytheme_preprocess_node(&$variables) {
}

Sostituendo mythemecon il nome breve del tema. Ora, affinché Drupal riconosca questa nuova funzione di preelaborazione, è necessario ricostruire il registro dei temi del sito. Questo è semplice come andare su ConfigurazioneSviluppoPrestazioni e premere il pulsante "Cancella tutte le cache" in alto.

Ora, il modo in cui funzionano le funzioni di preelaborazione è che $variablescontiene un array che corrisponde alle variabili disponibili del modello. Ad esempio, in node.tpl.php, $submittedcontiene la riga dell'autore. Nella funzione di preelaborazione sopra, si trova in $variables['submitted'].

Per imitare quello che hai page.tpl.php, dove hai un array chiamato $pageche contiene tutte le regioni, vorrai popolare $variables['page'].

Il problema è che $pagein node.tpl.phpè già popolato con un valore vero / falso che ti consente di sapere se stai guardando il nodo da solo o in un elenco.

Quindi, per evitare quella collisione di nomi, popolare $regioninvece:

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Quindi, nel node.tpl.phpmodello del tuo tema , puoi eseguire il rendering di qualsiasi regione procedendo come segue:

<?php print render($region['sidebar_first']); ?>

Dov'è sidebar_firstil nome della regione che si desidera rendere.


1
Finalmente una soluzione funzionante per Drupal 7 :)
Eduard Luca,

4
C'è anche una soluzione rapida e sporca che ha funzionato per me <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. Da qui: webomelette.com/add-region-node-template
Darragh Enright,

Questa soluzione è elegante. Potresti dare esempi di quando è più applicabile per stampare regioni all'interno di node.tpl.php invece di averlo in page.tpl.php?
Randell

Dipende dal tuo design. A volte il layout potrebbe mettere la barra laterale in un posto in cui è molto più facile creare un tema se fosse all'interno del div del nodo anziché all'esterno.
rooby

Non dimenticare i wrapper regionali appropriati! Vedere system_page_alter () per riferimento. Ricorda che block_get_blocks_by_region()restituisce solo una matrice di blocchi e se vuoi renderlo come una regione, devi aggiungere un wrapper di regione.
SiliconMind
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.