Maneira fácil de criar blocos programaticamente? [fechadas]

26

Aprendendo Drupal. Agora eu sei que posso criar blocos através do back-end, mas prefiro pré-criá-los programaticamente, se possível. Na verdade, tenho certeza de que é possível. Mas qual é a maneira mais fácil?

jayarjo
fonte
blog de detalhes: goo.gl/kD3TZu
Suresh Kamrushi

Respostas:

34

Para o Drupal 7:

Use hook_block_info e hook_block_view ganchos em seu módulo personalizado . hook_block_info define o bloco. Ele será exibido em admin > estrutura > blocos . * hook_block_view * exibe o conteúdo. Veja exemplos abaixo na API Drupal.

Exemplo de hook_block_info, em que dois blocos são definidos (intitulado Conteúdo sindicalizado e Recente):

    <?php
function hook_block_info() {
  // This example comes from node.module.
  $blocks['syndicate'] = array(
    'info' => t('Syndicate'), 
    'cache' => DRUPAL_NO_CACHE,
  );

  $blocks['recent'] = array(
    'info' => t('Recent content'),
    // DRUPAL_CACHE_PER_ROLE will be assumed.
  );

  return $blocks;
}
?>

Exemplo de hook_block_view:

<?php
function hook_block_view($delta = '') {
  // This example is adapted from node.module.
  $block = array();

  switch ($delta) {
    case 'syndicate':
      $block['subject'] = t('Syndicate');
      $block['content'] = array(
        '#theme' => 'feed_icon', 
        '#url' => 'rss.xml', 
        '#title' => t('Syndicate'),
      );
      break;

    case 'recent':
      if (user_access('access content')) {
        $block['subject'] = t('Recent content');
        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
          $block['content'] = array(
            '#theme' => 'node_recent_block', 
            '#nodes' => $nodes,
          );
        }
        else {
          $block['content'] = t('No content available.');
        }
      }
      break;
  }
  return $block;
}
?>

Consulte a página da API de blocos no Drupal.org para obter a lista completa de ganchos. Drupal 6 é um pouco diferente. Não há gancho hook_block_view; em vez disso, use hook_block para declarar blocos.

PERTO ESCURO
fonte
6

Para o Drupal 6, a resposta curta é que você cria um módulo personalizado que implementa hook_block .

Para o Drupal 7, você usa a API de bloqueio .

Se esta é sua primeira incursão no desenvolvimento de módulos, eu recomendo o Pro Drupal Development ou o Pro Drupal 7 Development . Praticamente tudo o que você precisa saber está lá.

mpdonadio
fonte
Parece que hook_block só pode ser usado em um módulo separado: | Ainda não entendo por que essa complexidade ... É uma prática comum ter módulos para tudo no Drupal?
Jayarjo
2
Sim, os módulos são um conceito-chave do Drupal. De muitas maneiras, o próprio Drupal é um conjunto de módulos e tudo é feito através de ganchos de módulos.
mpdonadio
3

Você pode estar procurando o que eu estava procurando e o encontrou aqui:

/modules/block/block.module:
block_custom_block_save ($ edit, $ delta).

Mas quando você olha para esta função, verá que pode fazer o db_update sozinho.

db_update('block_custom')
->fields(array(
  'body' => $edit['body']['value'],
  'info' => $edit['info'],
  'format' => $edit['body']['format'],
))
->condition('bid', $delta)
->execute();
Dan Shumaker
fonte
2

No Drupal 7, dê uma olhada block_add_block_form_submitem modules/block/block.admin.inc.

Este é o formulário regular de criação de blocos; parece apenas inserir os registros diretamente, em vez de chamar outra função. Observe que cada registro na tabela de blocos está vinculado a um único tema (você pode apenas usar o ativo, mas é mais seguro inserir registros para todos os temas).

A tabela block_custom mantém o conteúdo.

richardg
fonte
1

Você pode usar o módulo Recursos extras para exportar blocos.

Como alternativa, basta criar registros diretamente na tabela de blocos.

INSERT INTO blocks (
  module, delta, theme, status, weight, region, custom,
  throttle, visibility, pages, title, cache)
VALUES (
  'views','blog-block_1','mytheme',1,10,'sidebar_first',0,0,1,'blog\r\nblog/*','',-1)
Dylan Tack
fonte
11
Módulo extra ou consulta direta ao sql ... deve haver algo mais limpo ao redor, eu acho.
Jayarjo