Block Buchnaviagtion nicht auf der Buchhaupseite zeigen?
Eingetragen von florianr (122)
am 02.11.2007 - 00:58 Uhr in
am 02.11.2007 - 00:58 Uhr in
Hallo!
Ich habe ein Buch, den Block Buchnavigation zeige ich auf der Seite an, daher soll der Block auf den Buchseiten der Hauptebene (wie nennt man die eigentlich richtig) nicht angezeigt werden.
Das Problem ist dabei aber, dass die Bücher von Benutzern erstellt werden, sonst könnte ich ja recht einfach "Zeige auf allen außer den aufgelisteten Seiten" nutzen und dort einfach den Node eintragen. Aber der ändert sich eben ständig, bzw. es werden immer mehr.
(Außerdem sollte der Block Titel ein Link auf die oberste Ebene sein ... geht das irgendwie?)
- Anmelden oder Registrieren um Kommentare zu schreiben
Ganz verstehe ich noch nicht
am 02.11.2007 - 02:48 Uhr
Ganz verstehe ich noch nicht was Du moechtest.
Aber hier schon mal Uberlegungen als Loesungsansatz.
Das Problem ist dabei aber, dass die Bücher von Benutzern erstellt werden, sonst könnte ich ja recht einfach "Zeige auf allen außer den aufgelisteten Seiten" nutzen und dort einfach den Node eintragen. Aber der ändert sich eben ständig, bzw. es werden immer mehr.
Bei einem Buch ist der Nodetype "book". Diesen Typ koennte man abfragen.
Um das zu realisieren wird die Sichtbarkeit des Blockes mit PHP festgelegt. Da Du an der Stelle vermutlich
if ($node->type == 'book')
nicht ohne weiteres verwenden kannst weil $node->type nicht zur Verfuegung steht musst man vor dieser Abfrage das Nodeobjekt laden.
Nodeobjekt laden: http://api.drupal.org/api/function/node_load/5
Mit
$mynode = node_load(arg(1))
hast man das Nodeobjekt. Das entspricht als Beispiel einer URL
http://deine-seite.de/node/47
. Der Parameter arg(1) entspricht also einer belibigen Node-Nummer und wird auf diese Weise beim Laden des Nodeobjektes dynamisch uebergeben. Es spielt also keine Rolle welche Node gerade angezeigt wird.Hier noch ein exakteres Codeschnipsel zum Nodeobjekt laden:
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
$nid = (int)arg(1);
$files = node_load($nid));
}
Danach ist die Abfrage zum Einschraenken der Blockanzeige
if ($node->type == 'book') {
return TRUE;
} else {
return FALSE;
}
moeglich bzw. gibt einen Wert zurueck und man kann TRUE und FALSE setzen.
Da Du aber bei Buchseiten den Block NICHT anzeigen willst muss die Abfrage so lauten:
if ($node->type == 'book') {
return FALSE;
} else {
return TRUE;
}
Die Abfrage
if ($node->type == 'book')
ist natuerlich erst mal sehr grob und damit kann nur generell auf die Blockanzeige Einfluss genommen werden. Man kann zusaetzlich arg-Parameter abfragen um beim Erstellen oder Bearbeiten von Inhalten den Block anzuzeigen. Dazu dasBeispiel einer URL
http://deine-seite.de/node/add/book
Hier kann mit
if (arg(0) == 'node' && arg(1) == 'add')
die Abfrage-Bedingung deart erweitert werden das der Block beim Erstellen von Inhalt angezeigt wird.Beispiel einer Abfrage, um den Block nur beim Erstellen von Inhalten und beim Bearbeiten von Booknodes anzuzeigen:
if ( (arg(1) == 'add' && arg(2) == 'book') || ($node->type == 'book' && arg(2) == 'edit') ) {
return TRUE;
} else {
return FALSE;
}
Die Codebeispiele sind jetzt nur auf die Schnelle erstellt um zu zeigen wie man mit PHP-Code auf die Anzeige des Blockes der Buchnavigation Einfluss nehmen koennte.
(Außerdem sollte der Block Titel ein Link auf die oberste Ebene sein ... geht das irgendwie?)
Gib dem Block ein Template. In dem Template bekommt die Blockueberschrift den gewuenschten Link.
Kann man Bloecke themen? http://www.drupalcenter.de/faq/5149
Templates fuer Bloecke: http://www.drupalcenter.de/handbuch/4291
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
quiptime wrote: Ganz
am 02.11.2007 - 03:52 Uhr
Ganz verstehe ich noch nicht was Du moechtest.
Denke ich mal wieder zu kompliziert?;) Danke jedenfalls für die Antwort ...
Da Du aber bei Buchseiten den Block NICHT anzeigen willst muss die Abfrage so lauten:
if ($node->type == 'book') {
return FALSE;
} else {
return TRUE;
}
Ich möchte, dass der Block auf allen Buchseiten, außer auf den Toplevel Buchseiten (also den Buchseiten, die zwar Kinder haben, aber keine Eltern.
etwa so:
Buch Seite 1 (Block nicht sichtbar!)
-- Buch Seite 2 (Block sichtbar)
-- Buch Seite 3 (Block sichtbar)
Die Abfrage müßte also noch darum ergänzt werden, ob das Buch eine vorhergehnde Seite hat so wie man in views abfragen kann: "vorhergehender node ist 0" ...
Warum das ganze? Weil ich den Block im Bereich content anzeigen lassen möchte, das macht aber auf den Toplevel Seiten keinen Sinn, weil die ja schon das Inhaltsverzeichnis anzeigen ...
(Außerdem sollte der Block Titel ein Link auf die oberste Ebene sein ... geht das irgendwie?)
Gib dem Block ein Template. In dem Template bekommt die Blockueberschrift den gewuenschten Link.
So habe ich mir das gedacht, aber woher bekomme ich die Adresse, auf die der Titel linken soll? dazu müsste ich ja irgendwie die Adresse der Toplevel Buchseite laden können aber wie blos?
Zur Block Anzeige sollte
am 02.11.2007 - 15:00 Uhr
Zur Block Anzeige sollte sich doch hieraus etwas basteln lassen oder? Werde ich mal probieren, sobald ich Zugriff auf das System habe:
http://drupal.org/node/120855
<?php
if ($node->type == 'book') {
if ($node->parent == 0) {return FALSE;
} else {
return TRUE;
}
?>
Edit ich habe die "Logik-Fehler" im Code mal beseitigt, trotzdem funktioniert er noch nicht. Damit wird auf keiner Seite mehr der Block angezeigt.
Hmm im IRC hat mir dvessel
am 02.11.2007 - 14:57 Uhr
Hmm im IRC hat mir dvessel folgenden code gepostet:
<?php
if (arg(0) == 'node' && is_numeric(arg(1)) {
$node = node_load(arg(1));
if (!empty($node->pid)) {
return FALSE;
}
}
else {
return TRUE;
}
?>
Aber damit wird immer noch auf jeder Seite der Block angezeigt.
genau das habe ich bereits erklaert
am 02.11.2007 - 15:10 Uhr
Edit ich habe die "Logik-Fehler" im Code mal beseitigt, trotzdem funktioniert er noch nicht. Damit wird auf keiner Seite mehr der Block angezeigt.
Bitte lese noch mal genau was ich geschrieben habe, denn genau das habe ich bereits erklaert.
Die Abfrage if ($node->type == 'book') ist natuerlich erst mal sehr grob und damit kann nur generell auf die Blockanzeige Einfluss genommen werden. Man kann zusaetzlich arg-Parameter abfragen um beim Erstellen oder Bearbeiten von Inhalten den Block anzuzeigen.
Nochmal, mein grosser Post oben ist nur in dem Sinne korrekt als das er die Moeglichkeiten der Block-Anzeigesteuerung mittels PHP kurz anreissen soll.
Meine Erklaerungen beruhen nicht auf den konkreten Ausfuehrungen von Code nach Deinem Problem. Es sind nur Ueberlegungen die Dich auf Moeglichkeiten aufmerksam machen moechten.
Konkret umsetzen musst Du selbst!
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Vorschlag zur
am 02.11.2007 - 15:39 Uhr
Vorschlag zur Loesungsfindung.
Klicke in Deiner Drupalinstallation alle Seiten an bei denen der Block sichtbar sein soll und poste die URL's dieser Seiten.
Damit koennen wir dann hier gemeinsam eine optimale Abfrage erstellen.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
quiptime wrote: florianr
am 02.11.2007 - 16:22 Uhr
Edit ich habe die "Logik-Fehler" im Code mal beseitigt, trotzdem funktioniert er noch nicht. Damit wird auf keiner Seite mehr der Block angezeigt.
Bitte lese noch mal genau was ich geschrieben habe, denn genau das habe ich bereits erklaert.
Sorry, ich meinte mit den Logik Fehlern die in meinem Posting, ich hatte die Logik verdreht, dass der Block auf den falschen Seiten angezeigt worden wäre.
Links werde ich zusammenstellen und posten.
Danke so weit!
Hier die Seiten:
am 02.11.2007 - 21:10 Uhr
Auf folgenden Seiten soll der buch navigation block NICHT sichtbar sein:
http://www.frhost.de/content/newsletter-fr%C3%BChjahr-2007
http://www.frhost.de/content/newsletter-herbst-2007
http://www.frhost.de/content/newsletter-sommer-2007
Auf folgenden Seiten soll der Block angezeigt werden:
Buch Newsletter Sommer 2007:
http://www.frhost.de/content/hardware-1
http://www.frhost.de/content/software-0
Buch Newsletter Frühjahr 2007:
http://www.frhost.de/content/hardware
http://www.frhost.de/content/software
Buch Newsletter Herbst 2007:
http://www.frhost.de/content/messeneuheiten
http://www.frhost.de/content/hardware-0
http://www.frhost.de/content/software-1
Ich habe mal print_r($node) in das template gesetzt, so kann man die verfügbaren Variablen sehen.
P.S. bitte nicht erschrecken, dass ist ein reines Testfeld, sieht schlimm aus ...
Bitte setze mal in den Block
am 02.11.2007 - 21:46 Uhr
Bitte setze mal in den Block die Ausgabe:
print 'arg(0): '.arg(0).'<br />';
print 'arg(1): '.arg(1).'<br />';
print 'arg(2): '.arg(2);
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Done
am 02.11.2007 - 22:05 Uhr
Done
Du arbeitest mit Alias.
am 02.11.2007 - 22:26 Uhr
Du arbeitest mit Alias. OK.
Zur Problematik der Funktion arg() bei Verwendung mit URL Aliasen gab es vor paar Tagen schon eine Diskusion. Mein Fazit dabei:
Du musst bei den Abfragen mit den "Real" Pfaden arbeiten wenn Du arg() verwendest.
Erst mal so viel. Gucke noch.
Ergaenze bitte die arg Prints noch mit:
$mynode = node_load(arg(1));
print '<br />nodetype: '.$mynode->type;
------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da ist irgendwas schief
am 02.11.2007 - 22:49 Uhr
Da ist irgendwas schief gelaufen beim print von $mynode->type
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Parse error: syntax error,
am 02.11.2007 - 22:57 Uhr
Sorry, mein Fehler!
<?php
print 'arg(0): '.arg(0).'<br />';
print 'arg(1): '.arg(1).'<br />';
print 'arg(2): '.arg(2).'<br/>';
$mynode = node_load(arg(1));
print '<br />nodetype: '.$mynode->type;
?>
Ergibt allerdings:
warning: Invalid argument supplied for foreach() in /home/www/frhost.de/fr/modules/node/node.module on line 521.
warning: implode() [function.implode]: Bad arguments. in /home/www/frhost.de/fr/modules/node/node.module on line 525.
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 '' at line 1 query: SELECT n.nid, n.vid, n.type, n.status, n.created, n.changed, n.comment, n.promote, n.sticky, r.timestamp AS revision_timestamp, r.title, r.body, r.teaser, r.log, r.format, u.uid, u.name, u.picture, u.data FROM node n INNER JOIN users u ON u.uid = n.uid INNER JOIN node_revisions r ON r.vid = n.vid WHERE in /home/www/frhost.de/fr/includes/database.mysql.inc on line 172.
Output auf den Buchseiten:
arg(0): node
arg(1): 8
arg(2):
nodetype: book
Für: http://www.frhost.de/node/8
Fuege bitte diesen Code ein
am 02.11.2007 - 23:02 Uhr
Fuege bitte diesen Code ein:
<?php
print 'arg(0): '.arg(0).'<br />';
print 'arg(1): '.arg(1).'<br />';
print 'arg(2): '.arg(2).'<br />';
if (!empty(arg(1))) {
$mynode = node_load(arg(1));
print 'nodetype: '.$mynode->type;
}
?>
Bist kein PHP-Coder?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Habe eben den Code des
am 02.11.2007 - 23:10 Uhr
Habe eben den Code des vorangehenden Post's geaendert. Bitte korrigieren damit Error verschwindet.
An Stelle von
if (!empty(arg(1)))
geht auch
if (arg(1) != '')
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Jetzt habe ich meinem Server
am 02.11.2007 - 23:11 Uhr
Jetzt habe ich meinem Server die Lichter ausgeblasen ...
HTTP 500 - Interner Serverfehler
Nein ich bin kein PHP-Coder.
Zumindest würde ich mich nach wenigen Wochen oberflächlicher Beschäftigung mit dem Thema nicht so bezeichnen.
Ich würde aber gerne mal einen vernünftigen Einstieg finden ...
Kommentiere mal die Zeilen
am 02.11.2007 - 23:15 Uhr
Kommentiere mal die Zeilen im Zusammenhang mit dem node_load aus, damit die Seite wieder laeuft:
<?php
print 'arg(0): '.arg(0).'<br />';
print 'arg(1): '.arg(1).'<br />';
print 'arg(2): '.arg(2).'<br/>';
//$mynode = node_load(arg(1));
//print '<br />nodetype: '.$mynode->type;
?>
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Ich komme ja nicht mehr auf
am 02.11.2007 - 23:22 Uhr
Ich komme ja nicht mehr auf das admin interface ...
Ich denke ohne ftp ist da im MOM nichts zu machen ...
Ach Mist. Hatte ich
am 02.11.2007 - 23:25 Uhr
Ach Mist. Hatte ich uebersehen. War ja ne Aenderung in Drupal selbst.
Hast Du DB-Zugriff mit PHPmyAdmin?
------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Im MOM auch nicht, weil mein
am 02.11.2007 - 23:27 Uhr
Im MOM auch nicht, weil mein hoster irgendeinen Port für SSL nutzt, der hier gesperrt ist.
Was soll ich den in PHPmyAdmin ändern? Kann ich dann aber erst morgen früh machen ...
welche Tabelle der PHP-Code eines Blockes?
am 02.11.2007 - 23:31 Uhr
Das ist gerade mein Problem. Ich weiss nicht in welche Tabelle der PHP-Code eines Blockes eingetragen wird.
Wenn hier Jemand mitliest und einen Tipp geben kann? Danke
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
PHP-Code von Bloecken
am 02.11.2007 - 23:56 Uhr
Hat sich erledigt. Weiss wo der PHP-Code von Bloecken eingetragen wird.
In der Tabelle "blocks" in der Spalte "pages".
@florianr,
bevor Du den Code des betreffenden Blockes in der Spalte "pages" loescht poste diesen PHP-Code hier. Damit man sehen kann was den Fehler verursacht hat.
Also nochmal:
Mit PHPmyAdmin auf die DB einloggen. In der Tabelle "blocks" beim in Frage kommenden Block den Inhalt von "pages" loeschen. Den in Frage kommenden Block erkennst Du am Eintrag in der Spalte "pages". Dort steht der PHP-Code so drin wie Du ihn in Drupal in der Block-Administration eingetragen hast. Einen weiteren Block mit PHP-Code wirst Du ja nicht haben. Somit wird es nur einen in Frage kommenden Eintrag in "pages" geben. - Nur den eingetragenen PHP-Code in der Spalte "pages" loeschen, nicht den Block selbst!
Nicht vergessen, den PHP-Code hier posten.
Bis Morgen.
------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Wie gut, dass der Admin hier
am 03.11.2007 - 00:26 Uhr
Wie gut, dass der Admin hier immer ein Scheunentor in der firewall auflässt.
Habe jetzt doch Zugriff auf phpmyadmin.
Der Block war aber unter boxes, body ...
<?php
print 'arg(0): '.arg(0).'<br />';
print 'arg(1): '.arg(1).'<br />';
print 'arg(2): '.arg(2).'<br />';
if (!empty(arg(1))) {
$mynode = node_load(arg(1));
print 'nodetype: '.$mynode->type;
}
?>
Das kann ich dann jetzt löschen oder?
Edit:
So habe das jetzt gelöscht ...
Bin jetzt wieder online ... http://frhost.de/book
Ich versuche gerade zu
am 03.11.2007 - 01:32 Uhr
Ich versuche gerade zu erkennen was am PHP-Code falsch ist.
Ich sehe keinen Fehler.
Eventuell ist die if Frage das Problem.
<?php
print 'arg(0): '.arg(0).'<br />';
print 'arg(1): '.arg(1).'<br />';
print 'arg(2): '.arg(2).'<br />';
if ( is_string(arg(0)) && is_numeric(arg(1)) ) {
$mynode = node_load(arg(1));
print 'nodetype: '.$mynode->type;
}
?>
Du koenntest das mal so probieren. Du hast noch PHPmyAdmin Zugriff? Falls es erneut nen Error gibt.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
OK, scheint so zu klappen,
am 03.11.2007 - 02:08 Uhr
OK, scheint so zu klappen, ich sehe zumindest keine Fehlermeldung ...
arg(0): node
arg(1): 8
arg(2):
nodetype: book
Edit:
Ich habe jetzt das hinzugefügt:
print 'parent:'.$mynode->parent;
Lösung?
am 03.11.2007 - 04:20 Uhr
Nun so scheint es zunächst mal zu klappen, dass der Block auf den Top Level Pages nicht angezeigt wird ...
<?php
if ( is_string(arg(0)) && is_numeric(arg(1)) ) {
$mynode = node_load(arg(1));
if($mynode->parent == 0) {
return FALSE;
} else { return TRUE;}
}
?>
@quiptime
Vielen Vielen Dank für Deine Unterstützung so weit, ohne Deine Hilfe wäre ich sicher nicht so weit gekommen ...
Bliebe noch das Problem mit dem Titel als Link, aber dafür mache ich wohl besser mal einen neuen Thread auf ;)
Buch Titel im book navigation block als link ... http://www.drupalcenter.de/node/6205