Vorgehensweise bei Kategorisierung/Klassifizierung von Inhalten zur Darstellung?
am 08.06.2008 - 09:46 Uhr in
Ich habe folgendes vor und würde gerne wissen, wie man am besten dabei vorgeht, bevor ich viel Zeit in eine falsche Richtung der Entwicklung investiere:
Meine User sollen einzelne kleine Beiträge (nodes von bestimmten eigenen Inhaltstypen) verfassen dürfen und diese nodes sollen irgendwie kategorisiert oder klassifiziert werden, um mit dieser Klassifizierung dafür zu sorgen, dass diese Beiträge auf bestimmten Themen zugeordenten Seiten in einem entsprechenden view oder einer nodequeue (siehe den Modul node queue) erscheinen. (Also von der Anforderung her in etwa so ähnlich wie ein blog.)
Konkret: Es geht um die Seite einer Schule. Berechtigte Lehrer sollen gewisse Inhalte für bestimmte Schulfächer (wie Wettbewerbsergebnisse, Arbeitsgemeinschaften, Aktuelle Infos etc.) erstellen können und diese Beiträge sollen automatisch auf der jeweiligen Fachseite in einem bestimmten Abschnitt (Wettberwerbe etc.) erscheinen. (Das variable Erscheinen kann ich bereits im Prinzip mit views mit Filter-Argumenten lösen.)
Die Frage ist nun, wie klassifiziert man die Inhalte am besten, so dass man dann entsprechende node-templates zur jeweils unterschiedlichen Darstellung erstellen kann?
Nimmt man dazu am besten Taxonomie oder ist es besser, eine Klassifizierung als Feld im jeweiligen Inhaltstyp zu definieren? Was ist generell in einem solchen Szenario sinnvoll - Taxonomie oder eigenes Feld? Welche Variante lässt sich mit php in der entsprechenden node-inhaltstyp.tpl.php besser auslesen und verarbeiten?
Oder gibt es eine ganz andere Lösung, von deren Existenz ich leider noch nichts weiss?
Vielen Dank für Tipps! Gruß hermx
- Anmelden oder Registrieren um Kommentare zu schreiben

Ja, wenn Du die Taxonomy
am 08.06.2008 - 11:47 Uhr
Ja, wenn Du die Taxonomy nicht neu erfinden willst, würde ich sie benutzen, denn eigtl. ist sie dazu da, das zu tun, was Du da willst ...
Du definierst ein Vokabular, in das Du Deine Kategorien einträgst. Wenn Du das Vokabular bearbeitest, kannst Du es dem speziellen Inhaltstyp zuweisen, für den es gelten soll. Wenn das Vokabular als "erforderlich" konfiguriert wurde, muss beim Speichern von Beiträgen des speziellen Inhaltstyps eine Kategorie ausgewählt werden. Das ist alles Standard.
Habe ich vielleicht Dein Problem nicht ganz verstanden?
Danke für den Hinweis. Ich
am 08.06.2008 - 14:54 Uhr
Danke für den Hinweis. Ich denke, du wirst es schon verstanden haben. Mein Problem ist einfach, dass es in drupal meistens mehrere Lösungswege gibt und mir ist, wie vermutlich den meisten Anfängern, nicht immer klar, welches der eigentliche "Drupalweg" ist. Dazu wäre eigentlich so eine Art Anwendngsfall-Datenbank mit Infos zu "best practices" nicht schlecht. (Aber es gibt natürlich auch Bücher dazu ud in bestimmten Fällen geeignete Howto-Seiten...)
Mir ist bisher nur noch nicht klar, wie ich genau auf die Taxonomie innerhalb einer tpl zugreife.
Gruß hermx
Kategorien im Template
am 08.06.2008 - 16:27 Uhr
... wie ich genau auf die Taxonomie innerhalb einer tpl zugreife.
Das machst Du mit
<?php print $terms; ?>in der node.tpl.php bzw. node-CONTENTTYPE.tpl.php, wobei CONTENTTYPE jetzt durch z.B. "page", "story", "blog", "forum" etc., oder auch einen selbstdefinierten Inhaltstyp ersetzt werden kann. Dann gelten die Template-Änderungen jeweils nur für den angesprochenen Inhaltstypen, während das abstraktere node.tpl.php für alle diejenigen Inhaltstypen zuständig ist, die so eine speziellere Template-Datei nicht haben. (Das stimmt so allerdings nicht in jedem Fall, da sich Inhaltstypen natürlich auch noch mit anderen Mitteln im PHP-Code beeinflussen lassen.)Generell musst Du aber erst einmal gar nichts machen, da die Terms (Kategorien) standardmäßig ausgegeben werden und die Ausgabe
<?php print $terms; ?>üblicherweise in jeder Standard-node.tpl.php definiert ist.Danke soweit, tumblingmug,
am 08.06.2008 - 16:43 Uhr
Danke soweit, tumblingmug, das mit den node.tpl.php habe ich schon verstanden und auch schon angewendet.
Meine Frage ist genau folgende(und ich probiere schon eine weile rum, aber wohl ohne es zu kapieren...):
Ich habe eine hierarchische Taxonomie, sagen wir:
Vokabulare Vok1, Vok2,...
und darin jeweils Unterebenen E12, E12,...,E21,E22,... (E_ij ist Unterebene j in Vokabular i)
und darin Terme T111,T112,...T121,T122,... (T_ijk ist Term k der Unterebene j in Vokabular i)
Was ich nicht hinbekomme, ist eine einfache Abfrage auf einen bestimmten Term:
Wie frage ich in der node-contenttype.tpl.php ab, ob der node einen bestimmten Term enthält?
Also ich will sowas wie:
if (node hat Term Tijk)
schreiben. Was muss in das if rein? ($node->taxonomy...??? oder node_get_taxonomy....??? oder was genau?)
Gibts dazu irgendwo eine klare Erläuterung/Tutorial? (Habe ich bis jetzt leider noch nicht gefunden!)
Danke für Hinweise!
Gruß hermx
Kannst Du bitte die ganze
am 08.06.2008 - 19:01 Uhr
Kannst Du bitte die ganze Problemstellung aufzeigen? Ich meine: was hast Du denn dann vor, wenn Du weißt, ob ein bestimmter Term in den $terms drinnen steckt? Also einfach das Ganze bitte mal beschreiben, indem Du den Kopf aus Deinen Problemen so ungefähr einen halben Meter herausziehst :-) und dann versuchst, die ganze Anordnung zu sehen.
Natürlich könnte man versucht sein zu sagen: na dann mach mal ein
<?phpif(strpos($terms,'Suchbegriff') !== false) {
print "Treffer!";
}
?>
aber das ist irgendwie unsauber und gehört eigtl. nicht in ein Template.
Anwendungsbeschreibung zu meinem Vorhaben
am 08.06.2008 - 22:18 Uhr
Mach ich doch gerne :)
Ich habe eine Schulwebsite und möchte mit einem Inhaltstyp "Beitrag" erreichen, dass alle Fachlehrer kleine inhaltliche Beiträge auf der Website einstellen können. Das soll Fach- und Bereichsspezifisch sein. Ich stelle mir dazu eine Taxonomie der folgenden Art vor:
-Vokabular1: Fach
--Terme: Mathe, Sport, etc.
-Vokabular2: Bereich
--Terme: Fachinfo, Wettbewerbe, Arbeitsgemeinschaften, etc.
Jedes Fach soll dann eine eigene page erhalten mit derselben Abschnittsstruktur, wie sie dem Vokabular2 entspricht. Also Abschnitte mit Überschriften "Fachinfo" Wettbewerbe" etc.
Wenn nun z.B. ein Sportlehrer einen Ergebnisbericht zu einem Wettkampf ins Web setzen will, so soll er einen Inhalt "Beitrag" erstellen und dazu die Taxonomien "Sport" und "Wettbewerbe" auswählen. Der Beitrag sollte dann automatisch auf der Sportfachseite im Abschnitt "Wettbewerbe" als Teaser erscheinen. Letzteres kriege ich mit views und dem Modul insert view hin. Dazu kann man dann einen gefilterten view des Inhaltstyps Beitrag mit Tags in die Seite einbauen (Syntax [view:viewname==arg1,arg2,...]). Die Fachseite sieht dann etwa so aus:
Fachbereich Sport
Allgemeines blablabla
Fachinfo
[view:beiträge==Sport,Fachinfo]
Wettbewerbe
[view:beiträge==Sport,Wettbewerbe]
etc.
Idealerweise sollte die Beitragstemplate node-beitrag.tpl.php nun so sein, dass in den Teasern und der Vollansicht auf den Fachseiten keine Nodetitel und Verfasserinfo angezeigt werden, so dass die ganze Konstruktion optisch nicht anders aussieht (bis auf die links der Teaser zum "Weiterlesen"), als hätte ich die Beiträge direkt auf die Fachseite geschrieben. Ruft man die Beiträge einzeln auf, so soll die ganze Info sichtbar sein. Dieses letzte (unwichtigere) Teilproblem habe ich schon einigermassen im Griff, aber eben bisher ohne die Verwendung von Taxonomie. Dazu möchte ich also in den templates so etwas wie if($term1=='Sport' && $term2=='Wettbewerbe') abfragen können, um eventuell auch Fach- bzw. Bereichsspezifisch Einfluss auf die Darstellung nehmen zu können. (z.B. mit dem Zweck, dass bei bestimmten speziellen Bereichen [z.B. Arbeitsgemeinschaften] die Verfasserinfo doch angezeigt wird, bei Bereichen allgemeiner Natur [z.B. Fachinfo] eher nicht.)
Ich hoffe das erläutert mein Vorhaben einigermassen verständlich. Wäre das ein geeigneter Lösungsansatz oder sollte man sowas eher ganz anders machen?
Nachtrag: Habe gerade im Handbuch den Hinweis auf embeded views gefunden: http://www.drupalcenter.de/handbuch/6804
das könnte auch hilfreich sein.
Nachtrag2: Habe gerade eine ähnliche Diskussion gefunden: http://www.drupalcenter.de/node/6085
D.h. mit so etwas wie if(node->taxonomy[1]->name=='Wettbewerbe') sollte es funktionieren. Ich weiss nur nicht, woher ich den richtigen array index (die [1] hier im Bsp.) meines Vokabulars automatisch herhole?
Nachtrag3:
Konkret aus meinem print_r($node):
[taxonomy] => Array
(
[199] => stdClass Object
(
[tid] => 199
[vid] => 17
[name] => Wettbewerbe
[description] =>
[weight] => 0
)
Hier ist also mein Term "Wettbewerbe" und ich müsste fragen
if(node->taxonomy[199]->name=='Wettbewerbe')
Wie kann ich die Termid (tid, hier 199), bzw. die Vokabularid (vid, hier 17) automatisch erfahren? Oder brauche ich das gar nicht? Kann ich irgendwie mit dem "Klartext" des Terms "Wettbewerbe" arbeiten? (Gibt es sowas wie taxonomy[get_tid("Wettbewerbe")] ?? - vielleicht auch gar nicht sinnvoll, wenn ich den Titel mal ändern wollte...Fragen über Fragen...)
Danke für Hinweise!
Gruß hermx
Aha
am 09.06.2008 - 11:49 Uhr
Das hast Du also vor :)
Ich denke, der richtige Hebel für Deine Zwecke (allerdings auch schon nicht mehr in Drupal-6) ist die Funktion _phptemplate_variables(), in welcher zusätzliche Variablen für die Themeausgabe erzeugt bzw. bestehende angepasst werden können und die in die template.php Deines Themes gehört (falls die Funktion dort schon existiert, muss sie eben erweitert werden).
<?php if ($submitted) print $submitted ?>und das reicht dort auch aus. Aber in der _phptemplate_variables() wird nun anhand Deiner Konditionen entschieden, ob $submitted gerenderten Text enhält und ausgegeben wird oder eben nicht.Grobes Gerüst für Integration in die template.php:
<?phpfunction _phptemplate_variables($hook, $vars = array()) {
switch ($hook) {
// Leeren der Variable $submitted, falls Ausgabe unerwünscht
case 'node':
if ($vars['type'] == 'beitrag') { // bezogen auf spez. Inhaltstyp
$wett = taxonomy_get_term_by_name('Wettbewerbe');
$spor = taxonomy_get_term_by_name('Sport');
if ($vars['node']->taxonomy[$wett[0]->tid] &&
$vars['node']->taxonomy[$spor[0]->tid]) {
// $submitted leeren, keine Ausgabe von Autor + Datum:
$vars['submitted'] = '';
// "if ($submitted)" in node.tpl.php ergibt nun FALSE
// und wird nicht ausgegeben
}
}
break;
}
return $vars;
}
?>
Dieses Beispiel geht davon aus, dass Deine Suchbegriffe nur einmal in Vokabularen vorkommen! Denn $wett[0] ist das erste Element der zurückgegeben Terms (die also durchaus auch mehrere sein können). So würde eine Suche nach "Sport" zwei Elemente zurückgeben, wenn die Terme "Sportereignisse" und "Sport" existierten! Passe den Code an, falls dies absehbar zu Problemen in Deiner Konstellation führen kann.
Also: so ungefähr (alles aus dem Hut, sorry), das Konzept sollte aber klar werden, debugged ist der Code nicht - Du kannst ja vielleicht die Lösung für Dich hierher posten.
Kategorien eines Beitrags in PHP abfragen
am 09.06.2008 - 11:56 Uhr
Also ich will sowas wie: if (node hat Term Tijk) schreiben. Was muss in das if rein? ($node->taxonomy...??? oder node_get_taxonomy....??? oder was genau?)
Gibts dazu irgendwo eine klare Erläuterung/Tutorial? (Habe ich bis jetzt leider noch nicht gefunden!)
Als Nachtrag: taxonomy_node_get_terms($nid, $key) ist da vielleicht auch hilfreich. Du kannst nämlich dann fragen:
<?php$nodeterms = taxonomy_node_get_terms($nid, 'name');
if ($nodeterms['Sport'] && $nodeterms['Wettbewerbe']) {
print "Mit 'Sport' und 'Wettbewerbe' getaggt!";
}
?>
'name' ist dabei der Trick: die Kategorienamen werden so als Array-Keys verwendet und lassen sich dann natürlich ganz gemütlich abfragen.
Danke, tumblingmug!
am 10.06.2008 - 19:47 Uhr
Beide Antworten von dir sind mir sehr hilfeich. Mit phptemplate_variables muss ich mich jetzt erst mal beschäftigen. Ich bin grade so am Anfang mit der Beschäftigung mit dem template-Konzept, aber so weit ich sehe, liefert dein schon sehr konkreter (danke!) Outline eine Lösung für mich. Eventuell genügt sogar dein zweiter Vorschlag.
Danke für die Tipps, ich werde jetzt erst ne Weile dafür brauchen, da ich diese Woch nicht mehr soviel Zeit dafür habe...ich werde dann meine Lösung für die Nachwelt hier posten.
Gruß hermx