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


41

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

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

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

어떤 제안?


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

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

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

답변:


53

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

renderhide당신의 단일 요소의 위치를 제어 할 수있는 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.