Prozentbalken bei Views (Balkendiagramm)
Mit diesem Code kann die Prozentuale Verteilung von Beiträgen eines bestimmten Beitragstyps im Vergleich zur Gesamtzahl der Beiträge mit einem Balkendiagramm angezeigt werden.
Neben dem üblichen Views-Modul braucht man noch das http://drupal.org/project/views_customfield. Damit kann man per php-Code eigene Felder erstellen.
- Man erzeugt einen neuen View vom Typ "Begriff"/"Term".
- Man fügt das Feld "Taxonomie: Begriff"/"Taxonomy: Term" hinzu. Das Feld wird ganz oben "von der Anzeige ausgeschlossen."
- Man fügt das Feld "Taxonomie: Begriff"s ID"/"Taxonomy: Term ID" hinzu. Das Feld wird ganz oben "von der Anzeige ausgeschlossen."
- Da meistens viele Dinge bereits mit Taxonomien belegt sind, kann jetzt ein Filter "Taxonomie:Vokabular" hinzugefügt werden, mit dem man die angezeigten Ergebnisse auf bestimmte Taxonomien beschränkt.
- Falls man mit verschachtelten Taxonomien arbeitet, kann die Anzeige teilweise verwirrend sein. Man kann mit zusätzlichen Filtern z.B. die übergeordneten Begriffe ausschliessen.
- Ein Feld "Taxonomie: Vokabularname" anlegen und per Checkbox "von der Anzeige ausschliessen".(wird später benötigt für Gruppierung)
- Ein neues "Customfield" hinzufügen. Beschriftung: leer. Per Checkbox "dieses Feld als Link ausgeben" und in den Pfad
taxonomy/term/[tid]
und bei Alt-Text[name]
eingeben. (Das funktioniert nur, wenn das Feld für den Begriffsnamen vor diesem Feld angelegt wurde!(siehe Schritt 2)) - Per Checkbox die "Nummer 0 als leer werten" und das Feld "verstecken, falls leer".
- Als Wert folgenden Code eingeben:
<?php $nodecount_bytype=db_result(db_query("SELECT COUNT(nid) FROM {node} WHERE type= 'XYZ'")); //count all nodes of a certain type(replace XYZ with your nodetype name)?>
<?php $nodecount_byterm=taxonomy_term_count_nodes($data->tid, $type = 0); //count all nodes on this term?>
<?php $nodecount_percent=($nodecount_byterm/$nodecount_bytype)*100; //calculate percentage?>
<?php if ($nodecount_byterm!='0' ) { //check if any nodes for this term exist ?>
<div class="percent-bg" style="width: 100%; background: silver; margin-bottom: 5px; ">
<div class="percent-bar" style="width: <?php echo($nodecount_percent);?>%; background: orange; overflow: visible; white-space: nowrap;">
<span class="percent-text" style="padding-left: 5px;">
<?php echo ($data->term_data_name.': '.number_format($nodecount_percent,2).' Prozent');?>
</span>
</div>
</div>
<?php } else echo '0'; //output zero for terms with no nodes and hide that term?>
In der ersten Zeile wird der Beitragstyp definiert. Das "XYZ" muss durch den maschinenlesbaren Namen des Beitragstypes/Nodetypes ersetzt werden.
Im Moment wird die Prozentzahl mit zwei Nachkommastellen angezeigt. Wer lieber auf volle Prozente runden will ersetzt die Zeile
<?php echo ($data->term_data_name.': '.number_format($nodecount_percent,2).' Prozent');?>
durch
<?php echo ($data->term_data_name.': '.round($nodecount_percent).' Prozent');?>
- Als "View Style"/"Darstellung" "Unformatiert" wählen.
- Bei den Darstellungsoptionen (das kleine Zahnrad) als Gruppierungsfeld "Taxonomie:Vokabularname" wählen.(siehe Schritt 6)
Bis hierhin ist der View noch komplett leer. Wir haben nur die benötigten Daten geladen, die im nächsten Schritt verwendet werden.
Die Prozentbalken haben eigene CSS Klassen bekommen, damit sie aus dem Theme heraus verändert werden können. Wenn diese zweifarbige Gestaltung ausreichend ist, können auch einfach "silver" und "orange" durch die gewünschten Farben ersetzt werden.(Hexadezimalcodes #00ff00)
Wahrscheinlich ist diese Abfrage nicht sehr Datenbankfreundlich und sollte für große Seiten vielleicht lieber mit dem http://drupal.org/project/term_node_count realisiert werden.
Der Vorteil ist, dass kein Extra Modul benötigt wird.
Ich hoffe, diese Anleitung ist hilfreich und wünsche viel Erfolg.
Verbesserungsvorschläge von "echten" Programmierern immer gerne.
Anhang | Größe |
---|---|
Beispiel | 120.37 KB |
Neue Kommentare
vor 4 Stunden 14 Minuten
vor 5 Stunden 42 Minuten
vor 9 Stunden 53 Minuten
vor 21 Stunden 15 Minuten
vor 23 Stunden 55 Minuten
vor 2 Tagen 4 Stunden
vor 2 Tagen 18 Stunden
vor 2 Tagen 19 Stunden
vor 2 Tagen 19 Stunden
vor 3 Tagen 4 Stunden