web-dev-qa-db-ja.com

ビュー-グループの周りにラッパーDIVを追加する

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のトークンを挿入することはできません。

任意の助けいただければ幸いです。

42
big_smile

最近、同じことをする必要がありました。テンプレートファイルを作成できます。

  • /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-->
50
Kristy Gislason

Format:HTMLリストを試してください。それはすべてを項目リストにラップします。私の目的には完璧です(分類項目のリスト)。お役に立てれば。

15
Dagomar

結果の書き換え機能を試しましたか?編集するフィールドをクリックし、結果の書き換えが表示されるまで下にスクロールします。 のチェックボックスをオンにし、このフィールドの出力を書き直して、必要に応じてHTMLをカスタマイズします。トークンには、テキスト入力領域の下のボックスに表示される置換パターンを使用できます。

置換パターンについて、ビューが表示する警告に注意してください。

レンダリング順序のため、このフィールドの後に続くフィールドは使用できないことに注意してください。ここにリストされていないフィールドが必要な場合は、フィールドを再配置してください。

これで十分でない場合は、新しいフィールドGlobal:Custom textを追加してみてください。これにより、任意のHTMLを追加できるようになり、置換パターンもここで使用できます。 2つの個別のGlobal:Custom textフィールドを使用して、<div>開始タグと終了タグを追加できます。

10
Patrick Kenny

最近、同じ問題に遭遇しました。そして、グループラッパーの横に必要なのは、グループごとの最初/最後のような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>

役立つかもしれません-楽しむ

4
andres

したがって、最大の謎は、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
Artur

私は同様の問題に遭遇しました。グループ化された行をbootstrapアコーディオン内に表示します。 Views Bootstrap module で機能させることはできませんでした。
コメント#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コメントの間に残しました。
それが役に立てば幸い。

1
Mars

コードに飛び込んでテンプレートをいじりたくない人のために、 Fences を使用してデフォルトのdivクラスを削除し、独自のdivをの接頭辞と接尾辞に追加することで、これを行う簡単な方法があります Simple field formatter を使用したフィールド。複数のフィールドがある場合は、最初のフィールドのプレフィックスに含まれる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*
1
Ezra

非常に便利-グリッドベースのレイアウト用にいくつかのアルファ/オメガクラスを追加する必要があり、各行で両方をクリアできるようにするためにも奇妙なものを追加する必要がありました。私は次の行を編集しました:

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

これに:

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

これにより、必要な出力が得られます。

1
soulston

今日も同様の問題がありましたが、ラッパー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に基づいてタイトルをロードします。

1
vegardjo

上記のchrisjleeからの回答は、テンプレートファイルに何を付けるかを除いて、よく説明しています。ビューを1つだけ変更する場合は、新しいファイルにビューのマシン名を含める必要があります。これは、ビューの編集ページのURLにあります。これは、同様の問題に関するこのコメントで非常によく説明されています: https://www.drupal.org/node/1383696#comment-6729128

2列にレンダリングできるように、$ titleの値を使用して行の周りにクラスが必要でした。これがコードです:

<?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-->
1
jn2

文字変換モジュールは必要ありません。 Drupalコアには drupal_html_class 関数があり、.

1
Baris Wanschers