답변:
변수를 변경하여 새 템플릿 파일 을 구현 hook_preprocess_page()
하거나 hook_preprocess_node()
제안 할 수 있는 모듈입니다 $variables['theme_hook_suggestions']
.
해당 변수를 초기화하는 template_preprocess_page ()에 포함 된 코드 는 다음과 같습니다.
// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
$variables['theme_hook_suggestions'] = $suggestions;
}
각 테마 제안은 hook_theme ()에 의해 리턴 된 항목과 일치해야합니다 .
뷰에는 비슷한 방식으로 사용할 동등한 사전 처리 함수가 있거나 hook_preprocess_page()
페이지가 뷰와 연관되어 있는지 함수가 이해할 수 있도록하는 방법이 있어야 합니다.
'템플릿 파일'키를 추가하는 솔루션이 hook_views_api()
아직 Drupal 7에서 작동하지 않는 것 같습니다. 그러나 이것은 매력처럼 작동합니다.
/**
* 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',
),
);
}
테마 레지스트리는 Drupal이 사용할 템플릿 파일, 테마 기능 등에 대한 모든 정보를 저장하는 곳입니다. 기본 설정처럼 작동하지 않으므로 나중에 메시지를 작성하면 WTF 순간이 발생할 수 있습니다.
어쨌든 모든 drupal과 마찬가지로 후크 hook_theme_registry_alter
가 있습니다. 테마 레지스트리를 변경하고 템플릿 파일을 모듈로 이동하는 데 사용할 수 있습니다. 사이트를 유지 관리하는 것이 더 복잡해 지므로 권장하지 않습니다. 그러나 당신이하고 싶다면, 이것이 완료 된 방법입니다.
가장 쉬운 방법은 hook_theme_registry_alter()
테마 경로에 모듈 경로 를 사용 하고 추가하는 것입니다.
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()
구현을 살펴보면 theme path
배열이 될 수 없는 것 같습니다 . 이것이 효과가 있습니까? api.drupal.org/api/drupal/includes%21theme.inc/function/theme/7
theme paths
는 Drupal 6에서 작동했지만 Drupal 7은 drupal.org/node/678714의 동작을 변경 했습니다. 언급 된 문제의 의견 # 29 및 # 31에서 모듈의 테마 제안을 선언해야합니다 / : 해당 모듈의 hook_theme에 있지만, 그 작업을 수행하는 방법을 독자에게 연습 문제로 남겨
상황 반응 테마를 사용하여 약간 추상적 인 접근법은 어떻습니까?
http://drupal.org/project/context_reaction_theme
기능으로 컨텍스트를 정리하면 내보낼 수 있습니다. 그러나 아마도 이것은 실제로 Drupal 전문가 질문으로 더 깊은 것을 만들고 경로를 알고 싶어합니다.
googletorp 의 답변으로 시작 하여 일반 기능을 작성했습니다.
/**
* 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)));
}
}
노드의 위치와 이름을 덮어 쓰고 tpl 파일을 볼 수있을뿐만 아니라 뷰에 대한 전처리 기능을 제공 할 수 있습니다.
따라서 mymodule
템플릿 파일로 호출 된 자체 모듈을 가지고 있다면 sites/all/modules/mymodule/templates/foo--variant.tpl.php
자신의 템플릿 디렉토리를 사용하도록 테마 레지스트리를 쉽게 수정할 수 있습니다.
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가 말했듯 이이 페이지에서 허용되는 답변은 작동하지만 테마로 템플릿을 재정의 할 수는 없습니다.
http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry 는 모든 종류의 스캔 할 모듈 (및 하위 폴더)의 경로를 추가 할 수있는 솔루션을 제공합니다. .tpl.php 파일의 수
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);
}
나는 받아 들인 대답 과이 해결책을 모두 시도했지만 후자는 지금까지 나를 위해 일한다!