Просмотры - добавьте обертку 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>

Я знаю, что вы можете использовать view-view-unformatted.tpl.php (Output Style), чтобы переместиться над представлением, а затем вставить DIV, чтобы обернуть группу.

Тем не менее, мне нужна моя обертка DIV, чтобы она была как <div id="term_ID_{number of ID}">. Идентификатор номера будет соответствовать термину, который использовался для группировки полей. По умолчанию, если вы используете view-view-unformatted.tpl.php, вы не можете вставлять в него токены для идентификаторов термина.

Любая помощь будет оценена.

40 голосов | спросил big_smile 1 Maypm12 2012, 14:14:01

11 ответов


48

Мне нужно было сделать то же самое в последнее время. Вы можете создать файл шаблона:

  • Найдите шаблон в /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-->
ответил Kristy Gislason 4 Maypm12 2012, 21:41:35
15

Попробуйте формат: список HTML. Это обернет все это в список позиций. Для моей цели это идеально (список пунктов таксономии). Надеюсь, это поможет.

ответил Dagomar 7 MaramThu, 07 Mar 2013 00:01:38 +04002013-03-07T00:01:38+04:0012 2013, 00:01:38
11

Вы пробовали функцию Переписать результаты ? Нажмите на поле, которое вы хотите отредактировать, и прокрутите вниз, пока не увидите Переписать результаты . Установите флажок Перепишите вывод этого поля , а затем настройте HTML-код по мере необходимости. Для токенов вы можете использовать Запасные рисунки , указанные в поле под областью ввода текста.

Что касается Запасных паттернов , обратите внимание на предупреждение, отображаемое в представлении:

  

Обратите внимание, что из-за порядка отображения вы не можете использовать поля, которые появляются после этого поля; если вам нужно поле, не указанное здесь, измените свои поля.

Если этого недостаточно, попробуйте добавить новое поле, Глобальный: Пользовательский текст . Это позволит вам добавить некоторый произвольный HTML, а также Запасные шаблоны . Вы можете использовать два отдельных поля Глобальный: Пользовательский текст , чтобы добавить начальный и конечный теги <div>.

ответил Patrick Kenny 1 Maypm12 2012, 14:29:01
5

В эти дни я столкнулся с той же проблемой. И то, что мне было нужно рядом с групповой оболочкой, было классом css, как первый /последний для каждой группы.

Итак, я добавил в view-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>

Может быть полезно - наслаждайтесь

ответил andres 31 PM00000050000002331 2012, 17:08:23
3

Итак, я думаю, самая большая загадка заключается в том, как сгенерировать класс, используя значение $ title в тегах h3. Я бы попробовал модуль транслитерации и следующий фрагмент:

<?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);
?>

Это работало для меня, когда мне приходилось создавать именованные якоря в представлении.

ответил Artur 1 Maypm12 2012, 15:38:29
2

Очень полезно - мне нужно было добавить некоторые классы альфа /омега для макета на основе сетки, а также некоторые нечетные, даже чтобы очистить их для каждой строки. Я отредактировал строку:

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

:

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

Что дает требуемый результат.

ответил soulston 2 +04002012-10-02T20:32:07+04:00312012bEurope/MoscowTue, 02 Oct 2012 20:32:07 +0400 2012, 20:32:07
2

Вам не нужен модуль транслитерации. Ядро Drupal имеет drupal_html_class для этого.

ответил Baris Wanschers 20 FebruaryEurope/MoscowbWed, 20 Feb 2013 13:43:43 +0400000000pmWed, 20 Feb 2013 13:43:43 +040013 2013, 13:43:43
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-->

В представлении отображения поля termonomy term установлено значение: «Показать идентификатор объекта». Таким образом, мы получаем идентификатор как часть имени класса, а затем загружаем заголовок на основе того же идентификатора.

ответил vegardjo 29 +04002013-10-29T16:38:28+04:00312013bEurope/MoscowTue, 29 Oct 2013 16:38:28 +0400 2013, 16:38:28
2

Для тех, кто не хочет погружаться в код и не работает с шаблонами, есть простой способ сделать это, разделив классы div по умолчанию, используя Задания и добавление собственного div в префикс и суффикс поля, используя Простой полеформатор . Если у вас есть несколько полей, просто добавьте содержащий 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*
ответил Ezra 24 MaramMon, 24 Mar 2014 04:10:31 +04002014-03-24T04:10:31+04:0004 2014, 04:10:31
2

Ответ от chrisjlee выше объясняет это хорошо, за исключением того, что можно назвать файлом шаблона. Если вы хотите изменить только одно представление, новый файл должен содержать имя машины для представления. Вы можете найти это в URL-адресе для страницы редактирования вида. Это очень хорошо объясняется в этом комментарии по аналогичной проблеме: https://www.drupal.org /узел /1383696 # комментарий-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-->
ответил jn2 24 J000000Friday15 2015, 23:44:51
2

Я столкнулся с подобной проблемой. Я хотел, чтобы мои сгруппированные строки отображались в саундтреке. Я не мог работать с Модуль Bootstrap Views .
Комментарий №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>

, конечно, для того, чтобы аккордеон работал, вам также нужно отредактировать view-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.
Надеюсь, что это поможет.

ответил Mars 18 J000000Monday16 2016, 19:28:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132