web-dev-qa-db-fra.com

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

J'ai créé un bloc en utilisant hook_block_info Et hook_block_theme Et 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 crochet hook_block_view() 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 la forme tableau de rend et non sous forme de balisage. Mais qu'est-ce que c'est 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 avoir un block--MYMODULE--DELTA.tpl.php Dans mon thème mais comment l'appeler et comment puis-je transmettre les données au bloc?

26
yunzen

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é theme, il devrait y avoir un fichier appelé my-template.tpl.php qui pourrait contenir ceci:

<?php 

$items = $variables['items'];

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

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

27
nedwardss

Essayez le module Developer Theme . Lorsque vous l'avez activé, vous pouvez cocher une case dans le coin inférieur gauche de votre page Drupal page. Après cela, vous pouvez cliquer sur votre bloc et obtenir des informations utiles sur le thème. Vous pouvez voir le .tpl possible Les noms de fichiers .php 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.

6
jiv-e

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',
    ),
  );
}

Veuillez voir une explication complète ici Drupal 7 créant des blocs personnalisés de thème

5
Nicolas

Ceci est 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;
}

Tout ce que vous avez à faire est de créer templates/block--my-custom-module.tpl.php dans le dossier de votre module.

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

3
iStryker