Blöcke mit Menü ein- und ausblenden
am 01.10.2006 - 09:40 Uhr in
Hallo Forum,
ich habe gerade begonnen, mit Drupal zu experimentieren und habe folgende Frage, auf die ich hier im Forum noch keine Antwort gefunden habe: Ich möchte mir eine Menüstruktur erstellen, die folgendermaßen aussehen soll: Oben einige Primary-Links, zum Beispiel "Säugetiere", "Vögel", "Fische". Wenn nun einer der Primary-Links angwählt wird, soll links in der Sidebar ein Block mit einem Menü erscheinen (bei "Vögel" dann zum Beispiel mit den Einträgen "Pinguine", "Flamingos" und - was weiß ich - "Buchfinken"). Bei "Fische" soll dann ein Block mit einem Fisch-Menü erscheinen, und die Vögel verschwinden.
Nun habe ich mir für jeden Primary-Link ein Menü angelegt, außerdem habe ich ein Vokabular erzeugt, das die Einträge "Säugetiere", "Vögel" und "Fische" enthält. Beim Anlegen eines neuen Node weise ich die entsprechende Kategorie zu.
So weit, so gut. Jetzt muss ich es nur noch hinbekommen, dass die Blöcke mit den Menüs so ein- und ausgeblendet werden, wie ich mir das vorstelle. Jetzt kann ich natürlich bei den Einstellungen zum Block jede Seite einzeln angeben, bei der der Block erscheinen soll. Eleganter fände ich es, wenn ich "Diesen Block nur anzeigen, wenn der folgende PHP-Code TRUE zurückgibt (PHP-Modus für Experten)." anwählen würde. Nun würde ich einen PHP-Ausdruck eintragen, der so ungefähr folgendermaßen aussehen würde:
category = "Fische"
Da ich aber keine Ahnung von PHP habe: Könnte mir vielleicht jemand behilflich sein, diesen Ausdruck zu formulieren?
Oder ist das ganze Konzept Schwachsinn, und es geht viel einfacher? Oder viel komplizierter?
Viele Grüße von
SSt
- Anmelden oder Registrieren um Kommentare zu schreiben
Path angeben
am 01.10.2006 - 13:08 Uhr
Du kannst in der Block Konfiguration bei 'Zeige den Block nur auf den aufgelisteten Seiten' auch einen URL-Path angeben.
Beispiel:
"Fische"
"Fische/*"
vg, md - drupalcenter
--
www.mdwp.de
Genau hier hänge ich aber
am 01.10.2006 - 14:42 Uhr
Genau hier hänge ich aber auch.
Durch die Path Angabe löse ich ja nur ein Teil des Problems - oder?
Ähnlich wie SST will ich auch ein Menü aufbauen. Ich halte mich daher mal an seinem Beispiel.
1. Wenn ich z.B. in der Primären Navi "Säugetiere" aufrufe, erhalte ich den entsprechenden Menü Block - soweit ok. ABER der Menü Block wird ja nicht mehr angezeigt, wenn ich davon einen Artikel z.B. kommentieren oder bookmarken möchte.
Und 2. Der Menü Block "Fische" soll z.B. nur der Benutzer-Rolle "Fischer" zugänglich sein. Alle Anderen Gäste und Benutzer sollen die Inhalte nicht lesen dürfen. Ich könnte es im Block per PHP z.B. so umsetzen:
<?php
global $user;
if (in_array('Fischer',$user->roles)) {return TRUE;};
if ($user->uid == 1) {return TRUE;} else {return FALSE;}
?>
Aber den Block brauche ich ja auch, um die URLs anzugeben.
Hier komme ich z.Z. noch nicht weiter.
Für Tipps und Lösungen wäre ich wirklich dankbar.
URLs angeben?
am 01.10.2006 - 17:09 Uhr
Aber den Block brauche ich ja auch, um die URLs anzugeben.
Da versteh ich nicht was du meinst.
vg, md - drupalcenter
--
www.mdwp.de
Der Menü Block Fische soll
am 01.10.2006 - 19:37 Uhr
Der Menü Block Fische soll nur erscheinen, wenn die URLs:
fische
fische/*
aufgerufen werden. Das kann ich in dem Menü Block Einstellungen vornehmen, wie von Dir beschrieben.
Also, habe ich für den Menü Block "Fische" die Einstellung "Diesen Block nur auf den aufgelisteten Seiten anzeigen." akiviert und:
fische
fische/*
eingegeben. Klappt auch super (bis auf das Problem, dass der Menü Block ja nicht mehr angezeigt wird, wenn ich z.B. den Artikel mit URL "fische/hecht" kommentieren will).
Nun ist das Thema Fische aber so heikel, dass nur die Benutzer der Rolle "Fischer" darauf zugreifen dürfen. Um dies zu erreichen, bräuchte ich daher die "Seitenspezifische Sichtbarkeitseinstellungen" noch einmal, um die Einstellung "Diesen Block nur anzeigen, wenn der folgende PHP-Code TRUE zurückgibt (PHP-Modus für Experten)." aktivieren zu können, um den entsprechenden php Code einzugeben.
Hier liegen meine zwei Probleme, die ich mit der Menü Erstellung momentan habe.
---------
Ich will u.a. meine aktuelle Seite: www.rener.de auf Drupal umstellen und mich von Joomla! verabschieden.
Dort habe ich einen privaten Bereich, der über die Top Navigation zu erreichen ist. Das entsprechende Menü und die Inhalte werden aber nur angezeigt, falls man über die entsprechenden Benutzerrechte verfügt.
Ich hoffe ich konnte mein Problem etwas deutlicher ausdrücken und würde mich für jegliche Hilfestellung freuen.
rener
URL-Path
am 02.10.2006 - 11:54 Uhr
Hallo vg,
Du hast geschrieben:
>> Du kannst in der Block Konfiguration bei 'Zeige den Block nur auf den aufgelisteten Seiten' auch einen URL-Path angeben.
>> Beispiel:
>> "Fische"
>> "Fische/*"
Das hört sich prima an, davon hatte ich auch schon gelesen, bin aber anscheinend auch dazu zu dusselig. Woher weiß das Node "Karpfen", dass es ein Unterpunkt von "Fische" ist (das durch "/*" angesprochen werden soll)?
Grüße von
SSt
@md
am 02.10.2006 - 12:23 Uhr
Ich glaube er meint, daß ich ja bezüglich der sichtbarkeit die möglichkeit habe
entweder nach pfad (zB /blog/*) oder nach php-code (zB ob registriert oder nicht) die sichtbarkeit des blockes ein und auszuschlaten. will ich aber sagen:
nur registrierte nutzer und nur bei den seiten so und so, komme ich ohne weitergehenden php-code nicht weiter
--------------------------------
http://www.autokauf-und-recht.de
Sichtbarkeit von Blöcken
am 02.10.2006 - 12:43 Uhr
Eine Möglichkeit für den PHP-Code für die Sichtbarkeit von Blöcken wäre:
<?php
global $user;
if (in_array('Fischer',$user->roles) && arg(0) == 'Fische') {return TRUE;};
?>
vg, md - drupalcenter
--
www.mdwp.de
Problem 2
am 02.10.2006 - 23:33 Uhr
Problem 2 kannst du lösen, wenn du die Blockanzeige von einem Taxonomie-Term abhängig machst.
Ich habe deinen Code mal ein bißchen erweitert.
<?php
if (arg(0)=='node') {
$cats = taxonomy_node_get_terms(arg(1));
foreach ($cats as $cat) {
$mycategory = $cat->name;
if ($mycategory=="Fischer") return TRUE;
}
}
global $user;
if (in_array('Fischer',$user->roles) || ($user->uid == 1)) return TRUE;
else return FALSE;
?>
arg(0)
am 02.10.2006 - 23:44 Uhr
arg(0) ist aber nicht zwangläufig 'node'. Z.B. dann nicht wenn man einen URL-Alias (path) eingegeben hat oder das pathauto Modul einsetzt.
vg, md - drupalcenter
--
www.mdwp.de
auf meinen drupal-seiten
am 03.10.2006 - 00:07 Uhr
auf meinen seiten gibt drupal außerhalb der theming-funktionen immer node zurück.
d.h. der code funktioniert mit pathalias. ;-)
Auch auf meinen Seiten kann
am 03.10.2006 - 09:02 Uhr
Auch auf meinen Seiten kann arg(0) z.B. ein comment, ein taxomony sein.
JAWOLL!
am 03.10.2006 - 13:41 Uhr
@TobiasH: Das isses, mit dem Code kann ich was anfangen!
Vielen Dank, das hat mir sehr geholfen!
Grüße von
SSt
Ich habe nun auch eine
am 03.10.2006 - 15:59 Uhr
Ich habe nun auch eine Lösung.
Egal, ob einen Artikel über node/xxx bzw. eine Kategorie über taxonomy/term/xxx oder die entsprechenden URL-Alias Namen aufrufe, werden die Seiten angezeigt.
Auch wird der Menü Block nun angezeigt, wenn man einen Artikel kommentiert oder zitiert.
Man muss lediglich die IDs der Kategorien eingeben und die url alias Namen.
Ich hoffe ich habe nichts übersehen.
<?php
global $user;
if (in_array('Fischer',$user->roles) || ($user->uid == 1)) {
/*
This snippet returns TRUE if the node we are
currently viewing is tagged with specific terms,
or has a particular URL path assigned to it
*/
$desired_terms = array(9, 35,); // put here the term IDs (tid) you're interested in
$desired_paths = array('fische', 'hecht'); // put the URL path components of interest here
// check taxonomy terms first
if ( arg(0) == 'node' and is_numeric(arg(1)) ) {
// Yes, we're viewing a node.
$node = node_load(arg(1));
foreach ($node->taxonomy as $term) {
if (in_array($term->tid, $desired_terms)) {
return TRUE;
}
}
}
if ( arg(0) == 'comment' and is_numeric(arg(2)) ) {
// Yes, we're viewing a comment form.
$node = node_load(arg(2));
foreach ($node->taxonomy as $term) {
if (in_array($term->tid, $desired_terms)) {
return TRUE;
}
}
}
// check url path next
// this should get the current drupal path, regardless of the clean url setting
if ($_GET['q']) {
$my_drupal_path = $_GET['q'];
} else {
$my_drupal_path = substr($_SERVER['REQUEST_URI'], 1);
}
// this will convert a path like node/37 to clean/url/path, if one exists
$my_path_alias = drupal_get_path_alias($my_drupal_path);
// check for the the url path component anywhere in the alias
// change this to $mypathalias == $desired_path to get an exact match instead
foreach ($desired_paths as $desired_path) {
if (stristr($my_path_alias, $desired_path)) {
return TRUE;
}
}
}
// if all else fails, return false
return FALSE;
?>
schöne Grüße
rener
------------
Wir sind lediglich hier, um Erfahrungen zu sammeln.