Posizionare programmaticamente blocchi?


14

Sto usando Drupal 7. In questo momento, ho un navigatore del menu principale e un selettore di lingua che esiste nell'intestazione del mio sito web. Li ho posizionati lì andando in CMS> Struttura> Blocchi e hten trascinando i blocchi nella regione dell'intestazione.

Come posso collocare programmaticamente questi blocchi nell'intestazione?


In base alla tua domanda su come collocare programmaticamente questi blocchi nell'intestazione, ti suggerisco di rivedere il modulo Esempi http://drupal.org/project/examples e in particolare puoi esaminare e abilitare il modulo Esempio blocco per testare il funzionamento del blocco in modo programmatico . Immagino che block_example_block_info()e il valore 'region' potrebbe essere utile per testare.
cigotete,

John, hai trovato una risposta a questo?
ricaduta il

Risposte:


4

Per modificare la regione in cui sono posizionati i blocchi definiti da altri moduli, è possibile implementare hook_block_info_alter () , che riceve i seguenti argomenti:

  • $blocks (passato per riferimento): l'array contenente le definizioni di blocco, digitato da module e delta
  • $theme: il tema per cui vengono definiti i blocchi
  • $code_blocks: i blocchi definiti dalle hook_block_info()implementazioni, prima che i loro valori vengano sovrascritti dai valori ottenuti dal database

3

È legittimo aggiungere un array renderizzabile a qualsiasi area della pagina in hook_page_build (). Drupal 7 esempio per aggiungere un minipanel alla regione del piè di pagina.

<?php
/**
 * Implements hook_page_build().
 */
function MODULE_page_build(&$page) {
  $block = module_invoke('panels_mini', 'block_view', 'blah');
  $blocks['blah'] = array('#markup' => $block['content']);

  $region = 'footer';
  if (isset($page[$region])) {
    $page[$region] = array_merge($page[$region], $blocks);
  }
  else {
    $page[$region] = $blocks;
  }
}

Questa è la stessa tecnica che utilizza il modulo di contesto.

Nota: non è necessario abilitare block.module per farlo funzionare.


2

In D6 lo sarebbe essenzialmente

$block = module_invoke("the_module_name", "block", "view", the_block_delta);
drupal_set_content("the_region_name", theme("block", $block));

In D7 penso di si

$block = module_invoke("the_module_name", "block_view", the_block_delta);
drupal_add_region_content("the_region_name", theme("block", $block));

ma mi sto ancora aggiornando su D7.


Ciò non consente ai moduli di terze parti di modificare il blocco in uscita, poiché i moduli potrebbero implementare hook_block_view_alter che non viene invocato con il codice mostrato.
kiamlaluno

Credere drupal_add_region_content()è un vicolo cieco poiché è destinato alle pagine di installazione / aggiornamento.
doublejosh,

2

Se si aggiunge un blocco personalizzato, eseguire questa operazione utilizzando hook_block_info, impostando l'opzione di stato su 1 e l'opzione della regione sulla regione in cui si desidera posizionare il blocco.

Esempio:

MODULE_block_info() {
  $blocks = array();
  $blocks['my_block'] = array(
    'info' => t('My Block Name'),
    'status' => 1,
    'region' => 'THE_REGION_I_WANT',
   );
   return $blocks;
}

Se si desidera modificare un blocco già esistente, utilizzare hook_block_info_alter (), invece, l'aggiornamento delle stesse opzioni è mostrato di seguito.

Esempio:

MODULE_hook_block_info_alter(&$blocks, $theme, $code_blocks) {
  $blocks['my_block']['status'] = 1;
  $blocks['my_block']['region'] = 'THE_REGION_I_WANT';
}

Per ulteriori informazioni, consultare https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_info/7


0

Questo codice si basa su @ jonhattan's, ma il suo non rende l'HTML del contenitore dei blocchi o i collegamenti contestuali. Ho anche fornito un modo semplice per specificare tutti i blocchi e le regioni in un unico posto.

<?php
/**
 * Implements hook_page_build().
 */
function MODULE_page_build(&$page) {
  global $theme;

  // A list of blocks you wish to display, keyed by region.
  // These are in the format of: 'module_name' => 'delta'.
  $blocks_to_render = array(
    'header' => array(
      'block' => 1,
    ),
  );

  // Add the blocks to each region.
  foreach ($blocks_to_render as $region => $block_list) {
    $block_objects = array();
    foreach ($block_list as $module_name => $delta) {
      $block = block_load($module_name, $delta);
      // Alter some of the defaults to match the current context.
      $block->theme = $theme;
      $block->region = $region;
      $block->weight = 0;
      $block_objects[] = $block;
    }
    $blocks_build = _block_get_renderable_array(_block_render_blocks($block_objects));

    if (isset($page[$region])) {
      $page[$region] = array_merge($page[$region], $blocks_build);
    }
    else {
      $page[$region] = $blocks_build;
    }
  }
}

Nota: a differenza del suo codice, è necessario installare il block.module.


-1

Questa non è la forma migliore, ma si può inserire manualmente il contenuto nella matrice pagina come questa ...

function mymodule_page_alter(&$page) {
  $my_content = _mymodule_render_mycontent();
  $page['my_region']['my_special_insert']['content']['#markup'] = $my_content;
}

Tuttavia, dovresti attenersi all'utilizzo di Context o solo dei blocchi core. Creare nuovi plugin non è così male come sembra. Basta nominare i file correttamente, impostare un trigger e un test. esempio .


In effetti, ripensandoci, mi pento quasi di aver pubblicato questa soluzione. Non farlo
doublejosh

-1

puoi anche regolare i blocchi nel tuo tema come:

/**
 * Implements hook_preprocess_page().
 */
function your_theme_preprocess_page(&$variables) {

  if (drupal_is_front_page()) {
    $variables['page']['region_one'] = $variables['page']['region_two'];
    unset($variables['page']['region_two']);
  }
}

Questo non risponde alla domanda su come rendere i blocchi o come identificarli nel markup.
Christian,
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.