it-swarm.it

Posizionare programmaticamente blocchi?

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

Come posso collocare programmaticamente questi blocchi nell'intestazione?

14
John

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 che contiene le definizioni di blocco, digitato dal modulo e delta
  • $theme: Il tema per cui vengono definiti i blocchi
  • $code_blocks: I blocchi definiti dalle implementazioni hook_block_info(), prima che i loro valori vengano sovrascritti dai valori ottenuti dal database
4
kiamlaluno

È 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.

3
jonhattan

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, vedere https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_info/7

2
Wesley J

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.

2
mpdonadio

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.

0
hargobind