Drupal: как сортировать и отображать группы узлов по первой букве - PullRequest
6 голосов
/ 03 января 2011

У меня есть огромный список компаний (тип узла: компания, только поле - заголовок), который я хочу отобразить, сгруппировав их по первой букве, как словарь, подобный этому:

A
Abc company
Alot of work company

B
Beautiful company
Best company

Попытка найти способ сделать это элегантным способом; похоже, для этого не существует ни одного модуля. Есть идеи?

Ответы [ 7 ]

12 голосов
/ 23 марта 2011

Вам не нужно идти по пути кода, чтобы достичь этого. Вы можете увидеть некоторые из описанных здесь: http://drupal.org/node/641342

В основном, добавьте заголовок узла к представлению дважды. Первое - ваше обычное поле со ссылками и т. Д. Второе - для группировки.

Второе поле, которое вы отметите, чтобы исключить из отображения, удалить метку и обрезать поле до максимальной длины 1 (снимите флажки с границ слова, многоточия и HTML).

Затем в опциях «стиль строки» вы найдете настройку «Группировать по» и просто выберите поле заголовка второго узла.

Возможно, вам придется применить дополнительную тематику, если вы хотите, чтобы она выглядела определенным образом или, возможно, добавили привязки для каждой буквы, но в противном случае это должно работать для версии 6 Drupal с модулем views 2

Кроме того, я должен указать группу по модулю http://drupal.org/project/views_groupby, который может предложить некоторые дополнительные функции, но который на самом деле не нужен для первоначального вопроса.

6 голосов
/ 03 января 2011

Взгляните на модуль Views , который предоставляет представление под названием «Глоссарий».Это сортирует контент в алфавитном порядке и создает сортировку буквенных указателей.Также взгляните на http://drupal.org/node/441024, хотя возможно, что она использовала модуль Глоссария .Также есть модуль под названием Dictionary ( demo ).

2 голосов
/ 14 января 2011

Для того, чтобы делать то, что вы хотите, используя Представления, а не какой-либо другой модуль, например Глоссарий, вам нужно определить и задать тему для собственного представления.

Сначала вам нужно создать новый узел View.Я собираюсь назвать это Myglossary, но это не имеет значения.Убедитесь, что одно из ваших полей является заголовком узла, и что оно отсортировано по заголовку узла по возрастанию.Другими словами, в алфавитном порядке.Я предполагаю, что вы будете использовать неформатированный стиль строки (это по умолчанию), но вы, вероятно, можете сделать что-то похожее с другими стилями строки.

Затем вам нужно будет перейти к своей теме.Из папки views / theme скопируйте шаблон views-view-unformatted.tpl.php в папку используемой темы.Переименуйте его в views-view-unformatted - myglossary.tpl.php, чтобы он использовался только для этого представления.Затем откройте файл template.php вашей темы и добавьте функцию предварительной обработки:

//Change mytheme to your theme name
function mytheme_preprocess_views_view_unformatted__myglossary(&$vars) {
  //If you have the devel module installed,
  //this is a great way to see all the available variables
  //dpm($vars);

  $results = $vars['view']->result;
  $rows = $vars['rows'];

  //Sort rows into letter sets
  $letters = array();
  $i = 0;
  foreach ($results as $result) {
    $first_letter = strtolower(substr($result->node_title, 0, 1));
    if (is_array($letters[$first_letter])) {
      array_push($letters[$first_letter], $rows[$i]);
    }
    else {
      $letters[$first_letter] = array($rows[$i]);
    }
    $i++;
  }

  //Generate glossary navigation
  $nav = '';
  foreach($letters as $letter => $rows) {
    $num = count($rows);
    $cap_letter = strtoupper($letter);
    $nav .= <<<NAV
<a href="#$letter" class="letter_link">
  $cap_letter
</a>
($num)
NAV;
  }

  //Add to variables
  $vars['nav'] = $nav;
  $vars['letters'] = $letters;
}

Затем вам придется изменить файл шаблона, который вы скопировали ранее, чтобы добавить его в навигацию и вывестистроки в стиле глоссария:

<?php if (!empty($title)): ?>
  <h3><?php print $title; ?></h3>
<?php endif; ?>

<?php if (!empty($nav)): ?>
  <div id="glossary_nav">
    <?php print $nav; ?>
  </div>
<?php endif; ?>

<?php foreach ($letters as $letter=>$rows): ?>
  <a name="<?php print $letter ?>"></a>
  <h4 class="letter">
    <?php print strtoupper($letter); ?>
  </h4>
  <?php foreach ($rows as $id=>$row): ?>
   <div class="<?php print $classes[$id]; ?>">
    <?php print $row; ?>
   </div>
  <?php endforeach;?>
<?php endforeach; ?>

Вам может потребоваться заново создать реестр тем, чтобы ваши изменения отображались на вашем сайте.

1 голос
/ 18 июля 2012

это можно сделать просто просмотром. Я сделал это для составления аналогичного списка для таксономии:

  1. Я составил простой список всех терминов таксономии, то есть названия термина как поля.
  2. Затем я снова добавил поле термина таксономии, но на этот раз я использовал его чтобы получить имя первого термина, т.е. установить перезапись вывода-> предельное число символов-> правда. и установите предел 1. Также исключите это поле с дисплея.
  3. Теперь перейдите в «Формат-> Настройки» и используйте одно символьное поле для группировка. В конце сортируйте результаты с помощью фильтра таксономических терминов.
1 голос
/ 09 января 2011

Модуль Предел группировки просмотров может получить вас, куда вы хотите пойти.

1 голос
/ 07 января 2011

Если вы используете модуль Views, пытались ли вы использовать метод предварительной обработки в шаблоне? Вы не будете возвращать данные из своего источника данных таким способом, но вы можете отсортировать их любым произвольным способом, который захотите, когда он будет возвращен, он будет выглядеть примерно так:

function templatename_preprocess_views_view__All_Images(&$vars)
{
    global $base_url;
$images = array();
//drupal_add_js('$("a.colorbox").colorbox();','inline');
foreach($vars['view']->result as $img)
{
    $nid = $img->nid;
    $node = node_load($nid);
    $images[$nid]['orig_img_url'] = $base_url . '/' . file_create_path($node->images['_original']);
    $images[$nid]['thumb_img_url'] = $base_url . '/' . file_create_path($node->images['thumbnail']);
}
$vars['images'] = $images;

}

Таким образом, вы можете сортировать по первой букве и вносить изменения в массив, и он будет отослан на ваш взгляд желаемым способом. Это пример, который я сделал для путей к изображениям, но вы можете использовать различные методы сортировки PHP, чтобы получить необходимую вам сортировку.

0 голосов
/ 15 сентября 2011

Вы можете достичь аналогичной функциональности, создав представление с использованием фильтра А-З (или вы можете изменить этот код). Я написал сообщение об этой проблеме в моем блоге . Надеюсь, это поможет.

...