Özel bir bloğun teması


26

Ben kullanarak bir blok oluşturduk hook_block_infove hook_block_themeve gibi. Ama nasıl temayabilirim?

Bunun tuşlarıyla bir dizi dönmek için çalışma var 'subject've 'content'. Ama işaretlemeyi doğrudan hook_block_view()kancanın içinde yarattım ve istediğim de bu değildi.

Dokümanlarda, içeriğin tercihen rende edilebilir bir dizi olarak değil, işaretleme olarak döndürülmesi gerektiği söylenir . Ama bu keşfedilebilir dizi nedir? İşaretleme yerine veri olması gerektiğini söylüyorlar, ancak örneklerde gördüğüm tek şey işaretleme için sadece bir sarmalayıcı olarak kullanılması, bu yüzden orada hiçbir şey kazanılmamış.

Temamda bir block--MYMODULE--DELTA.tpl.phpyer alabilmek istiyorum ancak onu nasıl arayabilirim ve verileri bloğa nasıl aktarabilirim?


ayrıntılı blog: goo.gl/kD3TZu
Suresh Kamrushi

@SureshKamrushi - OP, bir bloğa girmelerini ister. Bağlantılı makale bir temaya yeni bir bölge eklemekle ilgilidir. OP istediği şey bu değil.
leymannx,

Yanıtlar:


27

Bunu yapma şeklim şu;

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

Ve sonra modülünüzdeki bir alt klasörde, içinde themebuna my-template.tpl.phpsahip olabilecek bir dosya bulunmalıdır :

<?php 

$items = $variables['items'];

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

Ve eğer istersen, aslında my-module.tpl.phptemanın içinde istediğin gibi yaptığın "varsayılan" modül uygulamasının üzerine yazabilirsin block--MYMODULE--DELTA.tpl.php.


Ancak temayı temamda bir tpl.php dosyasıyla değiştirirsem, hook_block_view çalışmaz ve değişkenlerim temmplate dosyasına verilmez.
yunzen

@yunzen - Önbelleğinizi boşaltmanız, gitmeyi denemeniz admin/config/development/performanceve clear cachedüğmeyi tıklatmanız gerekebilir . Ayrıca önbelleği drush ie kullanarak da silebilirsinizdrush cc all
Cyclonecode

6

Tema Geliştirici modülünü deneyin . Etkinleştirdiğinizde, Drupal sayfanızın sol alt köşesindeki bir onay kutusunu işaretleyebilirsiniz. Bundan sonra, bloğunuza tıklayabilir ve onları dikkate alarak yararlı bilgiler alabilirsiniz. Örneğin, bloğunuz için olası .tpl.php dosya adlarını görebilirsiniz.

Bu isimlerden birini seç. Birincisi en belirgin olanıdır. Sadece bir blok tema olacaktır. Zaten orada değilse, tema adınızda bu ada sahip bir dosya oluşturun. Organize olmak istiyorsanız, onu alt klasöre koyabilirsiniz.

İçeriğini kopyala Block.tpl.php dosyanıza istediğiniz şekilde değişiklik yapmaya başlayın.

Dosyanızı kaydedin, önbellekleri silin ve sayfayı yeniden yükleyin.


5

Bu soru için zaten çok sayıda cevap var ama çok basit bir yaklaşım sunmaya çalıştım. Drupal'ın blok içeriğinizi döndürürken beklediği dizi yapısını geliştirmeyi umarım.

Bunu yapmak için, soruyu ayrı kod örneklerine böldüm;

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

Lütfen burada tam bir açıklamaya bakın drupal 7 temaları özel bloklar oluşturma


3

Bu eski bir yazı, ancak Drupal 7 için özel bir modülden blok şablonları geçersiz kılmak için daha iyi bir çözüm buldum.

Bunu özel modülüne ekle:

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

O zaman takip koduna ihtiyacınız var:

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

Tek yapmanız gereken oluşturmak templates/block--my-custom-module.tpl.php modülünüzün klasörünün içinde .

Bu Drupal Tutorial hakkında bir eğitim yazdım - Özel Bir Modülden Blok Şablonlarını Geçersiz Kılma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.