วิธีการธีมบล็อกที่กำหนดเอง


26

ฉันสร้างบล็อกโดยใช้hook_block_infoและไม่hook_block_themeชอบ แต่ฉันจะกำหนดธีมได้อย่างไร

ฉันมีมันทำงานเพื่อกลับอาร์เรย์ด้วยปุ่มลูก ๆและ'subject' 'content'แต่ฉันสร้างมาร์กอัปในhook_block_view()เบ็ดโดยตรงและนั่นไม่ใช่สิ่งที่ฉันต้องการ

ในเอกสารมีการกล่าวว่าเนื้อหาควรกลับมาเป็นอาร์เรย์ที่แสดงผลได้ดีกว่าไม่ใช่มาร์กอัป แต่สิ่งนี้คืออาร์เรย์ renderable ? พวกเขาบอกว่ามันควรจะเป็นข้อมูลแทนที่จะเป็นมาร์กอัป แต่สิ่งที่ฉันเห็นในตัวอย่างคือมันใช้เพื่อเป็นมาร์กอัปสำหรับมาร์กอัปดังนั้นจึงไม่มีอะไรที่จะได้รับ

ฉันต้องการที่จะมีblock--MYMODULE--DELTA.tpl.phpในชุดรูปแบบของฉัน แต่ฉันจะเรียกมันได้อย่างไรและฉันจะส่งผ่านข้อมูลไปยังบล็อกได้อย่างไร?


บล็อกรายละเอียด: goo.gl/kD3TZu
Suresh Kamrushi

@SureshKamrushi - OP ขอให้บล็อกเหล่านั้นปิด บทความที่เชื่อมโยงนั้นเกี่ยวกับการเพิ่มพื้นที่ใหม่ให้กับธีม ซึ่งไม่ใช่สิ่งที่ OP ขอ
leymannx

คำตอบ:


27

วิธีที่ฉันทำมีดังนี้ ...

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

จากนั้นในโฟลเดอร์ย่อยในโมดูลของคุณที่เรียกว่าthemeควรมีไฟล์ที่เรียกว่าmy-template.tpl.phpอาจมีสิ่งนี้ในมัน

<?php 

$items = $variables['items'];

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

และถ้าคุณต้องการที่จะคุณจริงสามารถเขียนทับ "เริ่มต้น" การใช้โมดูลคุณเพิ่งทำสำหรับในธีมของคุณตามที่คุณต้องการในmy-module.tpl.phpblock--MYMODULE--DELTA.tpl.php


แต่ถ้าฉัน overule ชุดรูปแบบด้วยไฟล์ tpl.php ในชุดรูปแบบของฉัน hook_block_view จะไม่ดำเนินการและตัวแปรของฉันจะไม่ถูกกำหนดให้กับไฟล์ temmplate
yunzen

@yunzen - คุณอาจต้องล้างข้อมูลแคชแล้วลองไปที่admin/config/development/performanceและคลิกclear cacheปุ่ม คุณสามารถล้างแคชโดยใช้drush cc all
drush

6

ลองโมดูลTheme Developer เมื่อคุณเปิดใช้งานคุณสามารถทำเครื่องหมายในช่องที่มุมล่างซ้ายของหน้า Drupal หลังจากนั้นคุณสามารถคลิกที่บล็อกของคุณและรับข้อมูลที่เป็นประโยชน์ในการพิจารณาชุดรูปแบบ คุณสามารถดูตัวอย่างไฟล์. tpl.php ที่เป็นไปได้สำหรับบล็อกของคุณ

เลือกหนึ่งในชื่อเหล่านั้น ที่แรกก็คือคนที่เฉพาะเจาะจงที่สุด มันจะธีมเพียงหนึ่งช่วงตึก สร้างไฟล์ที่มีชื่อนั้นในโฟลเดอร์ธีมของคุณหากยังไม่มีอยู่ คุณสามารถวางไว้ในโฟลเดอร์ย่อยหากคุณต้องการจัดระเบียบ

คัดลอกเนื้อหาของblock.tpl.phpในไฟล์ของคุณและเริ่มเปลี่ยนสิ่งต่าง ๆ ในแบบที่คุณต้องการ

บันทึกไฟล์ของคุณล้างแคชและโหลดหน้าซ้ำ


5

มีคำตอบสำหรับคำถามนี้อยู่แล้วจำนวนหนึ่ง แต่ฉันพยายามที่จะให้วิธีการที่ง่ายมาก หวังว่าจะระบุ devs โครงสร้างอาร์เรย์ที่ Drupal คาดไว้เมื่อส่งคืนเนื้อหาบล็อกของคุณ

ในการทำเช่นนี้ฉันได้แยกคำถามออกเป็นตัวอย่างรหัสแยกเช่น

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

โปรดดูคำอธิบายแบบเต็มได้ที่นี่drupal 7 สร้างบล็อกที่กำหนดเอง


3

นี่เป็นโพสต์เก่า แต่ฉันได้พบทางออกที่ดีกว่าสำหรับการแทนที่เทมเพลตบล็อกจากโมดูลที่กำหนดเองสำหรับ Drupal 7

เพิ่มไปยังโมดูลที่กำหนดเองของคุณ:

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

จากนั้นคุณต้องใช้รหัสติดตาม:

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

สิ่งที่คุณต้องทำคือสร้างtemplates/block--my-custom-module.tpl.phpในโฟลเดอร์โมดูลของคุณ

ฉันเขียนบทช่วยสอนเกี่ยวกับDrupal Tutorialนี้- วิธีการแทนที่เทมเพลต Block จากโมดูลที่กำหนดเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.