보기-그룹 주위에 랩퍼 DIV 추가


43

Drupal 7에서는 여러 필드를 나열하는보기를 작성했습니다. 필드는 다른 필드 (필드의 ID)로 그룹화됩니다. 마크 업은 다음과 같습니다.

<h3>[Term 1]</h3>
<div class="views-row views-row-1 views-row-odd views-row-first"> [Field Content] </div>
<div class="views-row views-row-2 views-row-even"> [Field Content] </div>
<div class="views-row views-row-3 views-row-odd views-row-last"> [Field Content] </div>

<h3>[Term 2]</h3>
<div class="views-row views-row-1 views-row-odd views-row-first"> [Field Content] </div>
<div class="views-row views-row-2 views-row-even"> [Field Content] </div>
<div class="views-row views-row-3 views-row-odd views-row-last"> [Field Content] </div>

<h3>[Term 3]</h3>
<div class="views-row views-row-1 views-row-odd views-row-first"> [Field Content] </div>
<div class="views-row views-row-2 views-row-even"> [Field Content] </div>
<div class="views-row views-row-3 views-row-odd views-row-last"> [Field Content] </div>

그러나 다음과 같이 마크 업이 필요합니다.

<div id="term_1">
     <h3>[Term 1]</h3>
     <div class="views-row views-row-1 views-row-odd views-row-first"> [Field Content] </div>
     <div class="views-row views-row-2 views-row-even"> [Field Content] </div>
     <div class="views-row views-row-3 views-row-odd views-row-last"> [Field Content] </div>
</div>

<div id="term_2">
     <h3>[Term 2]</h3>
     <div class="views-row views-row-1 views-row-odd views-row-first"> [Field Content] </div>
     <div class="views-row views-row-2 views-row-even"> [Field Content] </div>
     <div class="views-row views-row-3 views-row-odd views-row-last"> [Field Content] </div>
</div>

<div id="term_3">
     <h3>[Term 3]</h3>
     <div class="views-row views-row-1 views-row-odd views-row-first"> [Field Content] </div>
     <div class="views-row views-row-2 views-row-even"> [Field Content] </div>
     <div class="views-row views-row-3 views-row-odd views-row-last"> [Field Content] </div>
</div>

views-view-unformatted.tpl.php (스타일 출력)를 사용하여 뷰를 오버 라이딩 한 다음 DIV를 삽입하여 그룹을 래핑 할 수 있음을 알고 있습니다.

그러나이 래퍼 DIV가 필요합니다 <div id="term_ID_{number of ID}">. 숫자 ID는 필드를 그룹화하는 데 사용 된 용어에 해당합니다. 기본적으로 views-view-unformatted.tpl.php를 사용하면 용어 ID에 대한 토큰을 삽입 할 수 없습니다.

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

답변:


50

나는 최근에 똑같은 일을해야했습니다. 템플릿 파일을 만들 수 있습니다.

  • 에서 템플릿을 찾으십시오 /modules/views/themes/views-view-unformatted.tpl.php.
  • /sites/all/themes/<your-theme>폴더에 복사 하고 이름을로 변경하십시오 views-view-unformatted--<nodetype>.tpl.php.
  • div전체 템플릿 주위에 파일을 추가하여 파일을 편집하십시오 . <h3>태그는 그룹 이름입니다.

수정 된 템플릿 파일은 다음과 같습니다.

<div class="your-class">
<?php if (!empty($title)): ?>
    <h3><?php print $title; ?></h3><!--this is the group name-->
<?php endif; ?>
<?php foreach ($rows as $id => $row): ?>
  <div class="<?php print $classes_array[$id]; ?>">
    <?php print $row; ?>
</div>
<?php endforeach; ?>
</div><!--end your div-->

4
이것은 단지 나에게도 효과가 있었다. :)
Clive

내 친구를 구했어!
DropDragon

1
tpl파일 이름을 지정하는 방법을 궁금해하는이 답변을 읽는 사람 은 drupal.stackexchange.com/questions/11468/… tldr 의 답변을 참조하십시오 . 보기 편집 페이지의 고급에서 테마를 클릭하십시오. 정보
user56reinstatemonica8

Q와 A는 Drupal 7이지만 Drupal 8에서도 동일하게 작동합니다.
Duncanmoo

16

Format : HTML list를 사용해보십시오. 항목 목록에 모든 내용이 포함됩니다. 내 목적을 위해 그것은 완벽합니다 (분류 항목 목록). 도움이 되었기를 바랍니다.


이거 좋다 래퍼에 그룹 필드를 클래스로 추가하여 스타일을 지정할 수 있지만 뷰 UI 자체에서는 그렇게 할 수 없습니다. 누군가를 돕는 경우 대신 내가 한 일은 먼저 해당 필드로 SORT 한 다음 CSS 첫 번째 선택기를 사용하는 것입니다.
klidifia

11

다시 쓰기 결과 기능 을 사용해 보셨습니까 ? 편집 할 필드를 클릭하고 결과 다시 쓰기가 표시 될 때까지 아래로 스크롤하십시오 . 이 필드의 출력 다시 쓰기 확인란을 선택한 다음 필요에 따라 HTML을 사용자 정의하십시오. 토큰의 경우 텍스트 입력 영역 아래 상자에 표시된 교체 패턴을 사용할 수 있습니다 .

교체 패턴 과 관련하여 보기에 다음과 같은 경고가 표시됩니다.

렌더링 순서로 인해이 필드 뒤에 오는 필드를 사용할 수 없습니다. 여기에 나열되지 않은 필드가 필요한 경우 필드를 다시 정렬하십시오.

이것으로 충분하지 않으면 새 필드 Global : Custom text를 추가하십시오 . 이를 통해 임의의 HTML을 추가 할 수 있으며 대체 패턴 도 여기에서 사용할 수 있습니다. 두 개의 별도의 전역 : 사용자 정의 텍스트 필드를 사용하여 <div>시작 및 종료 태그 를 추가 할 수 있습니다 .


안녕하세요 도와 주셔서 감사합니다. 그룹화 필드를 변경하려고합니다 (페이지 : 스타일 옵션> 그룹화 필드 Nr.1)이 그룹화 필드의 출력을 변경하는 옵션이없는 것 같습니다. Global: Custom text그룹 내에서 행을 사용 하지만 그룹 외부에서는 행에 영향을주지 않음
big_smile

그룹화 필드 Nr.1 을 선택 하면 렌더링 된 출력을 그룹화사용행 클래스 옵션이 있습니다 . 어느 쪽도 당신이 원하는 것을하지 않습니까?
패트릭 케니

1
안녕하세요 도와 주셔서 감사합니다. 이러한 옵션은 그룹화 필드 Nr.1에 의해 생성 된 전체 그룹이 아닌 개별 필드 주위에 래퍼 DIv를 추가합니다.
big_smile

@PatrickKenny이 방법이 뷰의 렌더링 시간에 나쁜 영향을 미치는지 알고 있습니까?
user5950

@ user5950 항상 다시 쓰기 결과를 사용하지만 성능 저하를 본 적이 없습니다. 관계 추가와 같은 다른 일반적인보기 작업은 다시 쓰기 결과보다 성능이 저하 될 가능성이 더 크다고 생각합니다.
Patrick Kenny

5

요즘 나는 같은 문제에 부딪쳤다. 그리고 그룹 래퍼 옆에 필요한 것은 그룹당 첫 번째 / 마지막과 같은 CSS 클래스였습니다.

그래서 views-view-unformatted.tpl.php에 다음 PHP 코드를 추가했습니다.

<?php
  #### defs
  // call a global variable every time the template is called
  global $static;
  // be aware of the key_name for the global variable to keep it 
  // unique for every display
  // I call the same view in one panel several times with 
  // different arguments 
  $key_name = $view->name . '_' . $view->current_display ;
  foreach ($view->args as $value) {
    $key_name .= '_' . $value;
  }
  // init classes array
  $group_classes = array();
  ## groups counter - store in global variable 
  if (!isset($static[$key_name]['gc'])) {
    $static[$key_name]['gc'] = 1;
  }
  else {
    $static[$key_name]['gc']++;
  }
  #### classes
  ## counter
  $group_classes[] = 'group-' . $static[$key_name]['gc'];
  ## first
  if ($static[$key_name]['gc'] == 1) {
    $group_classes[] = 'first';
  }
  ## last
  // get max row "id" per group
  foreach ($rows as $id => $row) {
    $max_id = $id;
  }
  // count results (-1 because $id starts with 0)
  $count_results = count($view->result) - 1;
  //
  if ($max_id == $count_results) {
    $group_classes[] = 'last';
  }
  ## ret
  $group_class = implode(' ', $group_classes);
?>

래퍼와 클래스가있는 html 부분은 다음과 같습니다.

<div class="views-group <?php print $group_class; ?>">
  <?php if (!empty($title)): ?>
    <h3><?php print $title; ?></h3>
  <?php endif; ?>
  <?php foreach ($rows as $id => $row): ?>
    <div <?php if ($classes_array[$id]) { print 'class="' . $classes_array[$id] .'"';  } ?>>
      <?php print $row; ?>
    </div>
  <?php endforeach; ?>
</div>

출력은 다음과 같습니다.

<div class="views-group group-1 first">
  content of first group
</div>
<div class="views-group group-2">
  content of second group
</div>    
<div class="views-group group-3 last">
  content of third group
</div>

도움이 될 수 있습니다-즐기십시오


3

그래서 가장 큰 수수께끼는 h3 태그 내에서 $ title 값을 사용하여 클래스를 생성하는 방법입니다. 음역 모듈과 다음 스 니펫을 사용해보십시오.

<?php
  $group_class = function_exists('transliteration_get') ? transliteration_get($title) : $title;
  $group_class = trim($group_class);
  $group_class = str_replace(' ', '-', $group_class);
  $group_class = strtolower($group_class);
?>

이것은 뷰 내에서 명명 된 앵커를 만들어야 할 때 효과적이었습니다.


2

매우 유용합니다-그리드 기반 레이아웃을 위해 알파 / 오메가 클래스를 추가하고 각 행에 대해 두 가지를 모두 지울 수있는 이상한 것도 필요했습니다. 나는 다음에서 라인을 편집했다 :

$group_classes[] = 'group-' . $static[$key_name]['gc'];

이에:

$group_classes[] = 'group-' . $static[$key_name]['gc'] . ($static[$key_name]['gc'] % 2 ? ' alpha even' : ' omega odd');

필요한 출력을 제공합니다.



2

오늘 비슷한 문제가 있었지만 래퍼 HTML의 특정 클래스가 필요했습니다. 제 경우에는 뷰가 분류 용어로 그룹화되어 있으며 각 용어마다 특정 스타일이 필요하므로 용어 당 특정 클래스가 필요합니다. 뷰 형식화되지 않은 템플릿을 변경 한 방법은 다음과 같습니다.

<?php if(is_numeric($title)) { $term = taxonomy_term_load($title); $title = $term->name; } ?>
<div class="term-<?php print $term->tid;?>">
<?php if (!empty($title)): ?>
    <h3><?php print $title; ?></h3><!--this is the group name-->
<?php endif; ?>
<?php foreach ($rows as $id => $row): ?>
  <div class="<?php print $classes_array[$id]; ?>">
    <?php print $row; ?>
</div>
<?php endforeach; ?>
</div><!--end your div-->

뷰에서 분류 용어 필드의 표시는 "항목 ID 표시"로 설정됩니다. 따라서 클래스 이름의 일부로 ID를 가져온 다음 동일한 ID를 기반으로 제목을로드합니다.


2

코드로 들어가고 템플릿을 사용하고 싶지 않은 사람은 Fences를 사용하여 기본 div 클래스를 제거하고 Simple field formatter를 사용하여 필드의 접두사와 접미사에 자신의 div를 추가하여 쉽게 할 수 있습니다 . 여러 필드가있는 경우 첫 번째 필드의 접두사와 마지막 필드의 접미사에 포함 div를 추가하십시오.

따라서 접두사와 접미사 영역이 잘리지 않은 기본 구조는 다음과 같습니다.

<div class="field field-name-field-test field-type-text field-label-above">
 <div class="field-label">Foobar field:&nbsp;</div>
  <div class="field-items">
   *:prefix posted here*
   <div class="field-item even">Leaner markup means better front-end performance.</div>
   *:suffix posted here*
 </div>
</div>

"foo"클래스를 추가하려고한다면

   <div class="foo"> *:prefix posted here*
    Leaner markup means better front-end performance.
   </div> *:suffix posted here*

2

위의 chrisjlee의 답변은 템플릿 파일의 이름을 지정하는 것을 제외하고는 잘 설명합니다. 하나의보기 만 변경하려면 새 파일에보기의 시스템 이름이 포함되어야합니다. 뷰의 편집 페이지 URL에서 찾을 수 있습니다. 비슷한 문제에 대한이 의견에서 잘 설명되어 있습니다 : https://www.drupal.org/node/1383696#comment-6729128

$ title 값을 사용하여 행 주위에 클래스가 필요하므로 2 열로 렌더링 할 수 있습니다. 코드는 다음과 같습니다.

<?php if (!empty($title)): ?>
  <h3><?php print $title; ?></h3>
<?php endif; ?>
<div class="<?php print strtolower($title); ?>" > <!--added div with class-->
<?php foreach ($rows as $id => $row): ?>
  <div<?php if ($classes_array[$id]) { print ' class="' . $classes_array[$id] .'"';  } ?>>
    <?php print $row; ?>
  </div>
<?php endforeach; ?>
</div> <!--end of added div-->

2

비슷한 문제가 발생했습니다. 그룹화 된 행이 부트 스트랩 아코디언 내에 표시되기를 원했습니다. Views Bootstrap 모듈로 작업하지 못했습니다 .
의견 # 4는 내 문제를 해결했습니다.
여기 내 views-view-unformatted-[my_view_name]-[my_display_name].tpl.php모습이

<?php

/**
 * @file
 * YOUR_THEME simple view template to display a list of rows.
 *
 * @ingroup views_templates
 */
?>

    <?php
    #### defs
      // call a global variable every time the template is called
      global $static;
      // be aware of the key_name for the global variable to keep it 
      // unique for every display
      // I call the same view in one panel several times with 
      // different arguments 
      $key_name = $view->name . '_' . $view->current_display ;
      foreach ($view->args as $value) {
        $key_name .= '_' . $value;
      }
      // init classes array
      $group_classes = array();
      ## groups counter - store in global variable 
      if (!isset($static[$key_name]['gc'])) {
        $static[$key_name]['gc'] = 1;
      }
      else {
        $static[$key_name]['gc']++;
      }
      #### classes
      ## counter
      $group_classes[] = 'group-' . $static[$key_name]['gc'];
      ## first
      if ($static[$key_name]['gc'] == 1) {
        $group_classes[] = 'first';
      }
      ## last
      // get max row "id" per group
      foreach ($rows as $id => $row) {
        $max_id = $id;
      }
      // count results (-1 because $id starts with 0)
      $count_results = count($view->result) - 1;
      //
      if ($max_id == $count_results) {
        $group_classes[] = 'last';
      }
      ## ret
      $group_class = implode(' ', $group_classes);
      $group_id = implode($group_classes); // helps me having a id whithout spaces for my accordions panels.
    ?>

    <div class="panel panel-default <?php print $group_class; ?>">
        <?php if (!empty($title)): ?>
          <?php if($group_id == 'group-1first'): ?>
                <!--<h3><?php //print $title; ?></h3>-->
                <div class="panel-heading" role="tab" id="heading<?php print $group_id; ?>">
                    <h3 class="panel-title">
                        <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse<?php print $group_id; ?>" aria-expanded="true" aria-controls="collapse<?php print $group_id; ?>">
                            <?php print $title; ?>
                        </a>
                    </h3>
                </div>
                <div id="collapse<?php print $group_id; ?>" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="heading<?php print $group_id; ?>">

            <?php else: ?>
                <div class="panel-heading" role="tab" id="heading<?php print $group_id; ?>">
                    <h3 class="panel-title">
                        <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse<?php print $group_id; ?>" aria-expanded="false" aria-controls="collapse<?php print $group_id; ?>">
                            <?php print $title; ?>
                        </a>
                    </h3>
                </div>
                <div id="collapse<?php print $group_id; ?>" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading<?php print $group_id; ?>">

            <?php endif; ?>
        <?php endif; ?>                                                 

                    <div class="panel-body">
                        <?php foreach ($rows as $id => $row): ?>
                                    <div<?php if ($classes_array[$id]) { print ' class="' . $classes_array[$id] .'"';  } ?>>
                                        <?php print $row; ?>
                                    </div>
                        <?php endforeach; ?>
                    </div>
            </div>
    </div>

물론 아코디언이 작동하려면 views-view- [my_view_name]-[my_display_name] .tpl.php를 편집해야합니다.

<?php if ($rows): ?>
    <!--<div class="view-content">-->
    <div class="view-content panel-group" id="accordion" role="tablist" aria-multiselectable="true">
      <?php print $rows; ?>
    </div>
  <?php elseif ($empty): ?>
    <div class="view-empty">
      <?php print $empty; ?>
    </div>
  <?php endif; ?>

HTML 주석 사이에 모듈의 기본 코드를 남겼습니다.
도움이 되길 바랍니다.

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