views - agrupar pela primeira letra de resultados

7

Como o título descreve, estou tentando agrupar os resultados de uma exibição pela primeira letra. A pesquisa no Google revelou uma maneira para mim de que metade faz o truque: exibir o título duas vezes, excluir da exibição, limitar o número de caracteres (1), agrupar por isso. Inteligente, devo admitir, mas preciso revelar um campo de agrupamento, mesmo que não haja resultados, como:

A
  Alpha
  Anekin

B
  Bravo
  Borvo
C

D
  Delta
  Dooku

Alguma idéia de como fazer isso?

magtak
fonte

Respostas:

4

Uma solução simples seria adicionar um campo que tivesse apenas a primeira letra e o grupo por isso.

O Views também suporta o glossário, que é um pouco diferente, mas permite agrupar pela primeira letra e contar o número de resultados e mostrar efeitos

A (2) B (2) C (0), como um filtro exposto, isso é feito através de contextos nas visualizações 3.

googletorp
fonte
"Uma solução simples seria adicionar um campo que tivesse apenas a primeira letra e o grupo por isso". Na verdade, eu disse isso na minha pergunta, mas ver "C" não me deu nenhum resultado e ainda quero que seja apresentado. Não vejo como isso me ajuda. Vou dar uma olhada no glossário.
magtak
11
@magtak Você pode usá-los para adicionar letras ausentes
googletorp
11
você poderia por favor explicar isso?
magtak
Estou tentando entender "Uma solução simples seria adicionar um campo que tivesse apenas a primeira letra". Devo adicionar um campo ao meu tipo de conteúdo e preenchê-lo com as letras de cada nó?
brainHax
1

Foi realmente frustrante, mas no final eu descobri:

No arquivo tpl do estilo de saída da linha de vistas:

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

<?php $letters = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
foreach ($letters as $letter):?>
<div class="letter family">
  <div class="letter-header"><?php print $letter;?></div>
<?php print $list_type_prefix;  ?>
  <?php foreach ($rows as $id => $row):?>
    <?php $rest = substr($view->result[$id]->node_title,0,1);?>
  <?php if ($rest == $letter):?>
        <li class="<?php print $classes_array[$id]; ?>"><?php print $row; ?></li>
      <?php endif;?>
  <?php endforeach; ?>
<?php print $list_type_suffix; ?>
</div>
<?php endforeach;?>
<?php print $wrapper_suffix; ?>

Isso funciona para mim, uma vez que essa exibição gera todos os seus resultados, para que eu possa assumir com segurança que $ view-> result terá os mesmos elementos que $ linhas. $ linhas afaik é a saída da página atual. Não tenho certeza se o resultado $ view-> se comporta da mesma maneira.

magtak
fonte
0

Dê uma olhada neste artigo em Drupal.org. Espero que seja útil para você, pelo menos me ajudou.

http://drupal.org/node/1078962

Andrew Smith
fonte
tropeçavam, durante a minha google expedição - não poderia encontrar qualquer coisa útil para o meu problema particular, mas como eu disse acima i fixo já :)
magtak
0

Na verdade, adicionamos código na parte "Cabeçalho" da nossa visualização (selecione o método de entrada para o código PHP). Aqui está o nosso código php que faz o que você está procurando (e não requer um arquivo de modelo separado).

<?php
  $letters = array(
    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','y','z'
  );  
?>  
<h2>Browse by Last Name</h2> 
<ul> 
  <li style="display:inline; padding-right:8px;"> 
    <a href="/Full_time_Faculty_Listing" >All</a>
  </li>
  <?php for ($i=0; $i<count($letters); $i++): ?> 
    <li style="display:inline; padding-right:8px;"> 
      <a href="https://drupal.stackexchange.com/Full_time_Faculty_Listing/<?php print $letters[$i];?>"><?php print strtoupper($letters[$i]);?></a>
    </li> 
  <?php endfor; ?> 
</ul>
bobmct
fonte
bastante semelhante à minha solução theming :)
magtak