web-gelistirme-sc.com

Başka bir modülün varsayılan görünüm şablonunu nasıl geçersiz kılabilirim?

Drupal hook_theme() sağlar. Ama bir hook_theme_alter () var mı? Kanca menü girişlerini geçersiz kılan hook_menu_link_alter() gibi bir şey arıyorum, ama tema için. Özel şablonlardan birini nerede arayacağımı belirleyebilmem için bir görünüm kancası tema girdisini değiştirmek istiyorum. Tema klasörü içindeki tema şablonunu aradığından, Görünümler arabirimi aracılığıyla belirtmekle ilgilenmiyorum ve şablonumu bir özellik modülünde istiyorum.

hook_theme_registry_alter() ve _theme_process_registry() buldum. Hangisinin en iyi ve neden kullanılacağını cevaplayabilirsiniz.

Görünümün şablonu modülden almasını sağlamak için bu tuşlardan hangisini değiştirmeliyim?

Özelliğe views-data-export-xml-header - richard-feeds-nokia-movies - views-data-export-1 koyarsam, Görünüm varsayılan olarak views-data-export-xml-header'ı alır. tpl.php. Bu şablonu tema katmanına koyarsam, görünüm onu ​​alır (kayıt defteri yerinde olsa bile değiştirir).

6
amateur barista

Özelliğiniz hook_theme_registry_alter() uygulamalıdır. Açıkladığınız kullanım durumu, bu kancanın tam olarak ne için olduğunu. API sayfasına bağlanan örnek kod, başlamanızı sağlamalıdır. Temel fikir, views_theme() dosyasının kayıt defterine eklediği girdiye karşılık gelen girdiyi hedeflemek ve şablonu özelliğinizdeki girişle eşleşecek şekilde değiştirmek.

13
jhedstrom

Bu, özel bir modülün template klasöründe saklanan bir görünüm şablonunu bildirmek için kullandığım kod.

/**
 * Implements hook_theme_registry_alter().
 */
function custom_module_theme_registry_alter(&$theme_registry) {
  $extension   = '.tpl.php';
  $module_path = drupal_get_path('module', 'custom_module');
  $files       = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');

  foreach ($files as $file) {
    $template = drupal_basename($file->filename, $extension);
    $theme    = str_replace('-', '_', $template);
    list($base_theme, $specific) = explode('__', $theme, 2);

    // Don't override base theme.
    if (!empty($specific) && isset($theme_registry[$base_theme])) {
      $theme_info = array(
        'template'   => $template,
        'path'       => drupal_dirname($file->uri),
        'variables'  => $theme_registry[$base_theme]['variables'],
        'base hook'  => $base_theme,
        // Other available value: theme_engine.
        'type'       => 'module',
        'theme path' => $module_path,
      );

      $theme_registry[$theme] = $theme_info;
    }
  }
}

Yeni bir tema eklemek yerine mevcut bir temayı geçersiz kılabilmesi için kolayca çatal oluşturabilmeniz gerekir. Umarım birine yardımcı olur.

1
Sebastien M.