কীভাবে কাস্টম ব্লক থিম করবেন


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

থিম বিকাশকারী মডিউল চেষ্টা করুন । আপনি এটি সক্ষম করে নেওয়ার পরে আপনার ড্রুপাল পৃষ্ঠার নীচে বাম কোণে একটি চেকবক্স চেক করতে পারেন। এর পরে আপনি আপনার ব্লকে ক্লিক করতে পারেন এবং সেগুলি বিবেচনা করে দরকারী তথ্য পেতে পারেন। উদাহরণস্বরূপ আপনি আপনার ব্লকের জন্য সম্ভাব্য .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আপনার মডিউলটির ফোল্ডারের ভিতরে তৈরি করা ।

আমি এই ড্রুপাল টিউটোরিয়াল সম্পর্কে একটি টিউটোরিয়াল লিখেছি - কাস্টম মডিউল থেকে একটি ব্লক টেমপ্লেটগুলি কীভাবে ওভাররাইড করা যায়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.