it-swarm-eu.dev

Programové přidání motivového návrhu

Vytvořil jsem modul funkcí obsahující pouze zobrazení a typ obsahu.

Právě teď můj page-node-x.tpl.php a můj views-view-y.tpl.php soubory leží v mém adresáři témat.

Je možné je přesunout do mého funkčního modulu?

9
jantimon

Začal jsem s odpověď googletorp a vytvořil obecnou funkci:

/**
 * 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)));
  }
}

Umožňuje nejen přepsat polohu a název uzlů a prohlížet soubory tpl, ale také poskytnout funkci předzpracování pro pohledy.

Pokud tedy máte vlastní modul s názvem mymodule se souborem šablony, např. sites/all/modules/mymodule/templates/foo--variant.tpl.php Nyní můžete snadno upravit registr témat tak, aby používal svůj vlastní adresář šablon:

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

Modul, který implementuje hook_preprocess_page() nebo hook_preprocess_node(), může navrhnout nové soubory šablony změnou proměnné $variables['theme_hook_suggestions'].

Kód obsažený v template_preprocess_page () , který inicializuje tuto proměnnou, je následující.

// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
  $variables['theme_hook_suggestions'] = $suggestions;
}

Každý návrh tématu musí odpovídat záznamu vrácenému hook_theme () .

V zobrazeních by měla existovat ekvivalentní funkce předběžného zpracování, která se použije podobným způsobem, nebo způsobem, který umožňuje funkci hook_preprocess_page(), která umožňuje této funkci pochopit, zda je stránka spojena se zobrazením.

5
kiamlaluno

Zdá se, že řešení přidání klíče 'soubor šablony' do hook_views_api() nefunguje v Drupal 7). Toto však funguje jako kouzlo:

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

Pro pohledy existuje teoreticky mechanismus pro šablony pohledů (snad funguje pro všechny šablony).

V implementaci hook_views_api vašeho vlastního modulu můžete nastavit klíčovou "cestu šablony".

Jakmile budete mít tato zobrazení, prohledá zadaný adresář soubory šablon. Bohužel nejjednodušší momentálně selže, takže tato funkce pravděpodobně ještě není portována na drupal7, ale pokud se do ní někdo chce dostat, podívejte se na _views_find_module_templates () v views.module.

2
Daniel Wehner

Registr témat je tam, kde Drupal ukládá nejrůznější informace o tom, jaké soubory šablon, funkce motivů atd. Použít. Zprávy s ním mohou později vést k WTF, protože věci nebudou fungovat jako výchozí.

Stejně jako všechny věci drupal, tam je háček: hook_theme_registry_alter můžete použít k úpravě registru témat a tím přesunout soubory šablony do modulu. Nedoporučoval bych to dělat, protože by to vedlo ke komplikovanější údržbě webu. Ale pokud to chcete udělat, je to tak.

2
googletorp

Nejjednodušší způsob je použít hook_theme_registry_alter() a pouze přidat cestu vašeho modulu k tematickým cestám:

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

Jak řekl @jcsio, přijatá odpověď na této stránce funguje, ale šablonu nelze přepsat tématem.

http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry nabízí řešení, které vám umožní přidat cestu k vašemu modulu (a podsložky) ) pro kontrolu všech typů souborů .tpl.php.

Mírně jsem to změnil, protože obsahoval proměnnou „tematických cest“, která podle všeho není použita Drupal 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);
}

Vyzkoušel jsem akceptovanou odpověď i toto řešení, které pro mě zatím funguje!

1
lmeurs

A co mírně abstrakční přístup s tématem Reakce kontextu?

http://drupal.org/project/context_reaction_theme

Zabalte svůj kontext do funkcí a je dokonce exportovatelný. Ale možná je to ve skutečnosti otázka Drupal guru otázka, která hledá něco hlubšího a znát cestu).

1
doublejosh