Comment créer un thème pour un bloc personnalisé

26

J'ai créé un bloc en utilisant hook_block_infoet hook_block_themeet similaires. Mais comment puis-je le thème?

Je l'ai pour retourner un tableau avec les clés 'subject'et 'content'. Mais j'ai créé le balisage directement dans le hook_block_view()crochet et ce n'est pas ce que je veux.

Dans les documents, il est dit que le contenu doit être renvoyé de préférence sous forme de tableau pouvant être rendu et non sous forme de balisage. Mais quel est ce tableau rendable ? Ils disent que ce devrait être des données au lieu du balisage, mais tout ce que je vois dans les exemples, c'est qu'il est juste utilisé comme un wrapper pour le balisage, donc rien n'y a gagné.

Je veux pouvoir en avoir un block--MYMODULE--DELTA.tpl.phpdans mon thème, mais comment l'appeler et comment puis-je transmettre les données au bloc?

yunzen
la source
blog détaillé: goo.gl/kD3TZu
Suresh Kamrushi
@SureshKamrushi - OP demande un thème à un bloc. L'article lié concerne l'ajout d'une nouvelle région à un thème. Ce n'est pas ce que OP a demandé.
leymannx

Réponses:

27

La façon dont je fais cela est la suivante ...

function MYMODULE_block_info() {

  $blocks = [];

  $blocks['my_block_machine_name'] = [
    'info'  => t('My Block Title'),
    // @see https://api.drupal.org/api/drupal/includes!common.inc/group/block_caching/7.x
    // You can use different caching options.
    'cache' => DRUPAL_NO_CACHE,
  ];

  return $blocks;
}

function MYMODULE_block_view($delta = '') {

  $block = [];

  switch ($delta) {
    case 'my_block_machine_name':
      // Good idea to check user permissions here.
      if (user_access('access content')) {
        $block['subject'] = t('My Block Title');
        $block['content'] = MY_BLOCK_CONTENT_CALLBACK();
      }
      break;
  }

  return $block;
}

function MY_BLOCK_CONTENT_CALLBACK()() {

  $items = [];

  // This is the simplest kind of renderable array.
  $items['VAR_ONE'] = ['#markup' => 'VAR_ONE_OUTPUT'];

  // Here I added a prefix and a suffix.
  $items['VAR_TWO'] = [
    '#prefix' => '<div class="foo-bar">',
    '#markup' => 'VAR_TWO_OUTPUT',
    '#suffix' => '</div>',
  ];

  // This is where the $items get sent to your my-template.tpl.php template
  // that got registered below.
  return theme('my_cool_block', ['items' => $items]);
}

function MYMODULE_theme() {

  // Here you are registering your template for the block output above.
  $module_path = drupal_get_path('module', 'MYMODULE');

  // Drupal will now look up your modules /theme folder first to grab the
  // template.
  $base = [
    'path' => "$module_path/theme",
  ];

  return [
    'my_cool_block' => $base + [
        // Leave off .tpl.php.
        'template'  => 'my-template',
        // Define variables you want to pass to the template.
        // Here I just pass items, but you can pass any other data as well.
        'variables' => [
          'items' => NULL,
        ],
      ],
  ];
}

Et puis dans un sous-dossier de votre module appelé, themeil devrait y avoir un fichier appelé my-template.tpl.phpqui pourrait y avoir ceci:

<?php 

$items = $variables['items'];

print render($items['VAR_ONE']); 
print render($items['VAR_TWO']); 

Et si vous le souhaitez, vous pouvez réellement remplacer l'implémentation de module "par défaut" que vous venez de créer my-module.tpl.phpdans votre thème comme vous le souhaitez block--MYMODULE--DELTA.tpl.php.

nedwardss
la source
Mais si je superpose le thème avec un fichier tpl.php dans mon thème, le hook_block_view ne s'exécutera pas et mes variables ne seront pas données au fichier temmplate.
yunzen
@yunzen - Vous devrez peut-être vider votre cache, essayez de admin/config/development/performancecliquer sur le clear cachebouton. Vous pouvez également vider le cache en utilisant drush, c'estdrush cc all
Cyclonecode
6

Essayez le module Theme Developer . Lorsque vous l'avez activé, vous pouvez cocher une case dans le coin inférieur gauche de votre page Drupal. Après cela, vous pouvez cliquer sur votre bloc et obtenir des informations utiles sur le thème. Vous pouvez voir les noms de fichiers .tpl.php possibles pour votre bloc par exemple.

Choisissez l'un de ces noms. Le premier est le plus spécifique. Il ne thématisera qu'un bloc. Créez un fichier avec ce nom dans votre dossier de thème s'il n'est pas déjà là. Vous pouvez le mettre dans un sous-dossier si vous souhaitez vous organiser.

Copiez le contenu de block.tpl.php dans votre fichier et commencez à changer les choses comme vous le souhaitez.

Enregistrez votre fichier, videz les caches et rechargez la page.

swing
la source
5

Il existe déjà un certain nombre de réponses à cette question, mais j'ai essayé de fournir une approche très simpliste. Espérons que nous identifions aux développeurs la structure du tableau attendue par Drupal lors du retour du contenu de votre bloc.

Pour ce faire, j'ai divisé la question en exemples de code distincts en tant que tels,

/**
 * Implements hook_theme().
 */
function examplemodule_theme() {
  return array(
    'examplemodule_output' => array(
      'variables' => array(
        'title' => NULL,
        'content' => NULL,
        'popular_content' => NULL,
       ),
      'template' => 'templates/examplemodule-sweet--block',
    ),
  );
}

S'il vous plaît voir une explication complète ici drupal 7 création de blocs personnalisés à thème

Nicolas
la source
3

Il s'agit d'un ancien article, mais j'ai trouvé une meilleure solution pour remplacer les modèles de bloc à partir d'un module personnalisé pour Drupal 7.

Ajoutez ceci à votre module personnalisé:

/**
 * Implements hook_theme().
 */
function MYMODULE_theme($existing, $type, $theme, $path) {

  // Custom template for that overrides the default block.tpl.php.
  $themes['block__my_custom_module'] = [
    'template'      => 'block--my_custom_module',
    'original hook' => 'block',
    'path'          => drupal_get_path('module', 'my_custom_module') . '/templates',
  ];

  return $themes;
}

Ensuite, vous avez besoin du code suivant:

/**
 * Implements hook_block_info().
 */
function MYMODULE_block_info() {

  $blocks = [];

  $blocks['my_custom_module'] = [
    'info'  => t('My Custom Module Block'),
    'cache' => DRUPAL_CACHE_PER_ROLE,
  ];

  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {

  $block = [];

  switch ($delta) {
    case 'my_custom_module':
      $block['content'] = _my_custom_module_helper_function();
      break;
  }

  return $block;
}

/**
 * Helper function to generate HTML.
 *
 * @return string
 *   generated HTML
 */
function _my_custom_module_helper_function() {

  $output = '';

  // ...

  return $output;
}

Il vous suffit de créer templates/block--my-custom-module.tpl.phpdans le dossier de votre module.

J'ai écrit un tutoriel sur ce tutoriel Drupal - Comment remplacer un modèle de bloc à partir d'un module personnalisé

iStryker
la source