¿Manera fácil de crear bloques mediante programación? [cerrado]

26

Aprendiendo Drupal. Ahora sé que puedo crear bloques a través del backend, pero preferiría crearlos mediante programación, si es posible. De hecho, estoy bastante seguro de que es posible. ¿Pero cuál es la forma más fácil?

jayarjo
fuente
blog de detalle: goo.gl/kD3TZu
Suresh Kamrushi

Respuestas:

34

Para Drupal 7:

Use hook_block_info y hook_block_view en su módulo personalizado . hook_block_info define el bloque. Aparecerá en admin > estructura > bloques . * hook_block_view * muestra el contenido. Vea los ejemplos a continuación de la API de Drupal.

Ejemplo de hook_block_info, donde se definen dos bloques (titulados Distribuir y Contenido reciente):

    <?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;
}
?>

Ejemplo 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 la página API de bloques en Drupal.org para obtener una lista completa de ganchos. Drupal 6 es un poco diferente. No hay hook_block_view hook; en su lugar use hook_block para declarar bloques.

CERCA DE OSCURO
fuente
6

Para Drupal 6, la respuesta corta es que crea un módulo personalizado que implementa hook_block .

Para Drupal 7, usa la API Block .

Si esta es su primera incursión en el desarrollo de módulos, le recomiendo Pro Drupal Development o Pro Drupal 7 Development . Casi todo lo que necesitas saber está ahí.

mpdonadio
fuente
Parece que hook_block solo puede usarse en un módulo separado: | Todavía no entiendo por qué esta complejidad ... ¿Es una práctica habitual tener módulos para todo en Drupal?
jayarjo
2
Sí, los módulos son un concepto clave de Drupal. En la mayoría de los casos, Drupal es un conjunto de módulos y todo se hace a través de ganchos de módulo.
mpdonadio
3

Quizás estés buscando lo que estaba buscando y lo encontraste aquí:

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

Pero cuando observa esta función, verá que puede hacer usted mismo la actualización db_update.

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

En Drupal 7, echar un vistazo a block_add_block_form_submiten modules/block/block.admin.inc.

Este es el formulario de creación de bloque regular; parece simplemente insertar los registros directamente en lugar de llamar a otra función. Tenga en cuenta que cada registro en la tabla de bloques está vinculado a un solo tema (puede usar el activo pero es más seguro insertar registros para todos los temas).

La tabla block_custom contiene el contenido.

richardg
fuente
1

Puede usar el módulo Características adicionales para exportar bloques.

Alternativamente, solo cree registros directamente en la tabla de bloques.

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
fuente
1
Módulo adicional o consulta SQL directa ... creo que debería haber algo más limpio.
jayarjo