노드 제목 앞에 필드를 표시하는 방법은 무엇입니까?


41

D7에 티저를 표시 할 때 노드 제목 앞에 특정 필드를 렌더링하려고합니다.

효과적으로 전에서 가고 싶은 이 에 이 .

node.tpl.php 업데이트를 살펴 보았지만 분리 $title된 $content것을 알았으므로 어떻게 접근 해야하는지 잘 모르겠습니다. 일부 검색 후 사람들이 Drupal-6 에서이 문제를 해결하기 위해 CCK 및 ConTemplate 모듈을 사용하도록 제안 했지만 Drupal-7 솔루션이 더 있는지 궁금합니다.

어떤 제안?


모든 PHP 기반 템플릿 솔루션 외에도 CSS만으로도 먼 길을 갈 수 있습니다. 부정적인 마진은 많은 것을 할 수 있습니다. 귀하의 jsfiddle 예제에서는 다음 과 같습니다 .
— marcvangend

나는 이것을 고려했지만 긴 제목은 어떻게됩니까 ?
— irishbuzz

제목이 고정 된 높이 인 경우에만 작동합니다. 모든 솔루션과 마찬가지로 약점이 있습니다. 개인적으로, (사용하는 디자인과 기술에 관계없이) 긴 제목은 편집자를 교육함으로써 방지해야한다고 생각하지만, 이것이 항상 옵션이 아니라는 것을 알고 있습니다.
— marcvangend

답변:


53

이것은 Drupal 7에서 정말 간단합니다.

로 render와 hide당신의 단일 요소의 위치를 제어 할 수있는 posibility 알고 $content드루팔 6 필요 것처럼 모든 사항을 사용자가 직접 출력하지 않고 있습니다.

단순화 된 노드 템플릿은 다음과 같습니다.

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

약간만 수정하면 요구 사항을 처리 할 수 ​​있습니다.

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

를 사용 render하면 요소를 출력 할 수 있습니다. Drupal은 렌더링 된 내용을 추적하여 같은 장소에 두 번 인쇄되는 것을 피하기 때문에 단순히 인쇄하는 것보다 더 영리합니다. 제목 위에 필드를 렌더링 할 때 렌더링 될 때 렌더링되는 항목도 제거 $content됩니다.


2
아주 좋아요 이상적인 세계에서는 Drupal에 제목 필드를 다른 필드와 같이 취급하도록 지시하는 것이 더 좋지만 Drupal 7에서는 이와 같은 간단한 솔루션이 있습니다. Kudos @googletorp!
— irishbuzz

기록을 위해 : 이것은 위의 의견이 주장 할 수있는 것과 반대로 Drupal6과 거의 다릅니다.
— berkes

1
@berkes : D6에서 필드를 개별적으로 인쇄하는 경우 노드 템플릿을 유지 관리하고 새 필드를 추가 할 수 있도록 코드를 편집해야합니다. 이는 필드를 계속 추가하고 UI를 사용하여 정렬 할 수있는 D7과 비교할 때 큰 차이점입니다.
— googletorp

렌더링은 실제로 새롭습니다. 그러나 그 개념은 아닙니다. 이를 달성하기위한 몇 가지 트릭이 있습니다. Drupal6에서 이것은 간단하고 깨끗하며 훌륭하다고 말하지 않았습니다. 물론 가능합니다 .
— berkes

@googletorp page.tpl.php에 필드를 인쇄하는 방법이 있습니까?
— CocoSkin

9

Display Suite 도 매우 멋집니다.

Display Suite를 사용하면 끌어서 놓기 인터페이스를 사용하여 컨텐츠가 표시되는 방식을 완전히 제어 할 수 있습니다. 수십 개의 템플릿 파일을 통해 작업하지 않고도 원하는 방식으로 노드, 뷰, 주석, 사용자 데이터 등을 정렬 할 수 있습니다. 더 많은 드래그 앤 드롭 재미를 위해 사전 정의 된 레이아웃 목록 (D7 만 해당)을 사용할 수 있습니다!


멋진 모듈이지만 안타깝게도 제목이 아닌 필드에 대한 제어 기능 만 제공하므로 도움이되지 않는 것 같습니다. 고마워
— irishbuzz


@ 해독 : 3 개의 모듈을 설치하여 이미지 태그를 h2 태그 위로 이동 하시겠습니까? 농담
— 이야

@berkes-하나의 웹 페이지를 표시하기 위해 Drupal을 설치하면 제대로 농담해야합니까? 내 요점은 이러한 모듈을 설치하면 Drupal과 마찬가지로 많은 것을 할 수 있지만, 그것을 사용하여 정신적 인 작업을 해결할 수도 있다는 것입니다.
— Decipher

@Decipher : 일반 모듈을 설치하면 사이트에 새로운 기회가 생깁니다. 그러나 뷰, 뷰 갤러리, cck, filefiend 및 이미지 필드를 설치하여 이미지 행을 간단히 표시하는 것은 좋지 않습니다. 뷰, cck 및 나머지는이 이미지 목록보다 더 많이 사용되는 것이 좋습니다. 그러나 OP는 이것을 전혀 언급하지 않았습니다.
— berkes

8

제목 모듈 ( http://drupal.org/project/title)을 살펴보십시오 . 시나리오에 유용 할 수 있습니다. 나는 당신과 비슷한 이유로 어떤 이유로 설치 / 활성화했으며 제목 필드를 배치하는 방법에 유연성을 부여하는 것 같습니다.

나는 그것을 비활성화하고 Display Suite를 사용하고 있으므로 리콜이 약간 스케치 될 수 있습니다.


5

이것은 해킹 솔루션이며 누군가가 더 우아한 것을 내놓을 것이라고 확신하지만 당신이 갇혀 있고 아무도하지 않을 경우를 대비하여 ...

모두 page.tpl.php인쇄를 제거하고 $title기계 이름이 $ new_title 또는 이와 유사한 이름의 새 사용자 정의 필드를 추가하는 데 사용할 수 있습니다 . 그런 다음 노드 편집에 원래 제목 상자를 숨기고, 노드 저장 사용 계산 된 필드 또는 복사 할 일부 사용자 지정 PHP에 $new_title에 $title.

그런 다음 CSS를 작성하여 $ new_title을 이전 페이지 제목처럼 보이게하고 필드 관리 화면에서 드래그 앤 드롭하여 원하는 순서대로 필드를 배치 할 수 있어야합니다. 당신이 복사하기 때문에 $new_title로 $title, 브라우저 표시 줄에 페이지 제목은 여전히 직장과 아무것도 노드 제목 누락에 대해 불평을해야한다.

내가 말했듯이, 그것은 해킹이지만 작동합니다. 더 많은 정보가 필요하면 알려주세요


1
프레드릭의 제안에 감사드립니다. 알다시피 이상적인 것은 아니지만 몇 가지 가능한 해결 방법 중 하나처럼 보입니다. 이 방법을 사용할 경우 auto_nodetitle 모듈을 사용해야한다고 제안하여 솔루션에 추가하겠습니다 . 나는 더 나은 방법이 있기를 바라고 바운티를 시작할 수 있기 때문에 지금 질문을 열어 두겠습니다. 모두 같은 노력으로 +1.
— irishbuzz

4

page.tpl.php (garland)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}

첫 번째 코드 스 니펫이 새로운 내용과 기존 내용을 거의 나타내지 않으므로 여기에서 진행중인 작업을 따르지 않습니다. 필요한 변경 사항이 비슷해야하지만 Garland 대신 Zen 테마를 사용하고 있습니다. 두 번째 코드 스 니펫에서 hook_preprocess_page ()를 호출하고 있습니까? 보다 구체적인 예를 통해 확장 할 수 있습니까?
— irishbuzz

두 번째 코드에서는 새로운 변수 'custom_block'을 정의했습니다. 우리가 'custom_block'인쇄하는 첫 번째 코드의 일부를보십시오. <? php if ($ custom_block) : print '<div id = "custom-block"class = "clear-block">'. $ custom_block. '</ div>'; 엔디 프; ?>이 변수를 생성하는 규칙을 정의하십시오. 그래서? :)
— dobeerman 2016 년

4

이것은 원래 게시물의 티저 질문에는 적용되지 않지만이 문제를 우연히보고 전체보기에서 문제를 해결하려는 사람들에게는 코드가없는 옵션이 있습니다. 예를 들어) 해당 블록을 콘텐츠 블록 위에 있지만 동일한 지역에 배치하십시오.


난 여전히 드루팔 n00b인데 무슨 말인지 설명해 주실 래요?
— Kenny Wyland

3

template.php에서 전처리 기능을 사용해야한다고 생각합니다.

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

그리고 추가로

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

변수를 덤프하고 원하는 것을 수행하십시오. 추가 / 제거 / 업데이트.


1
이러한 함수는 제목 및 기타 노드 필드가 출력되는 순서를 변경하지 않습니다. 이를 위해 템플릿 파일을 변경해야합니다.
— kiamlaluno

제목에 필드 값을 추가하고 싶다고 생각했습니다.
— dobeerman

3

Display Suite 및 "Region to Block"추가 기능을 사용하는 코드없는 솔루션으로이 문제를 해결했습니다 . 나는 유연성을 위해이 솔루션을 가장 좋아합니다.

기본적으로, "Region to Block"추가 부분을 활성화하고 Display Suite에서 "Fulltext Content"디스플레이를 활성화하십시오. (전체 노드 디스플레이에서 제목 위에 내용을 표시한다고 가정하면 마찬가지로 Default를 제외한 다른보기 모드에 사용할 수 있습니다 ). 이제 "전체 텍스트 내용"의 "디스플레이 관리"부분의 화면 하단에 "블록 영역"탭이 나타납니다. 거기에 새 블록 이름을 입력하고 원하는 필드를 저장하고이 블록으로 끌어다 놓습니다. 마지막으로, 블록 제목 화면에서 새로 생성 된 블록을 노드 제목 위로 이동하십시오 .

http://www.youtube.com/watch?v=y4wyjxyhbNA 에서 동일한 접근 방식의 비디오를 볼 수 있습니다. 물론 제목 위에 왼쪽 블록이 아닌 제목 위에 블록을 배치해야합니다.


2

아래 코드는 zen 템플릿에 적합합니다.

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

마지막으로 page.tpl.php에서 필드를 쉽게 인쇄 할 수 있습니다.

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>

page.tpl.php와 관련하여 Business Responsive Theme에서 정의되지 않은 변수 경고가 표시되었지만 조건부를 제거하면 정상적으로 작동합니다. 다시 말해, 나는 다음과 같은 경우 <? php를 변경했습니다 : $$ _ field_field : print render ($ my_image_field); 엔디 프; ?>에서 <? php print render ($ my_image_field); ?> 내 모든 페이지에 경고가 표시되지 않는 것 같습니다.
— Amy Niebel

2

이미 테마를 사용하여 빌드하고 제목 맨 위에 필드를 추가하려고 시도했을 것입니다.

Drupal 7에서 테마를 구축하는 모든 개발자에게 제 제안은 Omega 테마 + 컨텍스트 및 델타 모듈입니다. 이것은 레이아웃을위한 매우 강력한 토대를 제공합니다.

영역, 블록 및 필드 배열에 대한 유연성.


1

당신은 패널 모듈로 할 수 없습니다


여기에 오래된 대답이지만 깃발이 붙었습니다. 이 상황에서 패널을 사용하는 방법을 조금 설명하는 것이 좋습니다.
— mpdonadio

패널은 필드를 다른 위치로 옮기기위한 엄청난 오버 헤드입니다.
— Akko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.