Drupal:如何排序和显示按视图中的第一个字母分组的节点

时间:2011-01-03 17:06:59

标签: drupal views drupal-views

我有一个巨大的公司列表(nodetype:公司,只有字段是标题),我希望以一种很好的方式显示它们像第一个字母一样拼写它们像这样的字典:

A
Abc company
Alot of work company

B
Beautiful company
Best company

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

7 个答案:

答案 0 :(得分:12)

你真的不需要沿着代码路径去实现这个目标。您可以在此处看到其中的一些内容:http://drupal.org/node/641342

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

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

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

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

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

答案 1 :(得分:6)

查看the Views module,其中提供了一个名为“词汇表”的视图。按字母顺序对内容进行排序,并创建各种字母索引。另请查看http://drupal.org/node/441024虽然有可能使用the Glossary module。还有一个名为Dictionarydemo)的模块。

答案 2 :(得分:2)

要使用Views执行您想要执行的操作,而不是像Glossary那样执行其他贡献模块,您必须定义和主题化您自己的视图。

首先,您需要创建一个新节点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; ?>

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

答案 3 :(得分:1)

如果使用“视图”模块,是否尝试在模板中使用预处理方法?您不会以这种方式从数据源返回数据,但是您可以按照任何方法对其进行排序,一旦返回它,它将看起来像这样:

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

答案 4 :(得分:1)

模块Views grouping Limit可能会让你想去的地方。

答案 5 :(得分:1)

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

  1. 我列出了所有分类术语的简单列表,即术语名称为字段。
  2. 然后我再次添加了分类术语字段,但这次我使用了它 获得术语的第一个名称,即设置重写输出 - >限制数 of characters-&gt; true。并将限制设置为1.也排除此字段 来自显示。
  3. 现在转到Format-&gt;设置并使用单个字符字段 分组。最后用分类术语过滤器对结果进行排序。

答案 6 :(得分:0)

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