Programlı bir tema önerisi ekleme


8

Yalnızca bir görünüm ve içerik türü içeren bir özellik modülü oluşturdum.

Şu anda benim page-node-x.tpl.phpve views-view-y.tpl.phpdosyalarım temalar dizinimde.

Bunları özellik modülüme taşımak mümkün müdür?

Yanıtlar:


5

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 .


3

'Ş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',
  ),
 );
}

2

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_altertema 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.


+1 - Bunu denedim ama başarılı olamadım .. Bir örnek verebilir misiniz?
jantimon

@Ghommey: Sağlanan bağlantı, nasıl daha iyi açıklanacağından emin olmayan örnek kodla birlikte gelir.
googletorp

2

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.


2

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

Uygulamaya bakıldığında, bir dizi 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
Capi Etheriel

Yukarıdaki yorumumu ilgili olarak: theme pathsDrupal 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: /
Capi Etheriel

1

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.


D7 modülü yok ve son taahhüt yarım yıl önceydi.
jantimon

Hala Drupal 6 sitelerimde çok iyi çalışıyor :)
doublejosh

1

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.

mymoduleBir şablon dosyası ile çağrılmış kendi modülünüz sites/all/modules/mymodule/templates/foo--variant.tpl.phpvarsa, 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');
}

Bu, Drupal'ı modül klasörünüzdeki şablonu kullanmaya zorlar. Bir tema onu geçersiz kılamaz (olması gerekir).
jcisio

1

@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!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.