vues - regrouper par première lettre de résultats

7

Comme le titre le décrit, j'essaie de regrouper les résultats d'une vue par leur première lettre. La recherche sur Google a révélé un moyen pour moi de faire la moitié du tour: afficher le titre deux fois, exclure de l'affichage, limiter à 1 (st) caractère, grouper par cela. Intelligent, je dois l'admettre, mais je dois révéler un champ de regroupement même s'il n'y a pas de résultats tels que:

A
  Alpha
  Anekin

B
  Bravo
  Borvo
C

D
  Delta
  Dooku

Avez-vous des réflexions sur la façon de procéder?

magtak
la source

Réponses:

4

Une solution simple serait d'ajouter un champ qui n'a que la première lettre et de grouper par là.

Views prend également en charge la création d'un glossaire, qui est différent mais qui vous permet de regrouper par la première lettre et de compter le nombre de résultats et d'afficher fx.

A (2) B (2) C (0), en tant que filtre exposé, cela se fait à travers des contextes dans les vues 3.

googletorp
la source
"Une solution simple serait d'ajouter un champ qui ne comportait que la première lettre et de grouper par là." En fait, je l'ai dit dans ma question, mais en voyant «C» ne me donne aucun résultat et je veux toujours qu'il soit présenté, je ne vois pas comment cela m'aide. J'examinerai le glossaire.
magtak
1
@magtak Vous pouvez utiliser le thème pour ajouter des lettres manquantes
googletorp
1
pourriez-vous nous en dire plus?
magtak
J'essaie de comprendre "Une solution simple serait d'ajouter un champ qui n'a que la première lettre". Dois-je ajouter un champ dans mon type de contenu et le remplir avec les lettres de chaque nœud?
brainHax
1

C'était vraiment frustrant mais à la fin je l'ai compris:

Dans le fichier tpl de style de sortie de la ligne des vues:

<?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; ?>

Cela fonctionne pour moi car cette vue produit tous ses résultats, donc je peux supposer en toute sécurité que $ view-> result aura les mêmes éléments que $ lignes. $ row afaik est la sortie de la page en cours. Je ne sais pas si $ view-> result se comporte de la même manière.

magtak
la source
0

Jetez un œil à cet article sur Drupal.org. J'espère que cela vous sera utile, au moins cela m'a aidé.

http://drupal.org/node/1078962

Andrew Smith
la source
Je suis tombé dessus lors de mon expédition sur Google - je
n'ai
0

Nous avons en fait ajouté du code dans la partie "En-tête" de notre vue (sélectionnez la méthode d'entrée du code PHP). Voici notre code php qui fait ce que vous recherchez (et il ne nécessite pas de fichier de modèle séparé).

<?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
la source
assez similaire à ma solution de thème :)
magtak