Block über PHP ausblenden
Eingetragen von t.sebesta (72)
am 05.09.2007 - 14:02 Uhr in
am 05.09.2007 - 14:02 Uhr in
Ich habe jetzt die Einstellung "Block nur einblenden wenn PHP... usw." gefunden, aber das ist eigentlich nicht das was ich suche, da diese Einstellung von jedem Modulbenutzer selbst eingestellt werden müsste.
Kann ein Block über PHP eingeblendet werden und wenn ja wie?
Gruß
Thomas
- Anmelden oder Registrieren um Kommentare zu schreiben
Wo willst du denn den PHP
am 05.09.2007 - 15:57 Uhr
Wo willst du denn den PHP Code reinschreiben?
___________________________
it's easier than you think
Raphael Schär
http://www.schaerwebdesign.ch
______________________________
Yet Another Drupal Site (YADS)
http://www.rapsli.ch
******************************
Ich will einen Block einfach
am 05.09.2007 - 16:23 Uhr
Ich will einen Block einfach per PHP einblenden oder ausblenden ohne über die Blockadministration Einstellungen treffen zu müssen - also im laufenden Code.
Es geht darum für Seiten die eine externen Datenbank abbilden Blöcke zu haben, mit denen Auswahlen getroffen werden usw. Die Sichtbarkeit Blöcke muss aber abhängig vom dargestellten Inhalt sein. Vermutlich werde ich zwei variable Blöcke brauchen.
Einmal brauch ich diesen Block, einmal jenen, unter Umständen wäre sogar die Platzierung ein Thema. Die Blöcke sollen aber nicht Benutzergesteuert zur Verfügung stehen sondern Programmgesteuert.
Möglicherweise könnte man auch einen oder mehrere vorhandene Blöcke unterschiedlich füllen. Da habe ich aber noch nicht durchblickt, wie ich an den Blockcontent komme und diesen im variabel verändere?
Gruß
Thomas
ich denke da gibt es viele
am 05.09.2007 - 17:07 Uhr
ich denke da gibt es viele Möglichkeiten. Eine ist z.B. die Block.tpl.php zu ändern
und dort am Anfang
<?php
if($delta != 1 || $delta != 2)
{
// normaler Block.tpl.php Code
}
?>
eintragen. Die Lösung finde ich jetzt nicht sonderlich elegant, da das ganze Theme-Abhängig ist, und z.T. die Performance belastet. $delta ist die Nummer des Blogs. Dazu einfach auf admin/build/block schauen und die delta-id dort anhand des Links übernehmen.
Du könntest auch pro Block
am 05.09.2007 - 17:30 Uhr
Du könntest auch pro Block eine eigene Region definieren und dann dort die Abfrage machen, ob etwas in der Region (also der entsprechende Block) drin ist.
___________________________
it's easier than you think
Raphael Schär
http://www.schaerwebdesign.ch
______________________________
Yet Another Drupal Site (YADS)
http://www.rapsli.ch
******************************
Danke dereine, aber wirklich
am 05.09.2007 - 17:30 Uhr
Danke dereine,
aber wirklich nicht das, was mir vorschwebt.
Ich suche und finde keine Zugriffsmöglichkeiten auf Blöcke. Ist das so oder bin ich blind bzw. gibt's da undokumentiertes?
Gruß
Thomas
Eigene Blöcke implementieren
am 05.09.2007 - 17:48 Uhr
Bevor Du benutzerdefinierte Blöcke aus Deinem Code 'fernsteuerst', warum implementierst Du die Blöcke dann nicht gleich in Deinem Modul? Wenn ich das richtig verstanden habe, willst Du doch sowohl den Inhalt der Blöcke als auch deren Sichtbarkeit kontrollieren. Falls Du Inhalt aus anderen Blöcken integrieren willst, kannst Du in Deinem eigenen Code auf sowas wie
$content = module_invoke($module, 'block', 'view', $delta);
zurückgreifen. Es gibt jedenfalls keine Möglichkeit den Inhalt von vorhandenen Blöcken direkt zu ändern.profix898 wrote: Bevor Du
am 05.09.2007 - 19:03 Uhr
Bevor Du benutzerdefinierte Blöcke aus Deinem Code 'fernsteuerst', warum implementierst Du die Blöcke dann nicht gleich in Deinem Modul? Wenn ich das richtig verstanden habe, willst Du doch sowohl den Inhalt der Blöcke als auch deren Sichtbarkeit kontrollieren. Falls Du Inhalt aus anderen Blöcken integrieren willst, kannst Du in Deinem eigenen Code auf sowas wie
$content = module_invoke($module, 'block', 'view', $delta);
zurückgreifen. Es gibt jedenfalls keine Möglichkeit den Inhalt von vorhandenen Blöcken direkt zu ändern.Ja, endlich sind wir dort wo ich hin will. Keine benutzerdefinierten Blöcke sondern modulimpelmentierte Blöcke. Ich hab' die Blöcke in den Modulen erstellt.
Aber -
wie manipuliere ich die Blöcke???
einblenden - ausblenden - Inhaltsänderung - Standort
über PHP-Code
das hab' ich noch nicht geschnallt!
Gruß
Thomas
hook_block
am 05.09.2007 - 19:21 Uhr
Falls Du das noch nicht getan hast, solltest Du zunächst mal http://api.drupal.org/api/function/hook_block/5 durchlesen.
Im Endeffekt implementierst Du in Deinem Modul hook_block(), was idR wie folgt aussieht:
switch ($op) {
case 'list':
$blocks['block1']['info'] = t('Block 1');
return $blocks;
case 'view':
$block['subject'] = t('Überschrift: Block 1');
$block['content'] = '<p>Der eigentlich Inhalt</p>';
return $block;
case 'configure':
case 'save':
...
}
Den Inhalt änderst Du, indem Du $block['content'] entsprechend anpasst. Für die Sichtbarkeit gibst Du einfach
return $block;
zurück (mit$block['content']
etc. gesetzt), wenn der Block sichtbar sein soll undreturn;
(leere Rückgabe, NULL oder FALSE) falls der Block ausgeblendet sein soll.Es ist nicht möglich den Ort (region) aus dem Modul-Code festzulegen. Theoretisch kannst Du natürlich die entsprechenden Einträge direkt in der DB manipulieren. Die sauberere Lösung wäre allerdings mehrere Blöcke zu implementieren, die in verschiedenen Regions sitzen können, und deren Sichtbarkeit zu kontrollieren.
Ist es das, was Du wissen wolltest? Oder hab ich was falsch verstanden?
Danke, damit kann ich
am 05.09.2007 - 20:01 Uhr
Danke, damit kann ich zumindestens mal arbeiten - sollte ich nicht damit zurechtkommen - wende ich mich vertrauensvoll wieder an euch.
Gruß
Thomas
Eventuell sind alle
am 05.09.2007 - 20:48 Uhr
Eventuell sind alle vorgeschlagenen Lösungen zu kompliziert. Deine erste Überlegung bietet den einfachsten Lösungsansatz.
Vorraussetzung dafür ist aber das Du im "PHP-Bereich des Blockes" den Zustand einer Variable abfragen kannst. Soll heißen die Variable muss an dieser Stelle verfügbar sein. Die beiden Zustände sind TRUE und FALSE.
Damit ist nur Ein- oder Ausblenden eines Blockes möglich.
-------------
quiptime
Da geht noch was.
Gut, dann noch eine Frage
am 06.09.2007 - 21:38 Uhr
Gut, dann noch eine Frage nachgeschoben -
Das ist meine Blockerstellung
function dsfdb_namen_block($op='list', $delta=0) {
include_once(drupal_get_path('module', 'dsfdb_namen') .'/dsfdb_namen.theme');
drupal_add_css(drupal_get_path('module', 'dsfdb') .'/dsfdb.css');
// listing of blocks, such as on the admin/block page
if ($op == "list") {
$block[0]["info"] = t("Alphabet");
return $block;
}
else if ($op == 'view') {
// our block content
// content variable that will be returned for display
$block_content = '';
$block_content .= "";
}
// check to see if there was any content before setting up the block
if ($block_content == '') {
// no content from a week ago, return nothing.
return;
}
// set up the block
$block['subject'] = 'Alphabetische Auswahl';
$block['content'] = $block_content;
return $block;
}
Ergibt einen Block mit einem Alphabet, aus dem man einen Buchstaben auswählen kann und damit die Sortierung bzw. Menge der angezeigten Namen beeinflusst.
Dieser Block muss natürlich für verschiedene Daten verschiedene Links ausweisen und soll auch nur zur Verfügung stehen, wenn's Sinn macht.
So - mit module_invoke kann man jetzt - soweit bin ich mal - auf den Block zugreifen und ich erhalte Subjekt und content zurück.
$content = module_invoke("dsfdb_namen", "block", 0);
In der Doku steht was von Argumenten?
Kann man mit Modul_invoke die Erstellung auch beinflussen - sprich dem Content einen Leerstring zuweisen?
Gruß
Thomas
Ich glaub' ich hab's jetzt
am 07.09.2007 - 13:33 Uhr
Ich glaub' ich hab's jetzt kapiert.
Ich werde andere Neulinge also auch daran teilhaben lassen:
Zuerst habe ich versucht die Datenbank direkt zu ändern - Erfolg negativ, weil es nur funktioniert den Status von aktiv auf deaktiviert zu setzen, anscheinend nicht umgekehrt, da Drupal dies nicht zulässt und den Versuch aus dem Code den Status auf aktiv zu setzten überschreibt (ich hab's nicht definitiv debuggt, aber das Resultat spricht für sich).
Die nicht zum Erfolg führende Funktion:
function _dsfdb_set_block($status, $delta, $weight="-11", $region="left") {
_dsfdb_db_set_active("default");
if ($status == 0) {
$sSQL =
"UPDATE blocks
SET status = '$status',
weight = '$weight',
region = '$region'
WHERE (module = 'dsfdb_namen'
AND delta = '$delta')";
db_num_rows($sSql);
return TRUE;
}
elseif ($status == 1) {
$sSQL =
"UPDATE blocks
SET status = '$status',
weight = '$weight',
region = '$region'
WHERE (module = 'dsfdb_namen'
AND delta = '$delta')";
db_num_rows($sSql);
return TRUE;
}
else {
return FALSE;
}
Dann versuchte ich's mit modules_invoke() auch kein Erfolg (ich weiss zwar noch immer nicht genau warum, aber das wird schon noch kommen).
Doch jetzt glaube ich das Ding durchschaut zu haben (?):
Man muss hook_menu dazu bringen das zu erledigen und jetzt hab' ich das so gelöst:
function dsfdb_namen_block($op='list', $delta=0) {
// listing of blocks, such as on the admin/block page
if ($op == "list") {
$block[0]["info"] = t("Alphabet");
return $block;
}
else if ($op == 'view') {
// our block content
$site = arg(1);
// content variable that will be returned for display
if ($site == "Namen_Liste") {
$block_content .= theme_dsfdb_namen_alphabet_block();
}
else {
$block_content = "";
}
}
// check to see if there was any content before setting up the block
if ($block_content == '') {
// no content, return nothing.
return;
}
// set up the block
$block['subject'] = 'Alphabetische Auswahl';
$block['content'] = $block_content;
return $block;
}
Ich hab' mit
$site=arg(1)
den Pfad abgefragt und den hook vor die Wahl gestellt, den Content für den Block zu erzeugen oder auch nicht (je nach Seite) und damit funktioniert's ganz hervorragend.Was sagen die Profis dazu? War's das oder geht's eleganter?
Gruß
Thomas
Sieht gut aus
am 07.09.2007 - 17:00 Uhr
Ich hab Deinen vorherigen Kommentar eben erst entdeckt. Sorry!
Aber Dein Ergebnis sieht gut aus. Die Funktion
arg()
ist genau für solche Fälle gedacht, wo man Pfad-abhängige Verzweigungen benötigt. Nach Deiner obigen Beschreibung hätte ich es auch etwas so gemacht. Du könntest den Code allerdings noch etwas vereinfachen und damit übersichtlicher machen, z.B.<?php
function dsfdb_namen_block($op = 'list', $delta = 0) {
if ($op == 'list') {
$block[0]['info'] = t('Alphabet');
}
else if ($op == 'view') {
if (arg(1) == 'Namen_Liste') {
$block['subject'] = 'Alphabetische Auswahl';
$block['content'] = theme_dsfdb_namen_alphabet_block();
}
}
return $block;
}
?>
Es gibt natürlich viele Möglichkeiten, wie Du das genau implementieren kannst, aber Du solltest ajF auf Lesbarkeit achten. Dadurch lassen sich einfache Logik-Fehler von vornerein vermeiden/reduzieren und die spätere Fehlersuche/Erweiterbarkeit wird einfacher.
Statt
arg(1) == 'Namen_Liste'
wäre es außerdem besser, z.B.strtolower(arg(1)) == 'namen_liste'
oderswitch(strtolower(arg(1)) {}
zu verwenden, damit Du unabhängig von der Gross/Kleinschreibung der URL bist. Überlicherweise schreibt man da eh alles klein ...profix898 wrote: Statt
am 07.09.2007 - 21:08 Uhr
Statt
arg(1) == 'Namen_Liste'
wäre es außerdem besser, z.B.strtolower(arg(1)) == 'namen_liste'
oderswitch(strtolower(arg(1)) {}
zu verwenden, damit Du unabhängig von der Gross/Kleinschreibung der URL bist. Überlicherweise schreibt man da eh alles klein ...Stimmt, gefällt mir auch besser (da muss ich wohl noch dran arbeiten).
Danke
Gruß
Thomas