Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drupal:如何按视图中的第一个字母对节点分组进行排序和显示_Drupal_Views_Drupal Views - Fatal编程技术网

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

Drupal:如何按视图中的第一个字母对节点分组进行排序和显示,drupal,views,drupal-views,Drupal,Views,Drupal Views,我有一个巨大的公司列表(nodetype:company,唯一的字段是title),我想以一种很好的方式显示它们,通过第一个字母将它们分组,就像这样的单词: A Abc company Alot of work company B Beautiful company Best company 试图找到一种方式,以一种优雅的方式来做这件事;似乎不存在这样的模块。有什么想法吗?看看,它提供了一个名为“词汇表”的视图。它按字母顺序对内容进行排序,并创建排序的字母索引。还可以看看,尽管她可能用过。还

我有一个巨大的公司列表(nodetype:company,唯一的字段是title),我想以一种很好的方式显示它们,通过第一个字母将它们分组,就像这样的单词:

A
Abc company
Alot of work company

B
Beautiful company
Best company

试图找到一种方式,以一种优雅的方式来做这件事;似乎不存在这样的模块。有什么想法吗?

看看,它提供了一个名为“词汇表”的视图。它按字母顺序对内容进行排序,并创建排序的字母索引。还可以看看,尽管她可能用过。还有一个名为()的模块。

如果使用“视图”模块,是否尝试在模板中使用预处理方法?您不会以这种方式从数据源返回数据,但您可以通过任何您想要的任意方法对其进行排序。一旦返回数据,它将如下所示:

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

该模块可能会让您找到想要去的地方

要使用视图而不是其他模块(如词汇表)完成您想做的事情,您必须定义自己的视图并为其设置主题

首先,您需要创建一个新的节点视图。我将称之为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;
}
//将mytheme更改为您的主题名称
函数mytheme_预处理_视图_视图_未格式化_uuMyGlossary(&$vars){
//如果已安装devel模块,
//这是查看所有可用变量的好方法
//dpm($VAR);
$results=$vars['view']->result;
$rows=$vars['rows'];
//将行排序为字母集
$letters=array();
$i=0;
foreach($results作为$result){
$first_letter=strtolower(substr($result->node_title,0,1));
if(是_数组($letters[$first_letter])){
数组推送($letters[$first\u letter],$rows[$i]);
}
否则{
$letters[$first_letter]=数组($rows[$i]);
}
$i++;
}
//生成词汇表导航
$nav='';
foreach($字母为$字母=>$行){
$num=计数($rows);
$cap_letter=strtoupper($letter);

$nav.=您实际上不需要通过代码路径来实现这一点。您可以在这里看到一些描述:

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

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

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

如果您想让它以某种方式显示,或者可能为每个字母添加锚定,您可能需要应用额外的主题,但是,对于版本6的Drupal with views 2模块,这应该是可行的


另外,我应该指出分组模块,它可以提供一些额外的功能,但对于原始问题来说并不真正需要。

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

这可以通过查看来完成。我这样做是为了为分类法制作一个类似的列表:

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

  • Thx几乎是我想要的;跟随你的链接,找到了一个完全符合我要求的链接。但是我被困在视图args中;我想显示所有字母,但我只能指定1个字符。你不能将视图arg留空,然后它将显示所有吗?不,我不想限制;我想按节点标题的第一个字母分组。使用打印($vars)以查看您将使用哪些变量。然后,您可以在视图中使用这些变量之前更改这些变量。这种方法可能有效,但您不需要这样做。您可以在不使用任何自定义代码的情况下实现同样的效果。考虑得好,既然我正在处理类似的问题,您将如何“填充”没有产生任何结果的字母?nvm自己得到了:对于Drupal 7,我找不到“行样式”或“分组方式”,但在“显示->页面详细信息->格式->格式->Settings@messedup在我看来,有些字段没有正确排序,这种方法非常有效,不需要添加自定义代码。
    <?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; ?>