"Diesen Block nur anzeigen, wenn der folgende PHP-Code TRUE zurückgibt" für Nodes einer bestimmten Kategorie
Eingetragen von hoshi79 (53)
am 06.03.2008 - 18:08 Uhr in
am 06.03.2008 - 18:08 Uhr in
sehr geehrte drupaler,
wie bekomme ich mittels php raus, zu welcher taxonomy-kategorie ein node gehört und welche variabel ist dafür verantwortlich, dass das taxonomy-menü sich nicht schließt, obwohl ich eine node ausgewählt habe?
mit den informationen möchte ich mir für "Diesen Block nur anzeigen, wenn der folgende PHP-Code TRUE zurückgibt" eine abfrage basteln, die einen block nur erscheinen lässt, wenn die node zur richtigen kategorie gehört.
zb:
<?php
//Dann ist der Block nur für nodes sichtbar, die in der Kategorie mit tid=3 sind.
if (arg(0) == 'node' && is_numeric($nid = arg(1))) {
$node = node_load($nid);
return isset($node->taxonomy['3']);
}
return FALSE;
?>
das habe ich im forum schon gefunden, funktioniert bei mir aber nicht!!! außerdem bräuchte ich es für mehrere kategorien... zb 12-18
vielen dank schon einmal
gruß, hoshi
- Anmelden oder Registrieren um Kommentare zu schreiben
Code ist gut
am 06.03.2008 - 23:55 Uhr
Der Code sollte sicher funktionieren. Hast Du die öffnenden und schließenden PHP-Tags mit eingefügt? Hast Du "Block nur anzeigen, wenn Code TRUE zurückgibt" aktiviert? Sagst Du "geht nicht" tatsächlich angesichts aufgerufener URL (page!) 'node/27' (gesetzt den Fall, diese ist mit tid 3 getaggt?)
Bei Term-Listings muss der Code des obigen Zitats geringfügig angepasst werden, z.B. für Taxonomy-ID 3:
<?php
if (arg(0) == 'taxonomy' && arg(2)=='3') {
return TRUE;
}
return FALSE;
?>
Wenn das für mehrere Terms gelten soll (z.B. 'taxonomy/term/2+3') dann ginge dies hier:
<?php
if (arg(0) == 'taxonomy' && arg(2)=='2 3') {
return TRUE;
}
return FALSE;
?>
danke schon einmal
am 07.03.2008 - 10:39 Uhr
zu deinen fragen:
1. Hast Du die öffnenden und schließenden PHP-Tags mit eingefügt?
2. Hast Du "Block nur anzeigen, wenn Code TRUE zurückgibt" aktiviert?
jupp!!!
zur dritten frage:
ich habe im template einfach mal ne runde arg(0) ausgegeben. solange ich mich durch die navigation arbeite steht da immer "category", auch wenn ich die begriffe der kategorien in der navigation anwähle
zb:
/?q=category/15
für einen untergeordneten begriff:
/?q=category/15/2
diese habe ich schön brav mit taxonomy erstellt und gebe sie mit taxonomy_menu aus.
aber sobald ich eine node klicke, welche ich der category "/?q=category/15/2" zugeordnet habe, lautet mein link zb. /?q=node/15.
der block weiß bis jetzt bescheid, er darf sich nur für die kategorien 15,16 und 17 öffen. aber er soll sich auch nur für die dazugehörigen nodes öffnen. sprich: wenn die node zur kategorie 15,16 oder 17 gehört, darf der block sich öffnen. nicht, wenn die node zb. zur kategorie 14 gehört, die einem anderen block zugeteilt ist.
klar, ich könnte jetzt auch so jede einzelne node einpflastern:
... if(arg(0) == 'node' && arg(1)=='x y z') ...
aber davon habe ich leider ein paar zuviel, nämlich über 4000!
und hier ist ja das problem. da kann dein vorschlag ja nicht funktionieren, da es sich beim arg(0) um node handelt. trotzdem bleibt die navigation geöffnet. das müsste ja bedeuteten, die node weiß, zu welcher kategorie sie gehört. und welche variabel ist dafür zuständig?
deshalb bräuchte ich solch eine lösung:
... if(arg(0) == 'node' && NODE__ZUORDUNG_ZU_KATEGORIE__KATEGORIEID == AKTUELLE_KATEGORIE_ID) ...
beide variabeln werden ja mitgeliefert, da sich das menü bei drücken auf eine node nicht schließt. wie gestallte ich also richtig meine abfrage?
danke schon einmal
gruß, hoshi
lösung in sicht
am 07.03.2008 - 15:46 Uhr
also, ich stehe kurz vor der lösung, komme bei einer sache nicht ganz weiter. folgendes script habe ich mir für "Diesen Block nur anzeigen, wenn der folgende PHP-Code TRUE zurückgibt" gebastelt:
<?php
//Zu welcher Parentkategorie gehört die Node?
if(arg(0)=='node'){
$node_catid = db_result(db_query("SELECT td.vid FROM term_node AS tn, term_data AS td WHERE tn.nid=$nid AND td.tid=tn.tid"));
}
//Folgende Parentkategorien und Nodes mit Bezug auf Parentkategorien blenden Block ein
if (arg(0) == 'category' && arg(1) > 17 && arg(1) < 30 || arg(0) == 'node' && $node_catid > 17 && $node_catid < 30){
return TRUE;
}else{
return FALSE;
}
?>
Allerdings hat er Probleme, die aktuelle $nid im statement aufzulösen. auch arg(1), welche bei den nodes die id angibt, wird nicht aufgelöst. ich bekomme folgenden fehlermeldung:
user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND td.tid=tn.tid' at line 1 query: SELECT td.vid FROM term_node AS tn, term_data AS td WHERE tn.nid= AND td.tid=tn.tid in /var/www/XXXXX.de/demo4/includes/database.mysql.inc on line 172.
wie bekomme ich die aktuelle nodeid ausgegeben?
danke.
<?php<?php//Zu welcher
am 07.03.2008 - 16:03 Uhr
<?php
//Zu welcher Parentkategorie gehört die Node?
if(arg(0)=='node' && is_numeric(arg(1)){
$nid = arg(1);
$node_catid = db_result(db_query("SELECT td.vid FROM term_node AS tn, term_data AS td WHERE tn.nid= %d AND td.tid = tn.tid"), $nid);
}
//Folgende Parentkategorien und Nodes mit Bezug auf Parentkategorien blenden Block ein
if (arg(0) == 'category' && arg(1) > 17 && arg(1) < 30 || arg(0) == 'node' && $node_catid > 17 && $node_catid < 30){
return TRUE;
}else{
return FALSE;
}
?>
so müsste es gehen
--------------
Mein Blog: www.freeblogger.org
Deutscher IRC-Channel: irc.freenode.net #drupal.de je mehr desto besser
... Jabber-me: dereine@jabber.ccc.de Warum Jabber?
Blockterm
am 07.03.2008 - 17:27 Uhr
Installier dir einfach dieses Modul: http://drupal.org/project/blockterm
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
meine lösung
am 07.03.2008 - 17:49 Uhr
eine klammer falsch gesetzt, und es ging nicht!!!
hier nun endlich meine lösung, und sie funktioniert:
<?php
//Zu welcher Taxonomie-Kategorie gehört die Node?
if(arg(0)=='node' && is_numeric(arg(1))){
$node_catid = db_result(db_query("SELECT td.vid FROM term_node AS tn, term_data AS td WHERE tn.nid= %d AND td.tid = tn.tid", arg(1)));
}
//Folgende Taxonomie-Kategorien und Nodes mit Bezug auf Taxonomie-Kategorie blenden den Block ein
if (arg(0) == 'category' && arg(1) > 17 && arg(1) < 30 || arg(0) == 'node' && $node_catid > 17 && $node_catid < 30){
return TRUE;
}else{
return FALSE;
}
?>
gruß und vielen dank für die hilfe
hoshi
Flexibler
am 07.03.2008 - 17:55 Uhr
Mit dem Blockterm Modul wäre das flexibler zu handhaben, da du die Term ids flexibel auswählen kannst.
Fest verdrahtete Werte werden häufig, irgendwann zum Problem.
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
Blockterm sieht gut aus,
am 07.03.2008 - 17:56 Uhr
Blockterm sieht gut aus, allerding bevor ich mir den Aufwand von Installation, Konfiguration und künftiger unaufhörlicher Updatearbeit antue, nur noch einmal der Hinweis, dass der von hoshi79 gepostete Code im Eingangsbeitrag sicher funktioniert. @hoshi79 - das, was Du hier willst, hast du schon gepostet:
deshalb bräuchte ich solch eine lösung:
... if(arg(0) == 'node' && NODE__ZUORDUNG_ZU_KATEGORIE__KATEGORIEID == AKTUELLE_KATEGORIE_ID) ...
Mein Vorschlag bezog sich auf Deinen Wunsch, dies auch auf Teaserlisten anzuwenden und verstand sich daher nur als Erweiterung des bereits geposteten Codes. Wenn dieser nicht funktioniert, liegt es m. E. nicht am Code. (Deswegen auch meine Nachfragen.) Man müsste halt debuggen, in einem auf PHP gestellten Testnode den Code einfügen, nach der noad_load()-Zeile eben einmal ein
<?php print_r($node->taxonomy) ?>
einbauen etc.Da hast du sicher
am 07.03.2008 - 18:04 Uhr
Da hast du sicher teilweise recht. Allerdings denke ich, dass man mit fest verdrahteten Werten nur auf einer eigenen Site arbeiten kann.
Bei Kundenprojekten sollten die Mitarbeiter in der Lage sein, soviel wie möglich über Drupal ändern zu können und nicht etwas im Block-Code. Und dann noch mit PHP!
Da ist die Katastrophe doch schneller da, als man glaubt.
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
tada
am 07.03.2008 - 19:08 Uhr
puh, ich bin überhaupt froh, dass ich es geschafft habe. aber das madul werde ich auch noch installieren. mal schauen, was besser ist. danke für eure mühen.
hoshi
@md
am 08.03.2008 - 21:04 Uhr
@md:
Da gebe ich Dir bestimmt recht.