Drupal:如何在视图中按首字母排序和显示节点分组

Posted

技术标签:

【中文标题】Drupal:如何在视图中按首字母排序和显示节点分组【英文标题】:Drupal : how to sort and display nodes grouping by first letter in view 【发布时间】:2011-01-03 17:06:59 【问题描述】:

我有一个庞大的公司列表(节点类型:公司,只有字段是标题),我想以一种很好的方式显示它们,按首字母对它们进行分组,就像这样的字典:

A
Abc company
Alot of work company

B
Beautiful company
Best company

试图找到一种优雅的方式来做到这一点;似乎不存在任何模块。有什么想法吗?

【问题讨论】:

【参考方案1】:

您实际上并不需要通过代码路径来实现这一点。您可以在此处看到其中的一些描述:http://drupal.org/node/641342

基本上,将节点标题添加到视图中两次。第一个是带有链接等的普通字段。第二个是用于分组的。

您标记为从显示中排除的第二个字段,删除标签,并将该字段修剪为最大长度 1(取消选中单词边界、省略号和 html 选项)。

然后,在“行样式”选项下,您将找到“分组依据”设置,您只需选择第二个节点标题字段。

如果您想让它看起来以某种方式或可能为每个字母添加锚点,您可能需要应用额外的主题,否则这应该适用于带有视图 2 模块的 Drupal 版本 6

另外,我应该指出模块http://drupal.org/project/views_groupby 的分组,它可以提供一些额外的功能,但原始问题并不真正需要这些功能。

【讨论】:

好主意,因为我正在处理类似的问题,您将如何“填写”没有产生任何结果的字母? nvm 自己搞定了:drupal.stackexchange.com/questions/20754/… 使用 Drupal 7 我找不到“行样式”或“分组依据”,但在显示 -> 页面详细信息 -> 格式 -> 格式 -> 设置下找到了等效控件 @messedup 在我看来,有些字段没有正确排序,See this question 这种方法效果很好,不需要添加自定义代码。【参考方案2】:

查看the Views module,它提供了一个名为“词汇表”的视图。这会按字母顺序对内容进行排序,并创建一个字母索引。也可以看看http://drupal.org/node/441024,尽管她可能使用了the Glossary module。还有一个模块叫Dictionary (demo)。

【讨论】:

谢谢几乎我想要的;跟随你的链接,来到那个完全符合我要求的nanwich.info/glossary。但我被困在 args 的观点中;我想显示所有字母,但我只能指定 1 个字符 你不能将视图 arg 留空然后它会全部显示吗?【参考方案3】:

要使用视图而不是其他贡献的模块(例如词汇表)来做您想做的事情,您必须定义和主题化您自己的视图。

首先,您需要创建一个新的节点视图。我将把它称为我的词汇表,但这并不重要。确保您的字段之一是节点标题,并且它按节点标题升序排序。换句话说,按字母顺序。我假设您将使用未格式化的行样式(这是默认设置),但您可能可以对其他行样式执行类似的操作。

然后,您必须进入您的主题。从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; ?>

您可能需要重新生成主题注册表才能让您的更改显示在您的网站上。

【讨论】:

这种方法可能有效,但您不需要这样做。您无需任何自定义代码即可实现相同的效果。【参考方案4】:

Views grouping Limit 模块可以带你去想去的地方。

【讨论】:

不;我实际上不想限制;我想按节点标题的第一个字母分组。【参考方案5】:

如果您使用 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 的各种排序方法来获得所需的排序。

【讨论】:

使用 print_r($vars) 查看您将使用哪些变量。然后,您可以在视图中使用这些变量之前对其进行更改。【参考方案6】:

这可以简单地通过视图来完成。我这样做是为了制作一个类似的分类列表:

    我列出了所有分类术语的简单列表,即术语名称作为字段。 然后我再次添加了分类术语字段,但这次我使用了它 获取术语的名字,即设置重写输出->限制数 字符数->真。并将限制设置为 1。同时排除此字段 来自显示器。 现在转到格式->设置并使用单字符字段 分组。最后使用分类术语过滤器对结果进行排序。

【讨论】:

【参考方案7】:

您可以通过使用 AZ 过滤器创建视图来实现类似的功能(或者您可以更改该代码)。我在blog 上写了一篇关于这个问题的帖子。希望对您有所帮助。

【讨论】:

以上是关于Drupal:如何在视图中按首字母排序和显示节点分组的主要内容,如果未能解决你的问题,请参考以下文章

在视图中按有机组列出 Drupal 节点

如何设置排序器强度和分解以按首字母排序 unicode 字符串

Java编程实现中英混合字符串数组按首字母排序的方法

mysql字段排序数字在字母前面,字母也要按首字母排序

按首字母 Javascript 按字母顺序对对象进行排序和分组

如何对 Views 页面显示进行分页?