Перегляди - додайте обгортку DIV навколо групи


43

У Drupal 7 я створив представлення, в якому перераховано кілька полів. Поля згруповані за іншим полем (термін ідентифікатор поля). Націнка виглядає приблизно так:

<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}">. Ідентифікатор числа буде відповідати терміну, який використовувався для групування полів. За замовчуванням, якщо ви використовуєте views-view-unformatted.tpl.php, ви не можете вставити в нього жетони для ідентифікаторів терміна.

Будь-яка допомога буде вдячна.

Відповіді:


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
Це просто працювало і для мене, так сильно :)
Клайв

Ти врятував мого приятеля часу!
DropDragon

1
Для всіх, хто читає цю відповідь, цікаво, як розібратися, як назвати їх tplфайл, дивіться відповідь тут drupal.stackexchange.com/questions/11468/… tldr; на вашій сторінці перегляду редагувати, під розширеними клацайте тему: інформація
user56reinstatemonica8

Хоча Q і A - це Drupal 7, те саме працює і для Drupal 8.
Duncanmoo

16

Спробуйте Формат: список HTML. Це зафіксує всю справу в списку елементів. Для моєї мети це ідеально (перелік предметів таксономії). Сподіваюсь, це допомагає.


Це добре. Я хотів додати поле групи в якості класу на обгортці, щоб я міг відповідно до цього стилю, але не можу зробити це в самому інтерфейсі поглядів. Що я зробив замість цього, якщо він комусь допомагає, це: спочатку спочатку також поле, а потім використати css перший селектор.
klidifia

11

Ви спробували функцію Перезаписати результати ? Клацніть на полі, яке ви хочете відредагувати, і прокрутіть вниз, поки не з'являться результати перезапису . Поставте прапорець Перезаписати висновок цього поля та налаштуйте HTML за необхідності. Для лексем можна використовувати шаблони заміни, показані в полі нижче області введення тексту.

Що стосується шаблонів заміни , зверніть увагу на попередження, яке відображається в меню Views:

Зауважте, що через замовлення на надання, ви не можете використовувати поля, що надходять після цього поля; якщо вам потрібне поле, не вказане тут, переставляйте свої поля.

Якщо цього недостатньо, спробуйте додати нове поле, Global: Спеціальний текст . Це дозволить вам додати деякі довільні HTML, і тут також доступні шаблони заміни . Для додавання тегів початку та кінця ви можете використовувати два окремих поля : Глобальне: Власне текстове поле <div>.


Привіт Дякую за допомогу Я намагаюся змінити поле групування (у розділі Сторінка: Параметри стилю> Поле групування Nr.1) Здається, немає жодних варіантів для зміни результату цього поля групування. Використовуючи Global: Custom textефекти рядка в групі, але не за межами групи,
big_smile

Коли ви вибираєте поле Групування Nr.1 , є параметри для використання виведеного результату для рядків групи та класу рядків . Ні один із них не робить того, чого ти хочеш?
Патрік Кенні

1
Привіт Дякую за допомогу Ці параметри просто додають оболонки DIv навколо окремих полів на відміну від усієї групи (що створюється групуванням поля Nr.1).
big_smile

@PatrickKenny Чи знаєте ви, чи цей метод погано впливає на час відображення подання?
user5950

@ user5950 Я весь час використовую результати перезапису, але я ніколи не помічав хіт на продуктивність. Я думаю, що інші загальноприйняті завдання перегляду, такі як додавання відносин, швидше заважають виконувати функції, перш ніж перезаписати результати.
Патрік Кенні

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. Я б спробував модуль транслітерації та наступний фрагмент:

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

У вікні відображення поля терміна таксономія встановлено так: "Показати ідентифікатор сутності". Таким чином, ми отримуємо ідентифікатор як частину назви класу, а потім завантажуємо заголовок на основі того ж ідентифікатора.


2

Для тих, хто не хоче зануритися в код і заплутатися з шаблонами, існує простий спосіб зробити це, знімаючи класи діва за замовчуванням за допомогою Fences і додаючи свій власний 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>

Звичайно, щоб гармошка працювала, вам також потрібно відредагувати 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 коментарями.
Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.