কীভাবে দ্রুপালকে মডিউল ডিরেক্টরিতে টেম্পলেটগুলি সন্ধান করতে বলুন?


11

আমি আমার মডিউলে টেম্পলেট বাস্তবায়ন সরবরাহ করতে এবং থিমগুলিকে এটিকে ওভাররাইড করার অনুমতি দিতে চাই। মূলত, আমি এই সরলীকৃত কোড দ্বারা একটি পরামর্শ যুক্ত:

function attach_preprocess_node(&$vars) {
  $vars['theme_hook_suggestions'][] = 'node__test';
}

(আমি কোনও নতুন থিম যুক্ত করতে হুক_থিম ব্যবহার করতে চাই না কারণ আমি প্রিপ্রসেস নোড ফাংশনগুলি পুনরায় ব্যবহার করতে চাই The থিমের নামটি বিশিষ্ট তবে নোডের সাথে বিভ্রান্তি এড়াতে আমি নোড_ সংযুক্তি _% লিখতে চাই না ))

তারপরে আমি মডিউল পথ যুক্ত করতে হুক_থেম_গ্রিজি_াল্টার () ব্যবহার করি:

function attach_theme_registry_alter(&$theme_registry) {
  $path = drupal_get_path('module', 'attach') . '/themes';
  $theme_registry_copy = $theme_registry;
  _theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'node', drupal_get_path('module', 'node'));
  $theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
  if (!isset($theme_registry['node']['theme paths'])) {
    $theme_registry['node']['theme paths'] = array();
  }
  if (!isset($theme_registry['node']['theme paths'])) {
    $first_element = array_shift($theme_registry['node']['theme paths']);
    if ($first_element) {
      array_unshift($theme_registry['node']['theme paths'], $first_element, $path);
    }
    else {
      array_unshift($theme_registry['node']['theme paths'], $path);
    }
  }
}

যাইহোক, এটা কাজ করে না. তার অর্থ: ফাইল থিম / নোড - সুপার.tpl.php ব্যবহৃত হয় না। আমি এটি থিম ফোল্ডারে অনুলিপি করলেই এটি ব্যবহৃত হয়।


স্পষ্টকরণ: আমি চাই দ্রুপাল কোড দ্বারা সংজ্ঞায়িত টেম্পলেটটির জন্য মডিউল ডিরেক্টরিতে (এবং থিম ডিরেক্টরিতেও) সন্ধান করতে চান (এখানে: নোড টেম্পলেট)। আমি কোনও নতুন টেম্পলেট সংজ্ঞায়িত করতে চাই না।
jcisio

উত্তর:


5

মূলত আপনি hook_theme()রেজিস্ট্রি পরিবর্তন না করে প্রয়োগ করে নিজেকে কিছুটা মাথা ব্যথা বাঁচাতে পারেন ।

আমি উদাহরণগুলির প্রকল্পের theming_example একবার দেখার পরামর্শ দিই , সম্ভবত এই পৃষ্ঠায় বিশেষত সহায়ক কোড সহ, এই এপিআই ডক পৃষ্ঠায় হস্তে পুনরুত্পাদন করা হয়েছে ।

function theming_example_list_page() {
  $items = array(
    t('First item'),
    t('Second item'),
    t('Third item'),
    t('Fourth item'),
  );

  // First we'll create a render array that simply uses theme_item_list.
  $title = t("A list returned to be rendered using theme('item_list')");
  $build['render_version'] = array(
    // We use #theme here instead of #theme_wrappers because theme_item_list()
    // is the classic type of theme function that does not just assume a
    // render array, but instead has its own properties (#type, #title, #items).
    '#theme' => 'item_list',
    // '#type' => 'ul',  // The default type is 'ul'
    // We can easily make sure that a css or js file is present using #attached. 
    '#attached' => array('css' => array(drupal_get_path('module', 'theming_example') . '/theming_example.css')), 
    '#title' => $title, 
    '#items' => $items, 
    '#attributes' => array('class' => array('render-version-list')),
  );

  // Now we'll create a render array which uses our own list formatter,
  // theme('theming_example_list').
  $title = t("The same list rendered by theme('theming_example_list')");
  $build['our_theme_function'] = array(
    '#theme' => 'theming_example_list', 
    '#attached' => array('css' => array(drupal_get_path('module', 'theming_example') . '/theming_example.css')), 
    '#title' => $title, 
    '#items' => $items,
  );
  return $build;
}

এটি ড্রুপাল 7 এর জন্য সমস্ত।


আমি যেমন প্রশ্নে বলেছি, আমি হুক_থেম () ব্যবহার করতে চাই না কারণ নোড টেমপ্লেটে $ ভেরিয়েবলগুলি পুনরায় ব্যবহার করতে চাই। এই ভেরিয়েবলগুলি অনেক মডিউল যারা আমার থিমের অস্তিত্ব জানেন না তাদের হুক_ (প্রাক) প্রক্রিয়ায় উত্পন্ন হয় (যদি আমি এটির সংজ্ঞা দিই)।
jcisio

আপনি কোনও থিমটি যেভাবে সংজ্ঞায়িত করেছেন তা হুক _ থিম () সহ। :-) আপনি তাদের hook_theme () মধ্যে ফাংশন সংজ্ঞায়িত করতে পারেন। আপনার যা কিছু ইচ্ছা তাদের নাম দিন। আপনি চাইলে শিম ফাংশন করুন। এপিআই ডক্স: "হুক_থেম_হুক () ... কেবল তখনই ব্যবহার করা উচিত যখন কোনও মডিউলে থিম হুকের সংজ্ঞা না দেয় তবে প্রিপ্রোসেসিং থিমকে ওভাররাইড করতে বা যুক্ত করতে হবে" "
পল-মি

আমি কোনও থিম সংজ্ঞায়িত করতে চাই না। আপনি যদি 'থিম' পুনরায় ব্যবহারের পরিবর্তে আপনার থিম 'মাইনোড' সংজ্ঞায়িত করেন তবে আপনার .tpl.php ফাইলে কোনও পরিবর্তনশীল নেই।
jcisio

1
এটি সত্য বলে মনে হচ্ছে না: থিম কলগুলি সংশ্লেষপূর্ণ তাই প্রয়োগকরণের hook_themeআপনাকে $existingপ্যারামিটার দেওয়া উচিত যা আপনাকে এটিকে ওভাররাইড না করে জিনিসটি সংশোধন করতে দেয়। যদি এটি না হয় তবে সম্ভবত আপনি একটি বাগ মারছেন।
কাউন্টজারো

@ অ্যাকাউন্টজারো যখন আপনি কোনও থিম নোড_আটাচ ঘোষণা করেন, তারপরে সমস্ত হুক_প্রিপ্রসেস_নোড ফাংশন আপনার নতুন থিমের সাথে ঘটবে না। অর্থাৎ আপনার নোড-সংযুক্ত.টিপিএল.পিপি তে আপনার কিছুই নেই।
jcisio

5

সম্ভবত এটি কাজ করে:

/**
 * Implements hook_theme().
 */
function MODULE_theme($existing, $type, $theme, $path) {
  return array (
    'node__CONTENTTYPE' => array (
      'variables' => array( . . . ),
      'template' => 'node--CONTENTTYPE' ,
      'base hook' => 'node',
      'path' => drupal_get_path('module', 'MODULE'),
    ),
  );
}

এখানে গুরুত্বপূর্ণ ' বেস হুক ' কী ।


এখানে নথিপত্র যুক্ত করার জন্য সমস্যাটি এখানে রয়েছে base hook: drupal.org/node/2106635
অ্যান্ডি

+1 আপভোট - এটি এবং আমার কাজ করার মতো বাটিগোটিক্স থেকে প্রাপ্ত ডাইরিভেটিভ উত্তর। ধন্যবাদ।
therobyouknow

2

আমি দশোহক্সার হুক_থমে প্রয়োগের সমাধানটি পছন্দ করি তবে এটি কাজ করতে সক্ষম হয় নি। আরও কিছু গুগল করার পরে আমি একটি ভিন্নতা পেয়েছি যা আমার পক্ষে ভাল কাজ করেছে:

/**
 * Implements hook_theme().
 */
function mymodule_theme($existing, $type, $theme, $path) {
  $theme = array();
  $theme['node__blog_post'] = array(
    'render element' => 'content',
    'base hook' => 'node',
    'template' => 'node--blog_post',
    'path' => drupal_get_path('module', 'mymodule') . '/templates',
   );
  return $theme;
}

দ্রষ্টব্য: আমার কাস্টম মডিউলটিকে 'মাইমডিউল' বলা হয় এবং আমার কাস্টম সামগ্রীর ধরণটিকে 'ব্লগ_পোস্ট' বলা হয়। আমি যে টিপিএল.পিএফ ব্যবহার করি সেটিকে 'নোড - ব্লগ_পোস্ট.টিপিএল.পিপি' বলা হয় এবং এটি আমার মডিউলটির 'টেম্পলেটগুলি' সাব ফোল্ডারে অবস্থিত।


+1 ধন্যবাদ আমি এটি কাজ করতে পেলাম। আপনি যদি নিজের কাস্টম মডিউলের ভিতরে টেমপ্লেট.পিএফপি ফাংশনগুলিকে ওভাররাইড করতে আগ্রহী হন তবে একবার দেখুন: snugug.com/musings/override-theme-funitions-drupal-7-module - আমি এটি খুব ভালভাবে কাজ করতে পেলাম
therobyouknow

2

আমার "কাস্টম_মডিউল" এর "টেমপ্লেট" ফোল্ডারে সঞ্চিত ভিউ টেম্পলেটগুলি ঘোষণার জন্য এখানে আমার স্নিপেটটি রয়েছে:

/**
 * Implements hook_theme_registry_alter().
 */
function custom_module_theme_registry_alter(&$theme_registry) {
  $extension   = '.tpl.php';
  $module_path = drupal_get_path('module', 'custom_module');
  $files       = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');

  foreach ($files as $file) {
    $template = drupal_basename($file->filename, $extension);
    $theme    = str_replace('-', '_', $template);
    list($base_theme, $specific) = explode('__', $theme, 2);

    // Don't override base theme.
    if (!empty($specific) && isset($theme_registry[$base_theme])) {
      $theme_info = array(
        'template'   => $template,
        'path'       => drupal_dirname($file->uri),
        'variables'  => $theme_registry[$base_theme]['variables'],
        'base hook'  => $base_theme,
        // Other available value: theme_engine.
        'type'       => 'module',
        'theme path' => $module_path,
      );

      $theme_registry[$theme] = $theme_info;
    }
  }
}

আশা করি এটি কাউকে সাহায্য করবে।


আমার সময় বাঁচিয়েছে এছাড়াও কাজ করে এবং
ডি

-1

আমি স্ট্যাক ওভারফ্লোতে একবার এটি জিজ্ঞাসা করেছি । মূলত, hook_theme_registry_alter()আপনার পথটি থিম হুক টেম্পলেট পথে যুক্ত করার জন্য আপনাকে প্রয়োগ করতে হবে; তারপরে, hook_enable()আপনি থিম রেজিস্ট্রি ক্যাশে সাফ করতে এবং টেমপ্লেটগুলির জন্য আপনার পাথ স্ক্যান করার জন্য ড্রপাল_থেম_রেবিল্ড () কল করেন ।


হয়তো আপনাকে পিছনে রাখা কেবল ক্যাশে সাফ করছে।
কপি ইথেরিয়েল

সুতরাং, মূলত একই সমাধান। আমি "ড্রাশ সিসি সমস্ত" 50 বারের চেয়ে কম নয় চেষ্টা করেছি, এটি কোনও নতুন ইনস্টল সাইটে ইত্যাদির জন্য সফলতা ছাড়াই পরীক্ষা করেছি। আমি আমার কোডটি একটি সর্বনিম্ন মডিউলে সংশোধন ও সংযোগ করব যাতে প্রত্যেকে পরীক্ষা করতে পারে।
jcisio

hook_enable()যখন একটি মডিউল সক্ষম হয়; মডিউলটি ইতিমধ্যে সক্ষম থাকলে তা অবশ্যই অক্ষম করা উচিত এবং তারপরে আবার সক্ষম করা হবে enabled
কিমলালুনো

@ কাইমালালুনো: আমি ক্যাচগুলি সাফ করতে হুক_ইনবেল ব্যবহার করে, যদি এটি ইতিমধ্যে ইনস্টল করা থাকে তবে ব্যবহারকারীরা কেবল ক্যাশেগুলি ম্যানুয়ালি সাফ করতে পারেন।
ক্যাপি ইথেরিল

কোন , -1 পয়েন্ট। সমাধানটি এত পুরানো (২০০৯), আমি এমনকি নিশ্চিত নই যে এটি ডি 7 এর জন্য বোঝানো হয়েছিল। আপনার পুরানো সমাধান দর্শনের জন্য তৈরি করা হয়েছে, এটি অ-দর্শন পরিস্থিতিতে নয়, যেখানে বিকাশকারীরা তাদের মডিউলগুলিতে প্রতি থিম কী অনুসারে 1 টির বেশি ডিফল্ট টেম্পলেট প্যাক করতে চাইতে পারে for একটি একক থিম কী এর জন্য 100 গতিশীল থিম পরামর্শের জন্য আপনার সমাধানটি বাস্তবায়নের কল্পনা করুন। দর্শনের প্রসঙ্গে বাইরে প্রয়োগ করা হয়েছে আমি আপনার সমাধানটিকে একটি পাল্টা ধাঁচ বলব।
অপেশাদার বারিস্তা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.