Begriffe eines Vokabulars auflisten.
am 16.09.2009 - 10:56 Uhr in
Hallo zusammen,
bei mir hakt es gerade an zwei Baustellen.
1. Ich habe einen Produkt-node (z.B. Apfelsorten), dem die Benutzer beim Vokabular "Apfelgeschmack" verschiedene Begriffe (z.B. süß, lecker, saftig) zuordnen können (free-tagging). Nun sitze ich an der node-apfel.tpl.php und möchte eine Ausgabe erreichen, bei der der Vokabularname ("Apfelgeschmack:") und dahinter die eingegebenen Begriffe DURCH KOMMATA GETRENNT widergegeben werden.
Ich habe schon eine ganze Weile gesucht und bin auch fündig geworden, die Sache ich jedoch noch nicht ganz rund. Ich benutze folgenden Code:
<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) ) {
$node = node_load(arg(1));
$vid = 9;
$terms = taxonomy_node_get_terms_by_vocabulary($node, $vid);
if ($terms) {
foreach ($terms as $term) {
print l($term->name, 'taxonomy/term/'.$term->tid);
print t(', ');
}
}
}
?>
Das mit dem Komma habe ich mir selber ausgedacht und ich weiß, das ist Mist, aber da ich keine Ahnung von php habe, ist es mir nicht gelungen, die begriffe mit implode durch Kommata zu trennen. Könnte mir da jemand helfen?
2. Mein zweites Problem ist, dass wenn ich auf einen ausgegebenen Begriff klicke (z.B. "süß") und mir dann z.B. alle Apfelsorten aufgelistet werden, die mit "süß" getagged wurden, die den unterschiedlichen Apfelsorten zugeordneten Begriffe nicht mehr angezeigt werden (wahrscheinlich weil ja jetzt nicht mehr der spezielle Node, sondern die Taxonomieliste ausgegeben wird?)
Vielen Dank für die Hilfe.
- Anmelden oder Registrieren um Kommentare zu schreiben
Hallo witzel, ich kenne dein
am 16.09.2009 - 11:43 Uhr
Hallo witzel,
ich kenne dein Problem, mit php hab ich's selber auch nicht so. Ich hätte schwören können, dass ich so einen Fall mal hatte, finde jetzt aber die richtige Stelle nicht.
Ich hab ein bisschen gegoogelt, vielleicht hilft dir dieser Beitrag weiter:
http://www.kobashicomputing.com/creating-a-comma-delimited-taxonomy-list...
Probier's mal aus.
http://www.twitter.com/aschiwi
Hey aschiwi, danke für die
am 16.09.2009 - 11:50 Uhr
Hey aschiwi,
danke für die Hilfe.
Dieser Code hier scheint alle meine Probleme zu lösen:
<?php
// Statt der hier eingetragenen 5 bei t.vid IN () die Zahl(en) des gewünschten Vokabulars eintragen
$result = db_query("SELECT t.tid, t.name FROM {term_data} t, {term_node} r WHERE r.tid = t.tid AND r.nid = %d AND t.vid IN (5) ORDER BY weight, name", $node->nid);
while ($term = db_fetch_object($result)) {
$ntags[] = l($term->name, 'taxonomy/term/' . $term->tid);
}
if ($ntags) {
print t("Apfelfarbe: ") . implode(', ', $ntags);
unset($ntags);
}
?>
Zu 1: <?php $apfelgeschmack
am 16.09.2009 - 12:50 Uhr
Zu 1:
<?php
$apfelgeschmack = array();
foreach ($terms as $term) {
$apfelgeschmack[$term->name] = l($term->name, 'taxonomy/term/'.$term->tid);
}
print join(', ', $apfelgeschmack);
?>
Zu 2:
Wo soll das denn angezeigt werden? Über der Seite wäre das soetwas wie eine Tag Cloud, die alle vergebenen Begriffe des Vokabulars sammelt. Oder soll das bei jedem Node stehen?
Dieser Code hier scheint alle meine Probleme zu lösen:
<?php
// Statt der hier eingetragenen 5 bei t.vid IN () die Zahl(en) des gewünschten Vokabulars eintragen
$result = db_query("SELECT t.tid, t.name FROM {term_data} t, {term_node} r WHERE r.tid = t.tid AND r.nid = %d AND t.vid IN (5) ORDER BY weight, name", $node->nid);
// ...
?>
"Scheint" ist hier das Stichwort. Sobald du unterschiedliche Revisionen des selben Nodes hast bekommst du teilweise veraltete und teilweise doppelte Einträge.
Außerdem sollten JOINs (mehrere Tabellen in einer Abfrage) ausgeschrieben werden.
<?php
$result = db_query("
SELECT t.tid, t.name
FROM {term_data} t
INNER JOIN {term_node} r ON r.tid = t.tid
WHERE r.vid = %d AND t.vid IN (5)
ORDER BY weight, name",
$node->vid
);
?>
Semantisch ist es egal ob du
FROM {term_data} t INNER JOIN {term_node} r
oder
FROM {term_data} t, {term_node} r
r.tid = t.tid
) direkt bei der zu verknüpfenden Tabelle stehen, was insbesondere bei Verknüpfungen von mehr als zwei Tabellen einfacher zu lesen ist.--
Ohne jetzt die vorherigen
am 16.09.2009 - 14:32 Uhr
Ohne jetzt die vorherigen Antworten in irgendeiner Form schlecht machen zu wollen, wäre das ganze nicht mit Hilfe von Views einfachen gewesen? Dann hätte man sich das ganze gecode sparen können. Kann natürlich auch sein, dass ich den Sinn bzw das Problem nicht ganz erfasst habe.
stebeg schrieb ... wäre
am 16.09.2009 - 14:51 Uhr
... wäre das ganze nicht mit Hilfe von Views einfachen gewesen?
Könnte sein:
<?php
print ('Apfelgeschmack: ', views_embed_view('apfelgeschmack_taxonomy', 'default', $node->nid);
?>
Es stellen sich die Fragen
--
Vielen Dank für die guten
am 27.09.2009 - 11:51 Uhr
Vielen Dank für die guten Tips, ich habe mich jetzt für die Views-Variante entschieden, weil ich - was Datenbankanfragen außerhalb von Views angeht - zwei linke Hände habe. Ihr habt mir sehr geholfen!