Un moyen facile de créer des blocs par programmation? [fermé]


26

Apprendre Drupal. Je sais maintenant que je peux créer un bloc via le backend, mais je préfère les pré-créer par programme, si c'est possible. En fait, je suis presque sûr que c'est possible. Mais quelle est la manière la plus simple?


blog détaillé: goo.gl/kD3TZu
Suresh Kamrushi

Réponses:


34

Pour Drupal 7:

Utilisez les hooks hook_block_info et hook_block_view dans votre module personnalisé . hook_block_info définit le bloc. Il apparaîtra dans admin > structure > blocs . * hook_block_view * affiche le contenu. Voir les exemples ci-dessous de l'API Drupal.

Exemple de hook_block_info, où deux blocs sont définis (intitulé Syndiquer et Contenu récent):

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

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

Reportez-vous à la page API Blocks sur Drupal.org pour la liste complète des hooks. Drupal 6 est un peu différent. Il n'y a pas de crochet hook_block_view; utilisez plutôt hook_block pour déclarer des blocs.


6

Pour Drupal 6, la réponse courte est que vous créez un module personnalisé qui implémente hook_block .

Pour Drupal 7, vous utilisez l' API Block .

Si c'est votre première incursion dans le développement de modules, je recommande fortement le développement Pro Drupal ou le développement Pro Drupal 7 . Presque tout ce que vous devez savoir est là.


Il semble que hook_block ne peut être utilisé que dans un module séparé: | Je ne comprends toujours pas pourquoi cette complexité ... Est-ce une pratique habituelle d'avoir des modules pour tout dans Drupal?
jayarjo

2
Oui, les modules sont un concept clé de Drupal. Dans la plupart des cas, Drupal lui-même est un ensemble de modules et tout se fait via des crochets de modules.
mpdonadio

3

Vous cherchez peut-être ce que je cherchais et je l'ai trouvé ici:

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

Mais quand vous regardez cette fonction, vous verrez que vous pouvez juste faire la mise à jour db_update.

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

2

Dans Drupal 7, jetez un oeil à block_add_block_form_submiten modules/block/block.admin.inc.

Il s'agit du formulaire de création de bloc normal; il semble simplement insérer directement les enregistrements plutôt que d'appeler une autre fonction. Notez que chaque enregistrement dans la table des blocs est lié à un seul thème (vous pouvez simplement utiliser celui actif mais il est plus sûr d'insérer des enregistrements pour tous les thèmes).

La table block_custom contient le contenu.


1

Vous pouvez utiliser le module Fonctionnalités supplémentaires pour exporter des blocs.

Alternativement, créez simplement des enregistrements directement dans la table des blocs.

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)

1
Module supplémentaire ou requête SQL directe ... il devrait y avoir quelque chose de plus propre, je pense.
jayarjo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.