जवाबों:
एक मॉड्यूल जो चर को बदलकर नई टेम्पलेट फ़ाइलों को लागू 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()
उस फ़ंक्शन को यह समझने की अनुमति देता है कि क्या पेज एक दृश्य के साथ जुड़ा हुआ है।
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',
),
);
}
थीम रजिस्ट्री वह जगह है जहां Drupal सभी प्रकार की जानकारी संग्रहीत करता है कि कौन सी टेम्पलेट फ़ाइलों, थीम फ़ंक्शन आदि का उपयोग करना है। इसके साथ मेसिंग करने पर बाद में डब्ल्यूटीएफ मोमेंट हो सकता है, क्योंकि चीजें डिफॉल्ट की तरह काम नहीं करेंगी।
वैसे भी ड्रुपल जैसी सभी चीजें हैं, एक हुक है: hook_theme_registry_alter
आप थीम रजिस्ट्री को बदलने के लिए उपयोग कर सकते हैं और यह आपकी टेम्पलेट फ़ाइलों को एक मॉड्यूल में ले जाता है। मैं ऐसा करने की सलाह नहीं दूंगा, क्योंकि यह साइट को और अधिक जटिल बनाए रखेगा। लेकिन अगर आप करना चाहते हैं, तो यह है कि यह कैसे किया जाता है।
विचारों के लिए सिद्धांत में विचार टेम्पलेट्स के लिए एक तंत्र है (शायद यह सभी टेम्पलेट्स के लिए काम करता है)।
आप अपने कस्टम मॉड्यूल के अपने हुक_ साक्षात्कार_एपी कार्यान्वयन में कुंजी "टेम्पलेट पथ" सेट कर सकते हैं।
एक बार जब आपके पास यह विचार होगा, तो आप अपनी निर्दिष्ट निर्देशिका को टेम्प्लेट फ़ाइलों के लिए स्कैन करेंगे। दुखद यह है कि वर्तमान में सबसे सरल वर्तमान में विफल रहता है, इसलिए इस सुविधा को शायद ड्रुपल 7 में अभी तक पोर्ट नहीं किया गया है, लेकिन अगर कोई इसे प्राप्त करना चाहता है, तो view.module में _views_find_module_templates () देखें।
सबसे आसान तरीका यह है कि 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
theme paths
Drupal 6 में काम करता था, लेकिन Drupal 7 ने drupal.org/node/678714 में उस व्यवहार को बदल दिया , ऐसा लगता है कि उल्लेखित मुद्दे में टिप्पणियों # 29 और # 31 से, कि मॉड्यूल से विषय सुझाव घोषित किए जाने हैं उस मॉड्यूल के hook_theme में, लेकिन यह कैसे किया जाए कि पाठक को एक अभ्यास के रूप में छोड़ दिया जाए: /
कैसे प्रसंग प्रतिक्रिया थीम के साथ थोड़ा सार दृष्टिकोण के बारे में?
http://drupal.org/project/context_reaction_theme
अपने संदर्भ को सुविधाओं में लपेटें और यह निर्यात करने योग्य भी है। लेकिन शायद यह वास्तव में एक ड्रुपल गुरु प्रश्न है जो कुछ गहरा बनाने और मार्ग को जानने के लिए देख रहा है।
मैंने 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');
}
जैसा कि @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);
}
मैंने स्वीकार किए गए उत्तर और इस समाधान दोनों की कोशिश की, उत्तरार्द्ध मेरे लिए अब तक का काम करता है!