मॉड्यूल निर्देशिका में टेम्प्लेट देखने के लिए ड्रुपल को कैसे बताएं?


11

मैं अपने मॉड्यूल में टेम्पलेट कार्यान्वयन प्रदान करना चाहता हूं और थीम को ओवरराइड करने की अनुमति देता हूं। मूल रूप से, मैं इस सरलीकृत कोड द्वारा एक सुझाव जोड़ता हूं:

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

(मैं एक नया विषय जोड़ने के लिए हुक_टैम का उपयोग नहीं करना चाहता हूं क्योंकि मैं प्रीप्रोसेस नोड कार्यों का पुन: उपयोग करना चाहता हूं। थीम का नाम अजीब है लेकिन मैं नोड प्रकार के साथ भ्रम से बचने के लिए नोड_ संलग्न करना नहीं चाहता हूं ।)

फिर मैं मॉड्यूल पथ को जोड़ने के लिए hook_theme_registry_alter () का उपयोग करता हूं:

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);
    }
  }
}

हालांकि यह काम नहीं करता है। इसका मतलब है: फ़ाइल थीम / नोड - super.tpl.php का उपयोग नहीं किया जाता है। इसका उपयोग केवल तभी किया जाता है जब मैंने इसे थीम फ़ोल्डर में कॉपी किया हो।


स्पष्टता: मैं चाहता हूं कि ड्रुपल कोड द्वारा परिभाषित टेम्पलेट (यहां: नोड टेम्पलेट) के लिए मॉड्यूल निर्देशिका (और थीम निर्देशिकाओं में भी) को देखें। मैं एक नए टेम्पलेट को परिभाषित नहीं करना चाहता।
jcisio

जवाबों:


5

मूल रूप से आप hook_theme()रजिस्ट्री को बदलने के बजाय लागू करके खुद को थोड़ा सिरदर्द से बचा सकते हैं ।

मेरा सुझाव है कि थीम प्रोजेक्ट में थीमिंग_एक्सप्लिमेंट पर एक नज़र डालें, जो इस एपीआई डॉक्स पेज पर विशेष रूप से उपयोगी कोड के साथ इस पृष्ठ पर पुन: प्रस्तुत किया गया है ।

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

जिस तरह से आप एक विषय को परिभाषित करते हैं ... हुक_टैम () के साथ है। :-) आप थीमिंग फ़ंक्शंस को हुक_टैम () में परिभाषित कर सकते हैं। उन्हें अपनी इच्छानुसार कुछ भी नाम दें। यदि आप चाहें तो शिम कार्य करें। API डॉक्स: "hook_theme_HOOK () ... केवल तभी उपयोग किया जाना चाहिए जब किसी मॉड्यूल को ओवरराइड करने या थीम हुक के लिए प्रीप्रोसेसिंग में जोड़ने की आवश्यकता होती है जो इसे परिभाषित नहीं करता था।"
पउल-एम।

मैं एक विषय को परिभाषित नहीं करना चाहता। यदि आप 'नोड' का पुन: उपयोग करने के बजाय अपने विषय 'mynode' को परिभाषित करते हैं, तो आपके पास .tpl.php फ़ाइल में कोई चर नहीं है।
jcisio

1
यह सच नहीं लगता है: थीम कॉल संचयी हैं, इसलिए इसे लागू करने से hook_themeआपको $existingपैरामीटर दिया जाना चाहिए जो आपको इस चीज़ को संशोधित करने की अनुमति देता है, इसे ओवरराइड करने की नहीं। अगर ऐसा नहीं है तो शायद आप बग को मार रहे हैं।
काउंट्ज़ेरो

@Countzero जब आप एक थीम नोड_टैच की घोषणा करते हैं, तो सभी हुक_परप्रोसेसर_नोड फ़ंक्शन आपके नए विषय के साथ नहीं होंगे। यानी आपके पास अपने नोड-अटैचमेंट में कुछ भी नहीं है। tpl.php।
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 अपवोट - यह और बैटिगोटिक्स I से व्युत्पन्न उत्तर मुझे काम करने के लिए मिला। धन्यवाद।
उपराष्ट्रपति

2

मुझे Hook_theme कार्यान्वयन का डैशोहोक्सा समाधान पसंद है लेकिन यह काम करने में सक्षम नहीं था। कुछ और गुगली करने के बाद मुझे एक भिन्नता मिली जिसने मेरे लिए अच्छा काम किया :

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

नोट्स: मेरे कस्टम मॉड्यूल को 'mymodule' कहा जाता है और मेरे कस्टम सामग्री प्रकार को 'blog_post' कहा जाता है। मेरे द्वारा उपयोग किए जाने वाले tpl.php को 'नोड - blog_post.tpl.php' कहा जाता है और यह मेरे मॉड्यूल के 'टेम्प्लेट' सब फ़ोल्डर में स्थित होता है।


+1 धन्यवाद मुझे यह काम करने के लिए मिला। यदि आप अपने कस्टम मॉड्यूल के अंदर टेम्प्लेट को ओवरराइड करने में भी रुचि रखते हैं, तो एक नज़र डालें: snugug.com/musings/override-theme-functions-drupal-7-module - मुझे यह अच्छी तरह से काम करने के लिए मिला
therobyouknow

2

यहाँ मेरे स्निपेट को मेरे "custom_module" के "टेम्प्लेट" फ़ोल्डर में संग्रहीत विचारों को दिखाने की घोषणा है:

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

आशा है कि यह किसी की मदद करता है।


मेरा समय बचाया। इसके अलावा काम करता है और d8 के लिए आवश्यक
Mykola Mykolayovich Dolynskyi

-1

मैंने स्टैक ओवरफ्लो पर एक बार यह पूछा । मूल रूप से, आपको hook_theme_registry_alter()अपने रास्ते को थीम हुक टेम्पलेट पथ में शामिल करने के लिए कार्यान्वित करना होगा; फिर, hook_enable()आप विषय रजिस्ट्री कैश को खाली करने और टेम्प्लेट के लिए अपना पथ स्कैन करने के लिए drupal_theme_rebuild () कॉल करते हैं।


हो सकता है कि जो आपको वापस पकड़ रहा है वह सिर्फ कैश को साफ कर रहा हो।
कैपि एथरियल

तो, मूल रूप से एक ही समाधान। मैंने "ड्रक सीसी ऑल" को 50 बार से कम नहीं करने की कोशिश की, इसे बिना किसी सफलता के एक नई स्थापित साइट आदि पर परीक्षण किया। मैं अपने कोड को कम से कम मॉड्यूल में संशोधित और कॉम्पैक्ट करूंगा ताकि हर कोई परीक्षण कर सके।
jcisio

hook_enable()जब मॉड्यूल सक्षम किया जाता है, तब इसे लागू किया जाता है; यदि मॉड्यूल पहले से सक्षम है, तो उसे अक्षम किया जाना चाहिए, और फिर फिर से सक्षम होना चाहिए।
kiamlaluno

@kiamlaluno: ḿ caches को साफ़ करने के लिए हुक_ जेनबल का उपयोग करना, यदि यह पहले से ही स्थापित है तो उपयोगकर्ता केवल कैश को मैन्युअल रूप से साफ़ कर सकता है।
Capi Etheriel

नहीं , -1 अंक। यह समाधान इतना पुराना है (2009), मुझे यकीन नहीं है कि यह डी 7 के लिए था। जबकि आपका पुराना समाधान दृश्यों के लिए अनुकूल है, यह गैर-दृश्य स्थितियों के लिए आदर्श नहीं है, जहां डेवलपर्स अपने मॉड्यूल में थीम कुंजी प्रति 1 से अधिक डिफ़ॉल्ट टेम्पलेट के लिए पैक करना चाह सकते हैं। एक विषय कुंजी के लिए 100 गतिशील विषय सुझावों के लिए अपने समाधान को लागू करने की कल्पना करें। एक दृश्य के संदर्भ के बाहर लागू मैं आपके समाधान को प्रतिरूप कहूंगा।
शौकिया बरिस्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.