Terms durch Komma separiert ausgeben
am 16.11.2007 - 08:41 Uhr in
Ich verwende das Garland/Minelli-Theme und bin gerade dabei einige Anpassungen vorzunehmen. Leider reichen meine PHP-Kenntnisse nicht aus um folgendes Problem in den Griff zu kriegen.
Standardmässig werden die Terms ja als Liste ausgegeben. Ich möchte nun das die einzelnen Terms mit Komma separiert werden, wie folgt:
Term 1, Term 2, Term 3, etc.
Natürlich habe ich mich auch auf Drupal.org umgesehen, leider aber nur Ansatzweise Hilfe gefunden. Folgenden Code habe ich in die Datei node.tpl.php kopiert.
if ($terms):
$vocabularies = taxonomy_get_vocabularies();
foreach($vocabularies as $vocabulary) {
if ($vocabularies) {
$terms = taxonomy_node_get_terms_by_vocabulary($node->nid, $vocabulary->vid);
if ($terms) {
foreach ($terms as $term) {
print l($term->name, 'taxonomy/term/'.$term->tid) . ', ';
}
}
}
}
endif; Das funktioniert gut, jedoch wird das Komma auch nach dem letzten Term angezeigt, was natürlich nicht sein soll. Ich habe gelesen das man sowas mit der Implode-Funktion hinbekommen kann. Nach stundenlangem herum experimentieren hab ich es nun aber aufgegeben. Es wäre super wenn mir jemand auf die Sprünge helfen könnte.
- Anmelden oder Registrieren um Kommentare zu schreiben

Da laeuft eine Schleife.
am 16.11.2007 - 09:06 Uhr
Da laeuft eine Schleife. Einen Counter mit 0 starten. Wenn 0 kein Komma. Komma links printen.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Nunja, da hätte ich auch
am 16.11.2007 - 09:21 Uhr
Nunja, da hätte ich auch selbst drauf kommen und mir damit dieses Topic sparen können. ;) In der Theorie hört sich das einfach an, aber ehrlich gesagt weiß ich einfach nicht wo und wie ich ansetzen soll.
Sollte so funktionieren
am 16.11.2007 - 09:42 Uhr
<?phpif ($terms):
$vocabularies = taxonomy_get_vocabularies();
foreach($vocabularies as $vocabulary) {
if ($vocabularies) {
$terms = taxonomy_node_get_terms_by_vocabulary($node->nid, $vocabulary->vid);
if ( $terms ) {
$i = 0;
foreach ($terms as $term ) {
if ($i > 0) {
print ' ,' . l($term->name, 'taxonomy/term/'.$term->tid);
} else {
print l($term->name, 'taxonomy/term/'.$term->tid);
}
$i++;
}
}
}
}
endif;
?>
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Leider nicht ganz
am 16.11.2007 - 09:57 Uhr
Solange ich mit nur einem Vokabular arbeite funktioniert es gut. Jedoch verwende ich z.B. für die News 2 Vokabulare. Eines um feste Kategorien vorzugeben und ein weiteres für FreeTagging. Also es sieht folgendermaßen aus:
Vok1Term1, Vok1Term2Vok2Term1, Vok2Term2, VokTerm3
Es wird also nach der Auflistung aus Vokabular 1 kein Komma gesetzt. Ansonsten bringt mich das natürlich schon ein ganzes Stück weiter. Vielen Dank für die Hilfbereitschaft.
Dann setze den Counter mit
am 16.11.2007 - 10:07 Uhr
Dann setze den Counter mit der 1. Schleife ein.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Dann wird aber schon vor dem
am 16.11.2007 - 10:12 Uhr
Dann wird aber schon vor dem ersten Term ein Komma gesetzt.
Naja, eigentlich ist die
am 16.11.2007 - 10:22 Uhr
Naja, eigentlich ist die Vorgehensweise, die Links der Terms in der "node.tpl.php" zu aendern, nicht unbedingt der goldene Drupalweg. Besser ist, dies in der "template.php" zu tun.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Ich nehme alles zurück und behaupte das Gegenteil
am 16.11.2007 - 10:25 Uhr
Den Counter mit der ersten Schleife einzusetzen funktioniert tadelos. Danke dafür. Du hast natürlich recht und ich werde jetzt mal sehen wie ich das ganze in der template.php unterbringen kann.
$hook == 'node'
am 16.11.2007 - 10:54 Uhr
In der "node.tpl.php" wird die Variable $links verwendet. In der "template.php" wird sie veraendert. Nun kommt es auf Dein Theme an. Eventuell gibt es da bereits einen Einstiegspunkt fuer
if ($hook == 'node').Als Hilfe hier ein Ansatzpunkt: http://drupal.org/node/104200#comment-182143
<?php
function _phptemplate_variables($hook, $variables)
{
$ours = array();
if ($hook == 'node') { // engine is outputing a node
$node = $variables['node'];
// override the $links variable (which is used in node.tpl.php)
$ours['links'] = $node->links ? theme('links', $node->links, ..., '*') : '',
}
return $ours;
}
?>
Den Code kannst Du so nicht direkt uebernehmen. Er diehnt nur der Erlaeuterung des Prinzips. Es kommt darauf an wie die "template.php" Deines Themes aussieht.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
hook_link_alter
am 16.11.2007 - 12:02 Uhr
Hier noch ein anderer Loesungsansatz. http://blamcast.net/articles/remove-taxonomy-custom-nodes
Der Vollstaendigkeit halber:
http://api.drupal.org/?q=api/function/hook_link_alter/5
Ich hoffe das ueberfordert Dich Jetzt nicht.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Danke für deine Hilfe.
am 16.11.2007 - 13:46 Uhr
Danke für deine Hilfe. Leider muß ich eingestehen das mein Verständnis für die PHPTemplate-Engine hier auf seine Grenzen stößt und ich wohl viel nachzuholen habe. Ich habe mir die Artikel unter deinen Links genauestens durchgelesen, jedoch sind das für mich größtenteils böhmische Döfer. ;)
Wenn Du moechtest konnen wir
am 16.11.2007 - 14:15 Uhr
Wenn Du moechtest konnen wir Deine Grenzen ein wenig erweitern.
Welches Theme verwendest Du?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Na klar möchte ich. Ich
am 16.11.2007 - 14:28 Uhr
Na klar möchte ich. Ich verwende derzeit das Garland-Theme. Ursprünglich wollte ich ein neues Theme erstellen, aber da die Seite recht schnell online gehen soll habe ich mich entschieden mit den Inhalten anzufangen und später ein Theme basteln.
Garland: $hook == 'node' - Teil 1
am 16.11.2007 - 15:19 Uhr
Ich nehme an Du moechtest die Ausgabe der Terms generell aendern, nicht nur bei einem bestimmten Modul oder Inhaltstyp. Deswegen nehmen wir mal diese Variante: http://drupal.org/node/104200#comment-182143
Bei Garland sieht der fuer die Aenderung in Frage kommende Codebereich der "template.php" so aus:
<?php
/**
* Override or insert PHPTemplate variables into the templates.
*/
function _phptemplate_variables($hook, $vars) {
if ($hook == 'page') {
if ($secondary = menu_secondary_local_tasks()) {
$output = '<span class="clear"></span>';
$output .= "<ul class=\"tabs secondary\">\n". $secondary ."</ul>\n";
$vars['tabs2'] = $output;
}
// Hook into color.module
if (module_exists('color')) {
_color_page_alter($vars);
}
return $vars;
}
/* Hier werden wir versuchen zu aendern */
return array();
}
?>
Hier ist von einer Variable $links, die in der "node.tpl.php" verwendet wird, noch nichts zu sehen. Bis Jetzt. Das werden wir versuchen zu aendern.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Ok, das hört sich gut an.
am 16.11.2007 - 19:53 Uhr
Ok, das hört sich gut an. :)
Allerdings muss ich dazu sagen, dass ich in diesem Bereich schon eine Änderung vorgenommen habe. Ich habe das Taxonomy Image-Modul installiert und entsprechend den benötigten Code an diese Stelle kopiert.
Es sieht also bei mir folgendermaßen aus:
<?php
function _phptemplate_variables($hook, $vars) {
if ($hook == 'page') {
if ($secondary = menu_secondary_local_tasks()) {
$output = '<span class="clear"></span>';
$output .= "<ul class=\"tabs secondary\">\n". $secondary ."</ul>\n";
$vars['tabs2'] = $output;
}
// Hook into color.module
if (module_exists('color')) {
_color_page_alter($vars);
}
return $vars;
}
if ($hook == 'node') {
if (module_exists("taxonomy_image")) {
foreach (taxonomy_node_get_terms($vars['node']->nid) as $term) {
$vars['taxonomy_images'][] = taxonomy_image_display($term->tid, "alt='$term->name'");
}
}
}
return $vars;
return array();
}
?>
Ja die Darstellung der Terms würde ich gerne generell ändern, auch wenn eine großartige Kategorisierung vorerst nur bei den News statt finden wird. Für die Zukunft plane ich evtl. so etwas wie Userblogs und spätestens dann wird es von Vorteil sein.
Vielleicht interessiert dich auch, worum es eigentlich geht. www.superman-returns.info will ich nun endlich mit Drupal umsetzen und damit Web2.0 tauglich machen. Geplant ist das schon seit über einem Jahr, aber erst jetzt finde ich die Zeit und nötige Motivation dazu.
beliebiger Separator zwischen die Terms
am 17.11.2007 - 01:08 Uhr
Vergiss die oben von mir gepostete Einleitung zur Erklaerung, ein Komma zwischen die Terms zu setzen.
Der einfachste Weg ist dieser:
.taxonomy ul.links li:after {content: ",";
}
.taxonomy ul.links li.last:after {
content: "";
}
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Oha
am 17.11.2007 - 01:46 Uhr
Ich beschäftige mich ja schon eine Weile mit HTML und CSS aber das ist mir absolut neu, wenn es auch sofort einleuchtet. Ich habe noch nie darüber nachgedacht x-beliebige Zeichen per CSS einzufügen und danke Dir für diese, für mich, ganz neue Erkenntnis.
Zeichen per CSS einfügen
am 17.11.2007 - 13:11 Uhr
Das funktioniert leider nicht im IE 6.
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
Korrekt. http://www.css4you.d
am 17.11.2007 - 13:38 Uhr
Korrekt.
http://www.css4you.de/beforeafter.html
Der IE(6) ist ja auch kein Browser.
Bleibt eben nur, einen Komma-Separator per HTML einzufuegen. Gerade bei den Terms ist es aber arg verbaut um effektiv/einfach an die Terms ranzukommen. Die gegenwaertige Situation trotz hook und Co finde ich als nicht designerfreundlich.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Den IE6 werde ich nur
am 18.11.2007 - 04:56 Uhr
Den IE6 werde ich nur bedingt berücksichtigen (Layout) und wenn da nun die Seperatoren bei den Terms fehlen ist das kein Beinbruch. Die Lösung per CSS ist damit mein absoluter Favorit.
Nachtrag: Ich habe das jetzt ausprobiert und wie es aussieht kann auch der IE7 mit den Anweisungen nichts anfangen. :(
Ist ja interessant. Ich
am 18.11.2007 - 04:59 Uhr
Ist ja interessant. Ich hatte zu dem Thema gestern gegoogelt und da war ueberall zu lesen das der IE7 before/after kann.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
before/after & IE7
am 18.11.2007 - 08:54 Uhr
bei selhtml steht explizit, dass auch der IE7 before/after nicht unterstützt:
http://de.selfhtml.org/css/eigenschaften/pseudoformate.htm#before_after
selfhtml scheint verlässlicher zu sein als google ;-)
danke, ein sehr hilfreicher
am 20.11.2007 - 17:11 Uhr
danke, ein sehr hilfreicher thread!
Wie nur ein Vocabulary auslesen
am 03.03.2009 - 20:42 Uhr
Das ist wirklich ein guter Thread. Ich schieße den mal wieder nach oben mit einer Zusatzfrage.
Wie kann man den ganz oben stehende php-Code zur Ausgabe der Terms so verändern, dass nur eins der genutzten Vokabularien ausgespuckt wird?
Implode
am 07.02.2010 - 08:23 Uhr
Im Ausgangsbeitrag wurde die Implode-Funktion angesprochen. Dazu habe ich folgenden Code-Schnipsel gefunden:
http://19thstreetdesign.com/blog/2009.01.07/adding-separator-drupal-taxo...