कैसे एक कस्टम ब्लॉक थीम के लिए


26

मैं एक ब्लॉक बना लिए उपयोग करते हुए hook_block_infoऔर hook_block_themeऔर की तरह। लेकिन मैं इसे कैसे थीम दे सकता हूं?

मेरे पास कुंजियों के साथ एक सरणी वापस करने के लिए यह काम कर रहा है 'subject'और 'content'। लेकिन मैंने सीधे hook_block_view()हुक में मार्कअप बनाया और यही मैं नहीं चाहता।

डॉक्स में यह कहा गया है कि सामग्री अधिमानतः रेंडर योग्य सरणी के रूप में वापस आनी चाहिए और मार्कअप के रूप में नहीं। लेकिन यह रेंडर करने योग्य सरणी क्या है ? वे कहते हैं कि यह मार्कअप के बजाय डेटा होना चाहिए, लेकिन मैं सभी उदाहरणों में देखता हूं कि यह सिर्फ मार्कअप के लिए एक आवरण के रूप में उपयोग किया जाता है, इसलिए वहां कुछ भी प्राप्त नहीं हुआ।

मैं block--MYMODULE--DELTA.tpl.phpअपने विषय में सक्षम होना चाहता हूं, लेकिन मैं इसे कैसे कॉल कर सकता हूं और मैं डेटा को ब्लॉक में कैसे पास कर सकता हूं?


विस्तार ब्लॉग: goo.gl/kD3TZu
सुरेश कमरुशी

@ सुरेश कामरुशी - ओपी ने उन्हें एक ब्लॉक देने के लिए कहा। जुड़ा हुआ लेख एक विषय में एक नया क्षेत्र जोड़ने के बारे में है। ओपी ने जो मांगा वह नहीं है।
लीमैनक्स

जवाबों:


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.phpअपनी थीम में अपनी इच्छानुसार बनाया था block--MYMODULE--DELTA.tpl.php


लेकिन अगर मैं अपने विषय में tpl.php फ़ाइल के साथ विषय को ओवरले करता हूं, तो हुक_ब्लॉक_व्यू निष्पादित नहीं होगा और मेरे चर टेम्प्लेट फ़ाइल को नहीं दिए गए हैं।
यंगज़ेन

@ यूएनज़ेन - आपको कैश खाली करने की आवश्यकता हो सकती है, बटन पर admin/config/development/performanceक्लिक करके जाने की कोशिश clear cacheकरें। आप ड्रश का उपयोग करके कैश को भी साफ कर सकते हैंdrush cc all
साइक्लोनबॉस

6

थीम डेवलपर मॉड्यूल आज़माएं । जब आप इसे सक्षम कर लेते हैं तो आप Drupal पेज के निचले बाएँ कोने में एक चेकबॉक्स देख सकते हैं। उसके बाद आप अपने ब्लॉक पर क्लिक कर सकते हैं और थीम पर विचार करके उपयोगी जानकारी प्राप्त कर सकते हैं। आप उदाहरण के लिए अपने ब्लॉक के लिए .tpl.php फ़ाइल नामांक देख सकते हैं।

उन नामों में से एक चुनें। पहला सबसे विशिष्ट है। यह केवल एक ब्लॉक को थीम देगा। अपने थीम फ़ोल्डर में उस नाम के साथ एक फ़ाइल बनाएं यदि यह पहले से ही नहीं है। यदि आप व्यवस्थित करना चाहते हैं तो आप इसे सबफ़ोल्डर में रख सकते हैं।

अपनी फ़ाइल में block.tpl.php की सामग्री को कॉपी करें और चीजों को उस तरह से बदलना शुरू करें जैसा आप उन्हें चाहते हैं।

अपनी फ़ाइल सहेजें, कैश साफ़ करें और पृष्ठ को पुनः लोड करें।


5

इस प्रश्न के लिए पहले से ही कई उत्तर हैं लेकिन मैंने बहुत ही सरल दृष्टिकोण प्रदान करने की कोशिश की है। अपने ब्लॉक सामग्री को वापस करते समय ड्रुपल द्वारा अपेक्षित सरणी संरचना को पहचानने की उम्मीद है।

ऐसा करने के लिए मैंने प्रश्न को अलग-अलग कोड उदाहरणों में तोड़ दिया है, जैसे कि,

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

कृपया पूर्ण विवरण यहां देखें ड्रुपल 7 थीम पर आधारित कस्टम ब्लॉक बना रहा है


3

यह एक पुरानी पोस्ट है, लेकिन मैंने ड्रुपल 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 के बारे में एक ट्यूटोरियल लिखा है - कस्टम मॉड्यूल से ब्लॉक टेम्प्लेट को ओवरराइड कैसे करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.