2011-01-03 10 views
6

Ich habe eine riesige Liste von Unternehmen (nodeltype: Firma, nur Feld ist Titel), die ich auf eine nette Weise gruppieren sie durch den ersten Buchstaben wie a Dictionnary wie folgt:Drupal: wie zu sortieren und anzuzeigen Knoten Gruppierung nach dem ersten Buchstaben in der Ansicht

A 
Abc company 
Alot of work company 

B 
Beautiful company 
Best company 

Versuchen, einen Weg zu finden, es auf eine elegante Weise zu tun; dafür scheint kein Modul zu existieren. Irgendeine Idee ?

Antwort

2

Um zu tun, was Sie mit Ansichten tun möchten, und nicht mit anderen Modulen wie Glossar, müssen Sie Ihre eigene Ansicht definieren und gestalten.

Zuerst müssen Sie einen neuen Knoten Ansicht erstellen. Ich werde es Myglossar nennen, aber das spielt keine Rolle. Stellen Sie sicher, dass eines Ihrer Felder der Name des Knotens ist und dass er nach dem Knotentitel aufsteigend sortiert ist. Mit anderen Worten, alphabetische Reihenfolge. Ich gehe davon aus, dass Sie den unformatierten Zeilenstil (Standard) verwenden, aber Sie können wahrscheinlich etwas Ähnliches mit den anderen Zeilenstilen machen.

Dann müssen Sie in Ihr Thema einsteigen. Kopieren Sie im Ordner views/theme die Vorlage views-view-unformatted.tpl.php in den Ordner des verwendeten Designs. Benennen Sie es in views-view-unformatted um - myglossary.tpl.php so dass es nur für diese Ansicht verwendet wird. Öffnen Sie dann Ihr Thema der template.php Datei auf, und fügen Sie ein Vorprozess Funktion:

//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; 
} 

Dann werden Sie die Vorlage Datei, die Sie über früher kopiert ändern müssen in der Navigation hinzuzufügen, und zur Ausgabe der Reihen in einem Glossar Stil:

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

möglicherweise müssen Sie das Thema Registry regenerieren, um die Änderungen auf Ihrer Website zeigen, bis zu haben.

+0

Dieser Ansatz funktioniert möglicherweise, aber Sie müssen dies nicht tun. Sie können denselben Effekt ohne benutzerdefinierten Code erzielen. – messedup

6

Werfen Sie einen Blick auf the Views module, die eine Ansicht namens "Glossar" bietet. Das sortiert den Inhalt alphabetisch und erstellt einen Buchstabenindex. Werfen Sie auch einen Blick auf http://drupal.org/node/441024, obwohl es möglich ist, dass sie the Glossary module verwendet. Es gibt auch ein Modul namens Dictionary (demo).

+0

Thx fast was ich wollte; folgte Ihrem Link und kam zu dem http://nanwich.info/glossar, der genau das tut, was ich will. Aber ich stecke in den Ansichten args fest; Ich möchte alle Buchstaben zeigen, aber ich kann nur 1 Zeichen angeben – Disco

+0

Kannst du nicht die Ansichten leer leer und dann wird es alle anzeigen? – shanabus

1

Wenn Sie das Modul Ansichten verwenden, haben Sie versucht, eine Vorverarbeitungsmethode in der Vorlage zu verwenden? Sie würden nicht die Daten aus Ihrer Datenquelle in dieser Art und Weise zurückkommen, aber man könnte es mit jeder beliebigen Methode sortieren Sie wollte, sobald er zurückgekehrt war, würde es in etwa so aussehen:

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; 

}

Auf diese Weise können Sie nach dem ersten Buchstaben sortieren und Änderungen am Array vornehmen, und es wird in der von Ihnen gewünschten Weise an Ihre Ansicht gesendet. Dies ist ein Beispiel, das ich für Bildpfade gemacht habe, aber Sie könnten die verschiedenen Sortiermethoden von PHP verwenden, um die von Ihnen benötigte Sortierung zu erhalten.

+0

Können Sie einige Beispiele geben? – Disco

+0

Verwenden Sie print_r ($ vars), um zu sehen, mit welchen Variablen Sie arbeiten werden. Sie können diese Variablen dann ändern, bevor sie in Ihrer Ansicht verwendet werden. –

1

Das Modul Views grouping Limit kann Sie dorthin bringen, wohin Sie wollen.

+0

Nein; Ich möchte nicht wirklich begrenzen; Ich möchte nach dem ersten Buchstaben des Knotentitels gruppieren. – Disco

12

Sie müssen nicht wirklich den Code-Pfad gehen, um dies zu erreichen. Sie können einige davon hier beschrieben sehen: http://drupal.org/node/641342

Grundsätzlich fügen Sie den Knoten Titel der Ansicht zweimal hinzu. Der erste ist Ihr normales Feld mit Links usw. Der zweite ist für die Gruppierung.

Das zweite Feld, das Sie aus der Anzeige ausschließen möchten, entfernen Sie die Beschriftung und trimmen das Feld auf eine maximale Länge von 1 (deaktivieren Sie die Optionen Wortgrenze, Ellipse und HTML).

Dann finden Sie unter den "Zeilenstil" -Optionen die Einstellung "Gruppieren nach", und Sie wählen einfach das Titelfeld des zweiten Knotens aus.

Sie müssen möglicherweise zusätzliche Thematisierung anwenden, wenn Sie es sehen eine gewisse Art und Weise haben wollen oder möglicherweise Anker für jeden Buchstaben hinzufügen, aber ansonsten sollte, dass für die Version 6 von Drupal arbeiten mit Ansichten 2 Modul

Auch ich sollte die Gruppe nach Modul http://drupal.org/project/views_groupby hinweisen, die einige zusätzliche Funktionalität bieten kann, die aber für die ursprüngliche Frage nicht wirklich benötigt wird.

+0

nettes Denken, da ich ein ähnliches Problem angehen würde, wie würden Sie die Buchstaben "ausfüllen", die keine Ergebnisse ergaben? – magtak

+0

nvm habe es mir selbst: http://drupal.stackexchange.com/questions/20754/views-group-by-first-letter-of-results/20855 – magtak

+0

Mit Drupal 7 konnte ich nicht finden "row style" oder " Gruppieren mit ", aber die entsprechenden Steuerelemente finden Sie unter Anzeigen -> Seitendetails -> Format -> Format -> Einstellungen – tremby

0

Sie können ähnliche Funktionen erzielen, indem Sie eine Ansicht mit einem AZ-Filter erstellen (oder diesen Code ändern). Ich schrieb einen Artikel über dieses Problem an meine blog. Ich hoffe es hilft.

1

Dies kann einfach durch Ansichten erfolgen. Ich tat es, um eine ähnliche Liste für eine Taxonomie zu machen:

  1. Ich machte eine einfache Liste aller Taxonomiebegriffe, d. H. Begriff Name als Feld.
  2. Dann habe ich wieder das Taxonomie-Term-Feld hinzugefügt, aber dieses Mal habe ich es verwendet, um den ersten Namen des Ausdrucks zu erhalten, d. H. Setzen Sie Ausgabe-> Limit-Nummer von Zeichen-> wahr. und das Limit auf 1 setzen. Auch das Feld aus dem Display ausschließen.
  3. Gehen Sie nun zu Format-> Einstellungen und verwenden Sie das einzelne Zeichenfeld für Gruppierung. Am Ende sortieren Sie die Ergebnisse mit Taxonomie-Filter.