Terms als Block? Das muss doch gehen!
![](https://www.drupalcenter.de/files/imagecache/upic_mini/pictures/picture-660.jpg)
am 27.08.2007 - 17:01 Uhr in
Eigendlich ist es mir echt schon peinlich das zu fragen, weil das was ich will eigendlich recht simpel sein müsste.
Allerdings bin ich da jetzt schon einige Tage drann, und echt am verzweifeln!!!!
Wie kann ich die Taxonomie Terms, die zu einem Artikel gehören, in einem extra Block anstatt am ende eines Artikels anzeigen lassen?
Ich bekomme echt die Kriese! Ich hab schon versucht das mit views zu machen, hab nach Modulen gesucht die sowas machen.... NIX!!!! Das kann doch einfach nicht sein. Ich bin doch nicht der erste Mensch der sowas machen will, oder?
Bitte helft mir! :-)
- Anmelden oder Registrieren um Kommentare zu schreiben
PHP
am 27.08.2007 - 21:30 Uhr
Hallo,
ich kann es auf die Schnelle nicht programmieren, aber im Prinzip musst du folgendes machen:
Erstelle einen Block mit PHP-Code. Darin musst Du prüfen, ob gerade ein Node angezeigt wird (über die URL, also arg() Funktion), dann über dessen Node ID (ebenfalls aus der URL) diesen Node holen und das dazugehörende Taxonomy Objekt auswerten bzw. ausgeben.
In etwa so (zusammenkopiert und ungeprüft):
<?php
if ((arg() == 'node') && is_numeric(arg(1))) {
$artikel = node_load(arg(1));
print $artikel->taxonomy[0]->name . '<br />';
print $artikel->taxonomy[1]->name . '<br />';
...
}
?>
Keine Gewähr für die Print-Anweisungen, bin kein PHP-Experte. Macht man auch eleganter in einer Schleife.
Gruß,
Boris
Oder ...
am 27.08.2007 - 22:22 Uhr
Oder versuch mal folgendes Snippet:
<?php
if (arg(0) == 'node' && is_numeric($nid = arg(1))) {
$terms = taxonomy_node_get_terms($nid);
$items = array();
foreach ($terms as $term) {
$items[] = l($term->name, 'taxonomy/term/'. $term->tid);
}
print theme('item_list', $items);
}
?>
Oder als View
am 27.08.2007 - 23:55 Uhr
Wie in diesem Thread http://www.drupalcenter.de/node/4710#comment-16054 schon erklärt.
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
Juhu! :-)
am 28.08.2007 - 09:27 Uhr
Also mit dem Code von "profix898" komme ich super klar. Das ist genau was ich wollte. Viele Dank
Weiss vielleicht auch jemand
am 29.11.2008 - 03:29 Uhr
Weiss vielleicht auch jemand wie das in drupal 6 funktioniert?
der Code tuts bei mir jedenfalls nicht.
Danke.
Tagadelic?
am 29.11.2008 - 08:43 Uhr
Das Modul tagadelic stellt einen Block "Tags for the current post" zur Verfügung.
---
@ http://drupalcamp.de/
Vielen Dank Irgendwie hatte
am 29.11.2008 - 13:29 Uhr
Vielen Dank
Irgendwie hatte ich in Erinnerung, dass es dieses Modul nur für D5 gibt. Mal ausprobieren.
Ich habe dieses Snippet
am 29.11.2008 - 13:32 Uhr
Ich habe dieses Snippet gefunden was es tut:
<?php
if (module_exists('taxonomy')) {
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
if ($node = node_load(array('nid' => arg(1)))) {
$terms = taxonomy_link('taxonomy terms', $node);
return theme('links', $terms);
}
}
}
return '';
?>
Wenn ich jetzt die ausgegebenen terms noch nach vocabulary sortieren könnte wäre ich da.
Was macht dieser Code?
am 29.11.2008 - 13:57 Uhr
Bei mir wuerde der Code so aussehen:
<?php
if (module_exists('taxonomy')) {
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
if ($node = node_load(arg(1))) {
return theme('links', taxonomy_link('taxonomy terms', $node));
}
}
}
else {
return '';
}
?>
Der Code wird ausgefuehrt wenn die URL /node/x ist (und nicht das Bearbeiten der Node ausgefuehrt wird). Ist das Modul Taxonomy aktiviert dann wird das Nodeobject geladen.
Kann das Nodeobject geladen werden dann werden die Terms der Node als Link zurueckgegeben.
Deinem Codesnipped fehlt aber etwas:
Das "return" ist das Indiz das dieser Code eigentlich in einer Funktion ausgefuehrt wird. Um diesen Code ohne eine Funktion einzusetzen muss dies passieren:
<?php
if (module_exists('taxonomy')) {
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
if ($node = node_load(arg(1))) {
$output = theme('links', taxonomy_link('taxonomy terms', $node));
}
}
}
else {
$output = '';
}
print $output;
?>
Will man aber den Code mit einer Funktion verwenden, beispielsweise um ihn nur EINMAL zu schreiben UND ihn dann von verschiedenen Stellen aus aufzurufen muss dies passieren:
<?php
function node_get_term_links() {
$output = '';
if (module_exists('taxonomy')) {
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
if ($node = node_load(arg(1))) {
$output = theme('links', taxonomy_link('taxonomy terms', $node));
}
}
}
return $output;
}
?>
Diesen Code koennte man beispielsweise in der Datei "template.php" speichern.
Und dann irgendwo, in einem Block oder in verschiedenen Nodetype Templates, die Funktion ansprechen mit:
<?php
print node_get_term_links();
?>
@clown10,
um die Terms nach Vocabularys zu sortieren muss man sich den Inhalt der Variable $terms ansehen. Fuer diesen Fall muss dies Variable doch bereitgestellt werden:
<?php
if ($node = node_load(arg(1))) {
$output = theme('links', taxonomy_link('taxonomy terms', $node));
}
?>
aendern in:
<?php
if ($node = node_load(arg(1))) {
$terms = taxonomy_link('taxonomy terms', $node);
$output = theme('links', $terms);
}
?>
Je nach dem was $term als Inhalt anbietet koennte man mit Array-Funktionen von PHP sortieren. $term ansehen:
<?php
if ($node = node_load(arg(1))) {
$terms = taxonomy_link('taxonomy terms', $node);
print '<pre>';
print_r($terms);
print '</pre>';
$output = theme('links', $terms);
}
?>
Das Ganze wird so aber nix bringen weil im Array $terms keine Infos ueber die Vocabularies enthalten sind. Um also die Terms nach ihren Vocabularies sortieren zu koennen muss diese Information zusaetzlich eingeholt werden.
Unter diesem Aspekt aber sollte man gleich anders vorgehen und die Funktion taxonomy_node_get_terms() verwenden. Damit ist man gleich Sortier-Ziel angelangt, den taxonomy_node_get_terms() gibt die Terms sortiert nach Vocabularies zurueck.
Find all terms associated with the given node, ordered by vocabulary and term weight.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Hallo Quiptime,
am 29.11.2008 - 14:20 Uhr
Hallo Quiptime, super!
Könnte man so auch irgendwie die terms ( sind bei mir immer 3 ) in explizite variablen schieben (variable 1, variable 2, variable 3) und daraus einen link bauen wie z.B. planzen?tid=blume&tid_1=wohnung&tid_2=rot wobei blume, wohnung und rot die terms sind?
Ich möchte hiermit einen view aufrufen (in abhängigkeit von dem grade besuchten Node).
@clown10, Ja kann man.
am 29.11.2008 - 14:34 Uhr
und daraus einen link bauen
Ja kann man.
Aber die Links wie Du sie bauen willst sind fuer die Verwendung mit einem View der auf Argumente reagiert eigentlich anders aufzubauen.
Was macht ein View der Argumente in seiner URL verarbeitet. Er erwartet/verwendet eine URL nach dem Schema: /irgendeinview/x
Im View selbst wird die URL so definiert.
Drupal 5: irgendeinview/$arg
Drupal 6: irgendeinview/%
@clown10, ist Dir klar geworden das Deine Ueberlegung
einen link bauen wie z.B. planzen?tid=blume&tid_1=wohnung&tid_2=rot
nicht funktionieren wird weil Du keinen View fuer derartige Link's/URL's erstellen kannst.
mehrere Argumente fuer einen View
Ergaenzend ist noch zu bemerken das mit Views 2 (D6) ein View derart konfiguriert werden kann das er mehrere Argumente entgegen nehmen kann.
Nach dem URL-Schema: /irgendeinview/x/x/x
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Bei mir sieht der link aber
am 29.11.2008 - 14:59 Uhr
Bei mir sieht der link aber genau so aus und funktioniert. Was Du vorschlägst ( /irgendeinview/x/x/x ) fänd ich auch schöner ( hier ist ja letzlich nur das ?tid= durch das / ersetzt). Aber wie kann ich das in views so einstellen oder aber den link mit den vorhandenen terms bauen?