it-swarm-ko.tech

프로그래밍 방식으로 테마 제안 추가

뷰와 컨텐츠 유형 만 포함하는 기능 모듈을 작성했습니다.

지금 내 page-node-x.tpl.php와 내 views-view-y.tpl.php 파일은 테마 디렉토리에 있습니다.

그것들을 기능 모듈로 옮길 수 있습니까?

8
jantimon

answer of 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');
}
1
jantimon

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()을 허용하는 방법이 있어야합니다.

5
kiamlaluno

'template 파일'키를 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',
  ),
 );
}
3
Joe Hyde

뷰에는 이론적으로 뷰 템플릿의 메커니즘이 있습니다 (아마도 모든 템플릿에서 작동).

사용자 정의 모듈의 hook_views_api 구현에서 "템플릿 경로"키를 설정할 수 있습니다.

이보기가 있으면 지정된 디렉토리에서 템플리트 파일을 스캔합니다. 안타깝게도 현재 가장 간단한 테스트는 실패하므로이 기능은 아직 drupal7로 포팅되지 않았지만 누군가이 기능을 사용하려면 views.module의 _views_find_module_templates ()를 참조하십시오.

2
Daniel Wehner

테마 레지스트리는 Drupal은 어떤 템플릿 파일, 테마 기능 등을 사용해야하는지에 대한 모든 종류의 정보를 저장합니다.이를 무시하면 나중에 WTF 순간으로 이어질 수 있습니다. 기본값처럼 작동하지 않을 것입니다.

어쨌든 모든 것이 drupal처럼 고리가 있습니다. hook_theme_registry_alter 테마 레지스트리를 변경하는 데 사용할 수 있으며 템플릿 파일을 모듈로 이동합니다. 사이트를 유지 관리하는 것이 더 복잡해 지므로 권장하지 않습니다. 그러나 당신이하고 싶다면, 이것이 완료 된 방법입니다.

2
googletorp

가장 쉬운 방법은 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');
}
2
Damien Tournoud

@jcsio가 말했듯 이이 페이지에서 허용되는 답변은 작동하지만 테마로 템플릿을 재정의 할 수는 없습니다.

http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry 모듈 경로 및 하위 폴더를 추가 할 수있는 솔루션을 제공합니다. )를 검색하여 모든 종류의 .tpl.php 파일을 스캔하십시오.

Drupal 7에서 사용하지 않는 'theme paths'변수가 포함되어 있기 때문에 약간 변경했습니다.

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

나는 받아 들인 대답 과이 해결책을 모두 시도했지만 후자는 지금까지 나를 위해 일한다!

1
lmeurs

상황 반응 테마를 사용하여 약간 추상화 된 접근법은 어떻습니까?

http://drupal.org/project/context_reaction_theme

기능으로 컨텍스트를 정리하면 내보낼 수 있습니다. 그러나 아마도 이것은 실제로 Drupal 더 깊은 무언가를 만들고 경로를 알고 싶어하는 전문가 질문) 일 것입니다.

1
doublejosh