vistas - agrupar por primera letra de resultados

7

Como describe el título, estoy tratando de agrupar los resultados de una vista por su primera letra. Buscar en Google reveló una forma en que la mitad hace el truco: mostrar el título dos veces, excluir de la pantalla, limitar a 1 (st) carácter, agrupar por eso. Inteligente, debo admitirlo, pero necesito revelar un campo de agrupación incluso si no hay resultados, como por ejemplo:

A
  Alpha
  Anekin

B
  Bravo
  Borvo
C

D
  Delta
  Dooku

¿Alguna idea sobre cómo hacer eso?

magtak
fuente

Respuestas:

4

Una solución simple sería agregar un campo que solo tuviera la primera letra y agruparlo.

Views también admite hacer glosario, que es diferente pero que le permite agrupar por la primera letra y contar el número de resultados y mostrar fx

A (2) B (2) C (0), como filtro expuesto, esto se hace a través de contextos en las vistas 3.

googletorp
fuente
"Una solución simple sería agregar un campo que solo tuviera la primera letra y el grupo". De hecho, dije eso en mi pregunta, pero ver que "C" no me da ningún resultado y todavía quiero que se presente, no puedo ver cómo eso me ayuda. Investigaré el glosario.
magtak
1
@magtak Podrías usar el tema para agregar letras faltantes
googletorp
1
¿podría por favor explicar eso?
magtak
Estoy tratando de entender "Una solución simple sería agregar un campo que solo tuviera la primera letra". ¿Debo agregar un campo en mi tipo de contenido y llenarlo con las letras de cada nodo?
brainHax
1

Fue realmente frustrante, pero al final lo descubrí:

En el archivo tpl de estilo de salida de la fila 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; ?>

Esto funciona para mí, ya que esa vista supera todos sus resultados, por lo que puedo asumir con seguridad que $ view-> result tendrá los mismos elementos que $ filas. $ rows afaik es el resultado de la página actual. No estoy seguro de si $ view-> result se comporta de la misma manera.

magtak
fuente
0

Echa un vistazo a este artículo en Drupal.org. Espero que te sea útil, al menos me ayudó.

http://drupal.org/node/1078962

Andrew Smith
fuente
topamos con él durante mi expedición Google - no pudo encontrar nada útil para mi tema en particular, pero como he dicho anteriormente i fijo que ya :)
magtak
0

De hecho, agregamos código en la parte "Encabezado" de nuestra vista (seleccione el método de entrada para el código PHP). Aquí está nuestro código php que hace lo que está buscando (y no requiere un archivo de plantilla 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
fuente
bastante similar a mi solución de tema :)
magtak