페이지 템플릿 제안이 작동하지 않습니다


12

테마를 만들고이 구조에 템플릿 파일이 있습니다.

  • /templates/page/page.tpl.php
  • /templates/page/page--node-type.tpl.php

사용자 정의 페이지 템플리트를 작성했지만 어떤 이유로 Drupal에서 선택하지 않습니다. 캐시를 지우고 테마 template.php 파일 에이 전 처리기 기능을 추가하려고 시도했지만 여전히 작동하지 않습니다.

if (isset($vars['node'])) 
  {
    // If the node type is "blog" the template suggestion will be "page--blog.tpl.php".
    $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
  }

도움을 주시면 감사하겠습니다.


/templates/page/page--node-type.tpl.php는 page--blog.tpl.php가 아니어야합니까?
Jeremy French

답변:


14

Drupal 7 템플릿 제안 에서보고 된 것처럼 Drupal 7에서 페이지에 기본적으로 사용되는 템플릿 제안은 page-[front | internal / path] .tpl.php입니다.

http://www.example.com/node/1/edit 페이지에서 Drupal은 다음 템플릿 파일을 찾습니다.

  • 페이지-노드 --edit.tpl.php
  • 페이지-노드 -1.tpl.php
  • 페이지 --node.tpl.php
  • page.tpl.php

추가 제안을 추가하려면, 테마가 구현해야 template_preprocess_page을 () 하고 새로운 제안을 추가 $variables['theme_hook_suggestions']( $variables함수에 참조로 전달 된 변수입니다).

그렇게하면 제안 된 템플리트 파일이 사용되지 않는 유일한 이유는 파일 이름이 올바르지 않기 때문입니다. 예를 들어, 페이지에 책 페이지가 표시되는 경우 템플리트 파일은 page--book.tpl이어야합니다. .php. 테마 코드를 변경하고 page--book.tpl.php와 같은 템플릿을 찾지 못하면 page-node-type.tpl.php 템플릿을 사용하도록 할 수 있습니다.

또한 theme_get_suggestions () ( template_preprocess_page ()에 의해 호출되는 함수 )에서 하이픈이로 바뀌고 _그 반대로 바뀌지 않습니다. 수행 된 이유는 기능 코드에보고 된 주석에 설명되어 있습니다.

// When we discover templates in drupal_find_theme_templates(),
// hyphens (-) are converted to underscores (_) before the theme hook
// is registered. We do this because the hyphens used for delimiters
// in hook suggestions cannot be used in the function names of the
// associated preprocess functions. Any page templates designed to be used
// on paths that contain a hyphen are also registered with these hyphens
// converted to underscores so here we must convert any hyphens in path
// arguments to underscores here before fetching theme hook suggestions
// to ensure the templates are appropriately recognized.
$arg = str_replace(array("/", "\\", "\0", '-'), array('', '', '', '_'), $arg);

5

Drupal 7.4를 사용하고 있으며 동일한 문제가 있었고이 게시물을 돕는 유일한 방법은 콘텐츠 유형에 따라 사용자 정의 page.tpl을 추가하는 방법입니다 .

게시물에서 :

<?php
/**
* Variables preprocess function for the "page" theming hook.
*/
function THEME_NAME_preprocess_page(&$vars) {

  // Do we have a node?
  if (isset($vars['node'])) {

    // Ref suggestions cuz it's stupid long.
    $suggests = &$vars['theme_hook_suggestions'];

    // Get path arguments.
    $args = arg();
    // Remove first argument of "node".
    unset($args[0]);

    // Set type.
    $type = "page__type_{$vars['node']->type}";

    // Bring it all together.
    $suggests = array_merge(
      $suggests,
      array($type),
      theme_get_suggestions($args, $type)
    );

    // if the url is: 'http://domain.com/node/123/edit'
    // and node type is 'blog'..
    //
    // This will be the suggestions:
    //
    // - page__node
    // - page__node__%
    // - page__node__123
    // - page__node__edit
    // - page__type_blog
    // - page__type_blog__%
    // - page__type_blog__123
    // - page__type_blog__edit
    //
    // Which connects to these templates:
    //
    // - page--node.tpl.php
    // - page--node--%.tpl.php
    // - page--node--123.tpl.php
    // - page--node--edit.tpl.php
    // - page--type-blog.tpl.php          << this is what you want.
    // - page--type-blog--%.tpl.php
    // - page--type-blog--123.tpl.php
    // - page--type-blog--edit.tpl.php
    //
    // Latter items take precedence.
  }
}
?>

정말 감사합니다 ... 제안과 템플릿 이름 간의 관계를 보여주는 것이 실제로 도움이되었습니다. 다시 감사합니다 :)
SGhosh

2

Drupal 7.22에서 string replace를 사용하여 위의 예제를 따르려고 너무 오랜 시간을 보냈습니다. 이것은 나를 위해 작동하지 않는 것 같습니다. 흥미롭게도 일부 컨텐츠 유형은 자동으로 제안되는 반면 다른 컨텐츠 유형은 자동으로 제안되지 않습니다. 이것은 결국 나를 위해 일한 코드입니다.

if (isset($variables['node'])) {
   // $variables['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $variables['node']->type);
   //cannot get above working for some reason?
     $variables['theme_hook_suggestions'][] = 'page__' . $variables['node']->type;
  }

따라서 front_page 콘텐츠 유형에 대한 템플릿 제안은 다음과 같습니다.

page--front_cover.tpl.php

흥미롭게도 'issue'컨텐츠 유형에 대한 코드 템플릿 제안은 전 처리기 스크립트 없이도 page--issue.tpl.php로 제공됩니다! 이것은 내 목적으로 비슷한 경로를 사용하는 뷰 템플릿을 재정의하는 것 같습니다.

보기 경로 = 콘텐츠 유형에 따른 / issue / # 템플릿 제안, 즉 / issue / # / front_cover


- 전면 cover.tpl.php 페이지하십시오이 어떤 처리기 스크립트없이 될 것입니다 front_page 콘텐츠 유형에 대한 템플릿 제안
sneha.kamble
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.