উত্তর:
একটি মডিউল যা পরিবর্তনশীল পরিবর্তন করে নতুন টেম্পলেট ফাইলগুলি প্রয়োগ 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_theme () দ্বারা ফিরে আসা একটি এন্ট্রি মিলানো দরকার ।
ভিউজে, একইভাবে ব্যবহার করার জন্য একটি সমমানের প্রিপ্রোসেস ফাংশন থাকতে হবে, বা এমন কোনও উপায় যা 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',
),
);
}
থিম রেজিস্ট্রি যেখানে ড্রুপাল টেম্পলেট ফাইল, থিম ফাংশন ইত্যাদি ব্যবহার করতে হবে সে সম্পর্কে সমস্ত ধরণের তথ্য সঞ্চয় করে। এটির সাথে মেসেজ করা ডাব্লুটিএফের মুহুর্তগুলিতে পরে নিয়ে যেতে পারে, কারণ জিনিসগুলি ডিফল্টর মতো কাজ করবে না।
যাইহোক যাইহোক সমস্ত জিনিস যেমন দ্রুপাল, সেখানে একটি হুক রয়েছে: hook_theme_registry_alter
আপনি থিমের রেজিস্ট্রি পরিবর্তন করতে পারেন এবং এটি আপনার টেম্পলেট ফাইলগুলিকে একটি মডিউলে স্থানান্তরিত করতে পারে। আমি এটি করার পরামর্শ দেব না, কারণ এটি সাইটটি রক্ষণাবেক্ষণকে আরও জটিল করে তুলবে। আপনি যদি করতে চান তবে এটি এইভাবে হয়।
মতামতের জন্য তাত্ত্বিকভাবে ভিউ টেম্পলেটগুলির জন্য একটি প্রক্রিয়া রয়েছে (সম্ভবত এটি সমস্ত টেম্পলেটগুলির জন্য কাজ করে)।
আপনি আপনার কাস্টম মডিউলটির hook_views_api বাস্তবায়নে কী "টেম্পলেট পাথ" সেট করতে পারেন।
আপনার এই মতামতগুলি একবার টেম্পলেট ফাইলগুলির জন্য আপনার নির্দিষ্ট ডিরেক্টরিটি স্ক্যান করবে। দুঃখজনকভাবে সবচেয়ে সহজ বর্তমানে ব্যর্থ হয়, তাই সম্ভবত এই বৈশিষ্ট্যটি এখনও দ্রুপাল 7 এ পোর্ট করা হয়নি তবে যদি কেউ এটির মধ্যে যেতে চান তবে ভিউজ.মডিউলটিতে _ভিউস_ফাইন্ড_মডিউল_টেমলেটগুলি () দেখুন।
সবচেয়ে সহজ উপায় হ'ল 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
দ্রুপাল in এ কাজ করতেন, তবে দ্রুপাল d সেই আচরণটি drupal.org/node/678714 এ পরিবর্তন করেছেন বলে মনে হয়, উল্লিখিত ইস্যুতে # 29 এবং # 31 মন্তব্য থেকে মডিউলগুলির থিম পরামর্শগুলি ঘোষণা করতে হবে সেই মডিউলের হুক_থমে, তবে কীভাবে এটি করা যায় তা পাঠকের অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে: /
প্রসঙ্গে প্রতিক্রিয়া থিমের সাথে সামান্য বিমূর্ত পদ্ধতি সম্পর্কে কীভাবে?
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)));
}
}
এটি কেবল নোডের অবস্থান ও নাম ও টিপিএল ফাইলগুলি দেখতে ওভাররাইট করতে পারে না তবে দর্শনের জন্য একটি প্রাক-প্রসেস ফাংশন সরবরাহ করতে সহায়তা করে।
আপনি যদি কোনও নিজস্ব মডিউলটি 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');
}
@ জেসিসিও যেমন বলেছে, এই পৃষ্ঠায় গৃহীত উত্তরগুলি কাজ করে তবে টেমপ্লেট কোনও থিম দ্বারা ওভাররাইড করা যায় না।
http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry একটি সমাধান দেয় যা আপনাকে আপনার মডিউলটির (এবং সাব-ফোল্ডারগুলি) সমস্ত ধরণের স্ক্যান করার জন্য পথ যোগ করতে দেয় allows .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);
}
আমি গৃহীত উত্তর এবং এই সমাধান উভয়ই চেষ্টা করেছিলাম, পরবর্তীটি এখনও পর্যন্ত আমার পক্ষে কাজ করে!