사용자 정의 모듈로 필드 템플리트 대체


13

테마에 tpl 파일 (이 경우 media-youtube-video.tpl.php)을 추가하는 대신 사용자 정의 모듈에서 필드 템플릿을 재정의하려면 어떻게해야합니까? 필드가보기에서 사용되는시기를 포함합니다.

답변:


12

더 쉬운 방법이 있어야한다고 확신하지만 이것이 일반적으로하는 일입니다.

1. 등록 드루팔 테마 레지스트리과 무시 테마 구현입니다. 에에 mymod_theme()새 항목을 추가하십시오. variables키는 media_youtube_video테마 의 키와 일치해야합니다. 즉

/**
 * Implements hook_theme().
 */
function mymod_theme() {
  return array(
    'my_media_youtube_video' => array(
      'variables' => array('uri' => NULL, ...), // see media_youtube_theme() for this
      // bundle the template file with the module itself
      // i.e. theme/my-media-youtube-video.tpl.php
      'template' => 'my-media-youtube-video',
      'path' => drupal_get_path('module', 'mymod') . '/theme
    )
  );
}

2. 원래 테마 구현을위한 전처리 후크를 추가 하고 여기에 새로운 구현을 제안 하십시오.

/*
 * Implements hook_preprocess_media_youtube_video().
 *
 * Or more generally, hook_preprocess_THEME().
 */
function mymod_preprocess_media_youtube_video(&$variables) {
  // If your overriding implementation is not a template but 
  // is implemented in a different file, 
  // then remember to include the file explicitly at this point..
  $variables['theme_hook_suggestions'][] = 'my_media_youtube_video';
}

제안은 LIFO 방식으로 테마 시스템에 의해 평가됩니다 . 이에 대한 자세한 내용은 여기를 참조 하십시오 .

다른 모듈이이 모듈과 동일한 접근 방식을 따라 구현을 재정의하고 있다는 것을 알고 있다고 가정하면 (위 참조)를 마지막으로 호출 hook_module_implements_alter()하고 구현할 수 있습니다 hook_preprocess_THEME(). hook_module_implements_alter() 여기 에 대해 읽을 수 있습니다 .

이것은 Views에도 좋습니다. 요약하면, 재정의하려는 원래 테마 구현의 올바른 고유 이름 (일반적으로 소스 모듈에 정의 됨)을 찾고 사전 프로세스 후크를 추가하고 대체 제안을 추가하면됩니다.


내 사용자 지정 모듈에서 적용 할 템플릿을 선택하기위한 선택 목록이 있습니다. 3 tpl 파일이 있습니다. 어떻게해야합니까?
Fazeela Abu Zohra

노드 유형이 많은 경우 노드 양식의 본문 필드를 어떻게 재정의 할 수 있습니까?
Sukhjinder Singh

3

다음과 같이 모듈에서 새 테마를 데칼 할 수도 있습니다.

/**
* Implements hook_theme().
*/
function yourmodule_theme($existing, $type, $theme, $path) {
  $theme = array();

  $theme['field__field_nameofyourfield'] = array(
    'render element' => 'content',
    'base hook' => 'field',
    'template' => 'field--field-nameofyourfield',
    'path' => drupal_get_path('module', 'yourmodule') . '/templates',
  );

  return $theme;
}

그런 다음 (표준)과 같은 필드 템플릿을 포함하는 / template 디렉토리 파일에 넣고 field-nameofyourfield.tpl.php로 이름을 지정하십시오.

<div class="<?php print $classes; ?>"<?php print $attributes; ?>>
  <?php if (!$label_hidden): ?>
    <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
  <?php endif; ?>
  <div class="field-items"<?php print $content_attributes; ?>>
    <?php foreach ($items as $delta => $item): ?>
      <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
    <?php endforeach; ?>
  </div>
</div>

캐시를 지운 후에는 테마 자체가 대체하지 않는 한 테마에서이 파일 템플리트를 사용하므로 테마에서이 템플리트를 계속 대체 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.