Cara tema blok khusus

26

Saya telah membuat blok menggunakan hook_block_infodan hook_block_themesejenisnya. Tapi bagaimana saya bisa tema itu?

Saya memilikinya berfungsi mengembalikan array dengan kunci 'subject'dan 'content'. Tapi saya membuat markup langsung di hook_block_view()hook dan bukan itu yang saya inginkan.

Dalam dokumen dikatakan bahwa konten sebaiknya dikembalikan sebagai array yang dapat diurai dan bukan sebagai markup. Tapi apa array yang dapat diulang ini ? Mereka mengatakan itu seharusnya data bukan markup, tetapi yang saya lihat dalam contoh adalah bahwa itu hanya digunakan sebagai pembungkus untuk markup, jadi tidak ada yang didapat di sana.

Saya ingin dapat memiliki block--MYMODULE--DELTA.tpl.phpdalam tema saya, tetapi bagaimana saya menyebutnya dan bagaimana saya bisa meneruskan data ke blok?

Yunzen
sumber
detail blog: goo.gl/kD3TZu
Suresh Kamrushi
@ SureshKamrushi - OP meminta mereka membuat blok. Artikel yang ditautkan adalah tentang menambahkan kawasan baru ke sebuah tema. Bukan itu yang diminta OP.
leymannx

Jawaban:

27

Cara saya melakukan ini adalah sebagai berikut ...

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

Dan kemudian dalam subfolder di modul Anda dipanggil themeharus ada file yang disebut my-template.tpl.phpyang bisa memiliki ini di dalamnya:

<?php 

$items = $variables['items'];

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

Dan jika Anda mau, Anda sebenarnya bisa menimpa implementasi modul "default" yang baru saja Anda buat my-module.tpl.phpdalam tema sesuai keinginan block--MYMODULE--DELTA.tpl.php.

nedwardss
sumber
Tetapi jika saya membatalkan tema dengan file tpl.php di tema saya, hook_block_view tidak akan dijalankan dan variabel saya tidak diberikan ke file temmplate.
yunzen
@yunzen - Anda mungkin perlu mengosongkan cache, coba buka admin/config/development/performancedan klik clear cachetombol. Anda juga dapat menghapus cache menggunakan drush yaitudrush cc all
Cyclonecode
6

Coba modul Pengembang Tema . Setelah diaktifkan, Anda dapat mencentang kotak di sudut kiri bawah halaman Drupal Anda. Setelah itu, Anda dapat mengklik pada blok Anda dan mendapatkan informasi yang berguna mempertimbangkan theming. Misalnya, Anda dapat melihat kemungkinan penamaan file .tpl.php untuk blok Anda.

Pilih salah satu nama itu. Yang pertama adalah yang paling spesifik. Itu hanya akan tema satu blok. Buat file dengan nama itu di folder tema Anda jika belum ada di sana. Anda dapat memasukkannya ke dalam subfolder jika Anda ingin mengaturnya.

Salin konten block.tpl.php di file Anda dan mulailah mengubah hal-hal seperti yang Anda inginkan.

Simpan file Anda, hapus cache dan muat ulang halaman.

logat
sumber
5

Sudah ada sejumlah jawaban untuk pertanyaan ini, tetapi saya telah mencoba memberikan pendekatan yang sangat sederhana. Semoga mengidentifikasi ke devs struktur array yang diharapkan oleh Drupal ketika mengembalikan konten blok Anda.

Untuk melakukan ini, saya membagi pertanyaan menjadi beberapa contoh kode terpisah,

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

Silakan lihat penjelasan lengkap di sini drupal 7 membuat blok khusus bertema

Nicolas
sumber
3

Ini adalah posting lama, tetapi saya telah menemukan solusi yang lebih baik untuk mengganti template blok dari modul khusus untuk Drupal 7.

Tambahkan ini ke modul khusus Anda:

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

Maka Anda perlu kode ikuti:

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

Yang harus Anda lakukan adalah membuat templates/block--my-custom-module.tpl.phpdi dalam folder modul Anda.

Saya telah menulis tutorial tentang Tutorial Drupal ini - Cara Mengesampingkan Blok Template dari Modul Kustom

iStryker
sumber