Yanıtlar:
Değişkeni değiştirerek yeni şablon dosyaları uygulayan hook_preprocess_page()
veya hook_preprocess_node()
önerebilen bir modül $variables['theme_hook_suggestions']
.
Bu değişkeni başlatan template_preprocess_page () içindeki kod aşağıdaki gibidir.
// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
$variables['theme_hook_suggestions'] = $suggestions;
}
Her tema önerisinin hook_theme () tarafından döndürülen bir girişle eşleşmesi gerekir .
Görünümlerde, benzer şekilde kullanılacak eşdeğer bir önişleme işlevi veya hook_preprocess_page()
sayfanın bir görünümle ilişkilendirilip ilişkilendirilmediğini anlama işlevine izin veren bir yol olmalıdır .
'Şablon dosyası' anahtarını ekleme çözümü hook_views_api()
henüz Drupal 7'de çalışmıyor gibi görünüyor. Ancak, bu bir cazibe gibi çalışır:
/**
* 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',
),
);
}
Tema kayıt defteri, Drupal'ın hangi şablon dosyaları, tema işlevleri vb. İle ilgili her türlü bilgiyi depoladığı yerdir. Bununla uğraşmak, işler varsayılan gibi çalışmadığından WTF anlarına yol açabilir.
Zaten her şey drupal gibi, bir kanca var: hook_theme_registry_alter
tema kayıt defterini değiştirmek için kullanabilirsiniz ve bu şablon dosyalarınızı bir modüle taşır. Sitenin bakımını daha karmaşık hale getireceğinden, bunu yapmanızı tavsiye etmem. Ama eğer yapmak istiyorsan, böyle yapılır.
Görünümler için teoride, görünüm şablonları için bir mekanizma vardır (belki de tüm şablonlar için çalışır).
Özel modülünüzün hook_views_api uygulamanızda anahtar "şablon yolunu" ayarlayabilirsiniz.
Bu görünümlere sahip olduğunuzda, belirtilen dizini şablon dosyaları için tarar. Ne yazık ki şu anda en basit olanı başarısız, bu nedenle bu özellik muhtemelen henüz drupal7'ye taşınmadı, ancak birisi içine girmek istiyorsa, views.module'daki _views_find_module_templates () öğesine bakın.
En kolay yol, hook_theme_registry_alter()
modülün yolunu kullanmak ve tema yollarına eklemektir:
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()
gibi görünmüyor theme path
. Bunun işe yaradığından emin misin? Bkz. Api.drupal.org/api/drupal/includes%21theme.inc/function/theme/7
theme paths
Drupal 6, fakat Drupal 7 iş için kullanılan davranış değişti drupal.org/node/678714 yorumlarla # 29 ve bahsedilen sayısında # 31, Öyle görünüyor, modüllerden bu tema önerileri ilan edilmesi gerekecek bu modülün hook_theme'sinde, ancak bunun nasıl yapılacağı okuyucuya bir alıştırma olarak bırakılır: /
Bağlam Reaksiyonu Teması ile biraz soyutlanmış bir yaklaşıma ne dersiniz?
http://drupal.org/project/context_reaction_theme
Bağlamınızı Özellikler'e ekleyin ve hatta dışa aktarılabilir. Ama belki de bu aslında daha derin bir şey yaratmak ve rotayı bilmek isteyen bir Drupal guru sorusudur.
Ben ile başladı googletorp ait cevap ve bir genel işlevi inşa:
/**
* 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)));
}
}
Yalnızca düğümün konumunun ve adının üzerine yazılmasına ve tpl dosyalarının görüntülenmesine izin vermez, aynı zamanda görünümler için bir önişleme işlevi sağlar.
mymodule
Bir şablon dosyası ile çağrılmış kendi modülünüz sites/all/modules/mymodule/templates/foo--variant.tpl.php
varsa, yani artık kendi şablon dizininizi kullanmak için tema kayıt defterini kolayca değiştirebilirsiniz:
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'nun dediği gibi, bu sayfadaki kabul edilen cevap işe yarıyor, ancak şablon bir tema tarafından geçersiz kılınamıyor.
http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry , her türlü taranacak modülünüzün (ve alt klasörlerin) yolunu eklemenizi sağlayan bir çözüm sunar .tpl.php dosyalarının.
Drupal 7 tarafından kullanılmayan bir 'tema yolları' değişkeni içerdiğinden biraz değiştirdim.
/**
* 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);
}
Hem kabul edilen cevabı hem de bu çözümü denedim, ikincisi benim için şimdiye kadar çalışıyor!