web-gelistirme-sc.com

Programlı bir tema önerisi ekleme

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

Şimdi benim page-node-x.tpl.php ve benim views-view-y.tpl.php dosyalar temalar dizinimde bulunuyor.

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

8
jantimon

googletorp cevabı ile başladım ve genel bir fonksiyon oluşturdum:

/**
 * 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.

Dolayısıyla, bir şablon dosyasıyla mymodule adlı kendi modülünüz varsa örn. sites/all/modules/mymodule/templates/foo--variant.tpl.php 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');
}
1
jantimon

hook_preprocess_page() veya hook_preprocess_node() uygulayan bir modül, $variables['theme_hook_suggestions'] Değişkenini değiştirerek yeni şablon dosyaları önerebilir.

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 () ile 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 sayfanın bir görünümle ilişkilendirilip ilişkilendirilmediğini anlamasını sağlayan hook_preprocess_page() işlevine izin veren bir yol olmalıdır.

5
kiamlaluno

'Şablon dosyası' anahtarını hook_views_api() öğesine ekleme çözümü henüz Drupal 7] 'de işe yaramıyor gibi gözüküyor.

/**
 * 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',
  ),
 );
}
3
Joe Hyde

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şınmamış, ancak birisi içine girmek istiyorsa, views.module'daki _views_find_module_templates () öğesine bakın.

2
Daniel Wehner

Tema kayıt defteri burada Drupal hangi şablon dosyaları, tema işlevleri vb kullanmak için her türlü bilgiyi depolar.Onunla uğraşmak, işler varsayılan gibi çalışmayacağından daha sonra WTF anlarına yol açabilir.

Her neyse drupal gibi, bir kanca var: hook_theme_registry_alter Tema kayıt defterini değiştirmek için kullanabilirsiniz ve bu da ş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ız, bu böyle yapılır.

2
googletorp

En kolay yol hook_theme_registry_alter() kullanmak ve modülünüzün yolunu 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');
}
2
Damien Tournoud

@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 modülünüzün (ve alt klasörlerinizin) yolunu eklemenizi sağlayan bir çözüm sunar ) her türlü .tpl.php dosyası için taranacaktır.

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!

1
lmeurs

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.

1
doublejosh