Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Block über PHP ausblenden

Eingetragen von t.sebesta (72)
am 05.09.2007 - 14:02 Uhr in
  • Allgemeines zu Drupal
  • Drupal 5.x

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

‹ Wie erstelle ich ein Menü wie das Navigationsmenü? Verwaltungs-Navigation wird nicht angezeigt nach dem Anmelden ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Wo willst du denn den PHP

Eingetragen von rapsli (1500)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich will einen Block einfach

Eingetragen von t.sebesta (72)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

ich denke da gibt es viele

Eingetragen von dawehner (2639)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du könntest auch pro Block

Eingetragen von rapsli (1500)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke dereine, aber wirklich

Eingetragen von t.sebesta (72)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Eigene Blöcke implementieren

Eingetragen von profix898 (140)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

profix898 wrote: Bevor Du

Eingetragen von t.sebesta (72)
am 05.09.2007 - 19:03 Uhr
profix898 schrieb

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

hook_block

Eingetragen von profix898 (140)
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 und return; (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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke, damit kann ich

Eingetragen von t.sebesta (72)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Eventuell sind alle

Eingetragen von quiptime (4972)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Gut, dann noch eine Frage

Eingetragen von t.sebesta (72)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich glaub' ich hab's jetzt

Eingetragen von t.sebesta (72)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Sieht gut aus

Eingetragen von profix898 (140)
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' oder switch(strtolower(arg(1)) {} zu verwenden, damit Du unabhängig von der Gross/Kleinschreibung der URL bist. Überlicherweise schreibt man da eh alles klein ...

  • Anmelden oder Registrieren um Kommentare zu schreiben

profix898 wrote: Statt

Eingetragen von t.sebesta (72)
am 07.09.2007 - 21:08 Uhr
profix898 schrieb

Statt arg(1) == 'Namen_Liste' wäre es außerdem besser, z.B. strtolower(arg(1)) == 'namen_liste' oder switch(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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 5 Tagen
  • Hey danke
    vor 1 Woche 5 Tagen
  • Update: jetzt gibt's ein
    vor 1 Woche 6 Tagen
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 4 Tagen
  • Da scheint die Terminologie
    vor 2 Wochen 4 Tagen
  • Kannst doch auch alles direkt
    vor 3 Wochen 1 Tag
  • In der entsprechenden View
    vor 3 Wochen 1 Tag
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 1 Tag
  • gelöst
    vor 5 Wochen 4 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 5 Wochen 5 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20452

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 23 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association