Rolf B: DropDown Menüs und Datenbank - Aufruf-Problem

Beitrag lesen

Hallo Darßfreund,

ich habe ein weiteres Mal editiert.

  • Einrückungen an die logische Struktur angepasst
  • Zeilen mit mehreren Statements auf mehrere Zeilen verteilt

Zeilenumbrüche kosten nichts. Du musst nicht damit sparen.

Was hingegen kostet, sind dein umständliches Zusammenbauen von HTML mittels echo. Dazu gleich mehr.

Angesichts des Seiteninhalts sieht es so aus, als wäre dieser Seite nicht öffentlich zugänglich. Deshalb frage ich nicht nach einem Link darauf. Normalerweise fordern wir sowas ein.

Es sieht aber so aus, als würdest Du in einer Schleife (für die die schließende Klammer fehlt) mehrere Abschnitte generieren. Jeder Abschnitt enthält einen Dropdown-Button und eine Liste von Links, die sich damit öffnen lässt.

Ursache ist, dass Du diese Liste über ihre ID suchst. Abgesehen davon, dass IDs in einem Dokument eindeutig sein müssen, findest Du auf diese Weise immer nur die erste dieser IDs.

Ich könnte Dir jetzt Script geben, mit dem Du das mit etwas Navigieren im DOM lösen kannst, aber es geht viel einfacher: das "Disclosure-Widget" <details>, das von allen aktuellen Browsern unterstützt wird. Nicht vom IE, aber den braucht heute keiner mehr.

<details>
   <summary>Dropdown-Button</summary>
   <a href="...">Eintrag 1</a>
   <a href="...">Eintrag 2</a>
   <a href="...">Eintrag 3</a>
</details>

Das Summary-Element kannst Du mit CSS nach deinem Wunsch gestalten. Klickst Du darauf, öffnet sich die Liste. Klickst Du nochmal drauf, schließt sie sich.

Die Links sind eine Liste. Es könnte richtig sein, sie auch als Liste ins HTML zu stellen.

Wenn Du weiterhin das Feature möchtest, dass sich bei einem Klick ins Nirvana alle Dropdowns schließen, dann ändere den diesbezüglichen Scriptteil so, dass Du allen details-Elementen das open-Attribut wegnimmst (mit removeAttribute).

Derzeit ist es aber auch so, dass ein Klick auf einen dieser Links alle Dropdowns schließt. Ist das ok für Dich?

Achso - dieses Feature ist unvollständig. Du musst auch einen keydown-Handler registrieren und bspw. die Esc-Taste abfragen, damit man die Dropdowns auch per Tastatur schließen kann.

Eine Frage zu $inhalt->ausgetragen="kran" - das klingt nach "krank". Ist es richtig, dass Du dem p Element dann die Klasse "ausgetragen" gibst?

Deine Echo-Flut kannst Du auf zwei Wegen bekämpfen.

(1) Stringinterpolation (in PHP Parsing genannt) (2) PHP-Kontext verlassen.

Stringinterpolation:

echo "<div class=\"box\"><h2><a href=\"austragungsportal.php?klausw="; 
echo $stuf;
echo "a#1\">Klasse ";
echo $stuf;
echo "a</a></h2>";

Einfacher:

echo "<div class='box'><h2><a href='austragungsportal.php?klausw={$stuf}a#1'>Klasse {$stuf}a</a></h2>

Ein String in doppelten Anführungszeichen wird automatisch nach Variablen durchsucht. echo "Klasse $stuf" würde bereits funktionieren, aber Du willst ja noch ein a dahinter setzen. Deswegen muss das $stuf in geschweifte Klammern, damit PHP weiß, wo der Variablenname aufhört (siehe PHP Handbuch, Parsing von Variablen, „komplexe“ Syntax).

Das geht auch bei der Abfrage auf die Stufe: Hast Du da bereits dein Glück mit Stringparsing versucht, aber wusstet nicht, wie man $stuf von a trennt? Aber weil Du ja ständig $stuf mit a verbindest, könnte man auch erstmal eine Variable $aStufe oder so erzeugen und darin $stuf."a" ablegen.

Das Escapen von Anführungszeichen ersparst Du Dir, indem Du für's HTML die einfachen Anführungszeichen verwendest.

Alternative 2: PHP Kontext verlassen

Das ist für mehrzeiliges HTML interessant. Hinter dem Erzeugen des p Elements erzeugst Du 3 Links und dann das "Dropdown". Man kann einfach mit ?> den PHP Kontext verlassen, HTML raushauen und danach mit <?php wieder in PHP einsteigen. Aus Sicht von PHP ist das wie ein fetter ECHO. Heißt: Man kann das auch innerhalb von PHP Blöcken tun (also Zeugs, das mit { und } eingeschlossen ist).

PHP-Werte, die in einen solchen Bereich eingetragen werden sollen, fügt man mit dem Expression-Tag <?= ... ?> ein. Für ... setzt Du den gewünschten Wert ein, den Du bisher mit echo ausgegeben hast. Leerzeichen innerhalb des Expression-Tags werden wie in normalem PHP Code ignoriert.

if ($inhalt->klasse == "$stuf"."a") {
   ...
   ...
?>
  <a href="?aktion=anfragen&ID=<?= $inhalt->ID ?>&klausw=<?= $klausw ?>#1">
    <button class="angefragt">Ange</button>
  </a>
  <a href="?aktion=finden&ID=<?= $inhalt->ID ?>&klausw=<?= $klausw ?>#1">
    <button class="gefunden">Gefu</button>
  </a>
  <a href="?aktion=austragen&ID=<?= $inhalt->ID ?>&klausw=<?= $klausw ?>#1">
    <button class="ausgetragen">Aust</button>
  </a>

  <details>
     <summary>Einträge</summary>
     ...
  </details>
<?php
}  /* ende von $if ($inhalt->klasse ...) */
...

Weil geschweifte Klammern bei solchen Konstrukten gerne mal übersehen werden, bietet PHP hier die alternative Syntax für Blockstrukturen an.

Statt

if (...bedingung...) {
   ...code...
}

kann man

if (...bedingung...):
   ...code...
endif;

schreiben.

Eine Frage noch: dass dieses #1, das Du an die diversen Links anhängst, nicht an den Server geht, sondern vom Browser verwendet wird, um in der verlinkten Seite auf das Element mit id="1" zu positionieren, weißt Du?

Rolf

--
sumpsi - posui - obstruxi