प्रोग्राम थीम को प्रोग्रामेटिक रूप से जोड़ना


8

मैंने एक फीचर मॉड्यूल बनाया जिसमें केवल एक दृश्य और एक सामग्री प्रकार है।

अभी मैं page-node-x.tpl.phpऔर मेरी views-view-y.tpl.phpफाइलें मेरी थीम डायरेक्टरी में हैं।

क्या उन्हें मेरे फीचर मॉड्यूल में स्थानांतरित करना संभव है?

जवाबों:


5

एक मॉड्यूल जो चर को बदलकर नई टेम्पलेट फ़ाइलों को लागू hook_preprocess_page()या hook_preprocess_node()सुझा सकता है $variables['theme_hook_suggestions']

टेम्प्लेट_परप्रोसेस_पेज () में शामिल कोड जो वैरिएबल को इनिशियलाइज़ करता है वह निम्न है।

// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
  $variables['theme_hook_suggestions'] = $suggestions;
}

प्रत्येक विषय सुझाव को हुक_टेमे () द्वारा लौटाए गए प्रविष्टि से मेल खाना चाहिए ।

दृश्य में, समान तरीके से उपयोग करने के लिए एक समान प्रीप्रोसेस फ़ंक्शन होना चाहिए, या ऐसा तरीका जो hook_preprocess_page()उस फ़ंक्शन को यह समझने की अनुमति देता है कि क्या पेज एक दृश्य के साथ जुड़ा हुआ है।


3

hook_views_api()ड्रुपल 7 में काम करने के लिए 'टेम्प्लेट फ़ाइल' कुंजी को जोड़ने का समाधान अभी तक दिखाई नहीं देता है। हालांकि, यह एक आकर्षण की तरह काम करता है:

/**
 * Implements hook_theme().
 */
function bigtexas_theme() {
  return array(
    'views_view_fields__slideshow' => array(
    'variables' => array('view' => NULL, 'options' => NULL, 'row' => NULL),
    'template' => 'views-view-fields--slideshow',
    'base hook' => 'views_view_fields',
    'path' => drupal_get_path('module', 'bigtexas') . '/theme',
  ),
 );
}

2

थीम रजिस्ट्री वह जगह है जहां Drupal सभी प्रकार की जानकारी संग्रहीत करता है कि कौन सी टेम्पलेट फ़ाइलों, थीम फ़ंक्शन आदि का उपयोग करना है। इसके साथ मेसिंग करने पर बाद में डब्ल्यूटीएफ मोमेंट हो सकता है, क्योंकि चीजें डिफॉल्ट की तरह काम नहीं करेंगी।

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


+1 - मैंने यह कोशिश की लेकिन सफलता के बिना .. क्या आप एक उदाहरण दे सकते हैं?
jantimon

@Ghommey: प्रदान किया गया लिंक उदाहरण कोड के साथ आता है, सुनिश्चित नहीं है कि इसे बेहतर तरीके से कैसे समझाया जाए।
googletorp

2

विचारों के लिए सिद्धांत में विचार टेम्पलेट्स के लिए एक तंत्र है (शायद यह सभी टेम्पलेट्स के लिए काम करता है)।

आप अपने कस्टम मॉड्यूल के अपने हुक_ साक्षात्कार_एपी कार्यान्वयन में कुंजी "टेम्पलेट पथ" सेट कर सकते हैं।

एक बार जब आपके पास यह विचार होगा, तो आप अपनी निर्दिष्ट निर्देशिका को टेम्प्लेट फ़ाइलों के लिए स्कैन करेंगे। दुखद यह है कि वर्तमान में सबसे सरल वर्तमान में विफल रहता है, इसलिए इस सुविधा को शायद ड्रुपल 7 में अभी तक पोर्ट नहीं किया गया है, लेकिन अगर कोई इसे प्राप्त करना चाहता है, तो view.module में _views_find_module_templates () देखें।


2

सबसे आसान तरीका यह है कि hook_theme_registry_alter()आप अपने मॉड्यूल के पथ को थीम पथों में शामिल करें:

function mymodule_theme_registry_alter(&$theme_registry) {
  $theme_registry['[theme hook name, ie. page or views-view]']['theme paths'][] = drupal_get_path('module', 'mymodule');
}

theme()कार्यान्वयन को देखते हुए , ऐसा नहीं लगता है कि theme pathयह एक सरणी हो सकता है। क्या आपको यकीन है कि यह काम करता है? Api.drupal.org/api/drupal/includes%21theme.inc/function/theme/7
Capi Etheriel

ऊपर मेरी टिप्पणी के बारे में: theme pathsDrupal 6 में काम करता था, लेकिन Drupal 7 ने drupal.org/node/678714 में उस व्यवहार को बदल दिया , ऐसा लगता है कि उल्लेखित मुद्दे में टिप्पणियों # 29 और # 31 से, कि मॉड्यूल से विषय सुझाव घोषित किए जाने हैं उस मॉड्यूल के hook_theme में, लेकिन यह कैसे किया जाए कि पाठक को एक अभ्यास के रूप में छोड़ दिया जाए: /
Capi Etheriel

1

कैसे प्रसंग प्रतिक्रिया थीम के साथ थोड़ा सार दृष्टिकोण के बारे में?

http://drupal.org/project/context_reaction_theme

अपने संदर्भ को सुविधाओं में लपेटें और यह निर्यात करने योग्य भी है। लेकिन शायद यह वास्तव में एक ड्रुपल गुरु प्रश्न है जो कुछ गहरा बनाने और मार्ग को जानने के लिए देख रहा है।


कोई डी 7 मॉड्यूल नहीं है और आखिरी प्रतिबद्ध डेढ़ साल पहले था।
jantimon

अभी भी मेरे Drupal 6 साइटों पर वास्तविक रूप से काम करता है :)
doublejosh 19

1

मैंने googletorp के उत्तर से शुरुआत की और एक सामान्य कार्य का निर्माण किया:

/**
 * Overrides a third-party template file with a local copy.
 *
 * To be called from hook_theme_registry_alter():
 * @code
 * function mymodule_theme_registry_alter(&$theme_registry) {
 *   // Override variant of foo template using local copy.
 *   custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
 * }
 * @endcode
 *
 * @param array $theme_registry
 *   Theme registry array as passed to hook_theme_registry_alter().
 * @param string $template
 *   Name of template file without '.tpl.php' extension. Example: 'foo--variant'.
 * @param string $path
 *   Directory to load $template from.
 * @param string $preprocess_function
 *   Optional preprocess function.
 */
function custom_override_template(&$theme_registry, $template, $path, $preprocess_function = NULL) {
  if (strpos($template, '--') !== FALSE) {
    $hook_name = array_shift(explode('--', $template));
  }
  else {
    $hook_name = $template;
  }
  $hook_name = str_replace('-', '_', $hook_name);
  if (isset($theme_registry[$hook_name])) {
    // Copy hook info.
    $hook_info = $theme_registry[$hook_name];
    $hook_info['path'] = $path;
    $hook_info['template'] = $template;
    // Add to theme registry.
    $new_hook = str_replace('-', '_', $template);
    $theme_registry[$new_hook] = $hook_info;
    // Add preprocess function.
    if(!is_null($preprocess_function)){
      $theme_registry[$new_hook]['preprocess functions'][] = $preprocess_function;
    }
    return $new_hook;
  }
  else {
    throw new Exception(t('Unknown theme hook %hook.', array('%hook' => $hook_name)));
  }
}

यह न केवल नोड की स्थिति और नाम को देखने और tpl फ़ाइलों को देखने की अनुमति देता है, बल्कि विचारों के लिए प्रीप्रोसेस फ़ंक्शन भी प्रदान करता है।

इसलिए यदि आपको अपना स्वयं का मॉड्यूल mymoduleटेम्प्लेट फ़ाइल के साथ मिला है, जैसे sites/all/modules/mymodule/templates/foo--variant.tpl.phpकि अब आप अपनी स्वयं की टेम्पलेट निर्देशिका का उपयोग करने के लिए थीम रजिस्ट्री को आसानी से संशोधित कर सकते हैं:

function mymodule_theme_registry_alter(&$theme_registry) {
   // Override variant of foo template using local copy.
   custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
}

यह Drupal को आपके मॉड्यूल फ़ोल्डर में टेम्पलेट का उपयोग करने के लिए मजबूर करता है। एक थीम इसे ओवरराइड नहीं कर पाएगी (जो इसे होना चाहिए)।
jcisio

1

जैसा कि @jcsio ने कहा, इस पृष्ठ पर स्वीकृत उत्तर काम करता है, लेकिन टेम्प्लेट को किसी विषय द्वारा ओवरराइड नहीं किया जा सकता है।

http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry एक ऐसा समाधान प्रदान करता है जिससे आप अपने मॉड्यूल (और सब-फ़ोल्डर्स) के पथ को सभी प्रकारों के लिए स्कैन कर सकते हैं .tpl.php फाइलें।

मैंने इसे थोड़ा बदल दिया, क्योंकि इसमें 'थीम पाथ्स' वेरिएबल था जो ड्रुपल 7 द्वारा उपयोग नहीं किया गया लगता है।

/**
 * Implements hook_theme_registry_alter()
**/
function mymodule_theme_registry_alter(&$theme_registry) {
  $mod_path = drupal_get_path('module', 'mymodule');
  $theme_registry_copy = $theme_registry;       // munge on a copy
  _theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'pow', $mod_path);
  $theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
}

मैंने स्वीकार किए गए उत्तर और इस समाधान दोनों की कोशिश की, उत्तरार्द्ध मेरे लिए अब तक का काम करता है!

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