Come creare un tema per un blocco personalizzato


26

Ho creato un blocco usando hook_block_infoe hook_block_themee simili. Ma come posso temarlo?

Ho funzionato per restituire un array con i tasti 'subject'e 'content'. Ma ho creato il markup direttamente nel hook_block_view()gancio e non è quello che voglio.

Nei documenti si dice che il contenuto dovrebbe preferibilmente essere restituito come array renderizzabile e non come markup. Ma cos'è questo array renderizzabile ? Dicono che dovrebbero essere i dati invece del markup, ma tutto ciò che vedo negli esempi è che è solo usato come wrapper per il markup, quindi non c'è niente di guadagnato lì.

Voglio essere in grado di avere un block--MYMODULE--DELTA.tpl.phpnel mio tema, ma come posso chiamarlo e come posso passare i dati al blocco?


blog dettagliato: goo.gl/kD3TZu
Suresh Kamrushi,

@SureshKamrushi - OP richiede un blocco a tema. L'articolo collegato riguarda l'aggiunta di una nuova regione a un tema. Questo non è ciò che l'OP ha richiesto.
leymannx,

Risposte:


27

Il modo in cui lo faccio è il seguente ...

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,
        ],
      ],
  ];
}

E quindi in una sottocartella del modulo chiamata themedovrebbe esserci un file chiamato my-template.tpl.phpche potrebbe contenere questo:

<?php 

$items = $variables['items'];

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

E se lo desideri, potresti effettivamente sovrascrivere l'implementazione del modulo "predefinita" che hai appena creato my-module.tpl.phpnel tuo tema come desideri block--MYMODULE--DELTA.tpl.php.


Ma se esagero sul tema con un file tpl.php nel mio tema, hook_block_view non verrà eseguito e le mie variabili non verranno assegnate al file temmplate.
yunzen

@yunzen - Potrebbe essere necessario svuotare la cache, provare ad andare admin/config/development/performancee fare clic sul clear cachepulsante. Puoi anche cancellare la cache usando drush, ad esempiodrush cc all
ciclico

6

Prova il modulo Developer Theme . Dopo averlo abilitato, puoi selezionare una casella nell'angolo in basso a sinistra della tua pagina Drupal. Successivamente puoi fare clic sul blocco e ottenere informazioni utili considerando il tema. Ad esempio, puoi vedere le possibili denominazioni dei file .tpl.php per il tuo blocco.

Scegli uno di quei nomi. Il primo è il più specifico. Temerà solo un blocco. Crea un file con quel nome nella cartella del tuo tema se non è già presente. Puoi metterlo nella sottocartella se vuoi organizzarti.

Copia il contenuto di block.tpl.php nel tuo file e inizia a cambiare le cose nel modo in cui vuoi che siano.

Salva il tuo file, svuota le cache e ricarica la pagina.


5

Esistono già diverse risposte a questa domanda, ma ho cercato di fornire un approccio molto semplicistico. Si spera che si identifichi per sviluppare la struttura dell'array prevista da Drupal quando si restituisce il contenuto del blocco.

Per fare ciò ho suddiviso la domanda in esempi di codice separati come tali,

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

Si prega di vedere una spiegazione completa qui drupal 7 creando blocchi personalizzati a tema


3

Questo è un vecchio post, ma ho trovato una soluzione migliore per sovrascrivere i modelli di blocco da un modulo personalizzato per Drupal 7.

Aggiungi questo al tuo modulo personalizzato:

/**
 * 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;
}

Quindi è necessario il seguente codice:

/**
 * 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;
}

Tutto quello che devi fare è creare templates/block--my-custom-module.tpl.phpnella cartella del tuo modulo.

Ho scritto un tutorial su questo tutorial Drupal - Come sovrascrivere un modello a blocchi da un modulo personalizzato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.