Rolf B: foreach anpassen

Beitrag lesen

Hallo Bernd,

Hinweis vorweg: ich habe vor 2 Stunden angefangen zu schreiben und war zwischendurch weg, daher wusste ich nicht was zwischendurch gelaufen ist.

Dem Vorschlag von RR kann ich mich nur anschließen - Trennen von Code und HTML macht alles viel lesbarer. Ein Minimum könnte darin bestehen, die Erzeugung des option-Elements auszulagern, eine Erweiterung wäre eine Art „select Widget“, also eine Funktion, die das komplette <select>...</select erzeugt und die nötigen Daten dafür bekommt. Aber das würde zu weit führen...

Fachlich sprechende Variablennamen sind ebenfalls sinnvoll. $option statt $array zum Beispiel. Die as Variable einer foreach Schleife kann man dagegen schon mal kurz benennen - sofern die Schleife kurz und übersichtlich ist. Auf Grund der frühen Zeilenumbrüche des neuen Forums habe ich meinen Code stärker umgebrochen als sonst.

$projektstatusliste = liesProjektstatusListe($mysqli);

erzeugeProjektstatusOption([ "code" => "",
                             "value" => "-- Bitte wählen --" ]);

foreach ($statusliste as $ps)
{
   if (istProjektstatusSichtbar($ps, $erlaubeBestellung))
   {
      erzeugeProjektstatusOption($ps, $status);
   }
}

// Dies kommt in die Funktionensammlung
// Hauptzweck der Funktion ist, das Kuddelmuddel zur Erzeugung 
// des option Elements aus der Fachlogik herauszuhalten.

function erzeugeProjektstatusOption(
        $projektstatus,
        $aktuellerCode = null
)
{
   // Temp-Variablen zur besseren Übersicht.
   // Mutige Coder machen es direkt und bekommen eine
   // Monsterzeile...
   $val = htmlspecialchars($projektstatus['code']);
   $sel = $projektstatus['code'] == $aktuellerCode 
            ? "selected" 
            : "";
   $text = htmlspecialchars($projektstatus['titel']);
?>
   <option value="<?=$val?>" <?=$sel?>><?=$text?></option>
<?php
}

function istProjektstatusSichtbar(
      $projektstatus,
      $erlaubeBestellung
)
{
   if ($erlaubeBestellung == 1)
      return true;

   // Darzustellende Codes bei $erlaubeBestellung != 1
   return ($projektstatus['code'] == 1 
        || $projektstatus['code'] == 3 
        || $projektstatus['code'] == 9);
}

Deine Ausgabeschleife ist damit viel übersichtlicher geworden. Und in der istProjektstatusSichtbar Funktion kannst Du nun übersichtlich die Abfrage einbauen, ob ein bestimmter Code anzuzeigen ist oder nicht.

Was auch bei der Übersicht hilft, ist <?= ... ?> statt <?php echo ...; ?>. Sage ich Dir sicher nicht zum ersten Mal ;)

Die Variable $erlaubeBestellung macht mir noch Bauchweh. Zum einen frage ich mich, warum sie die Werte 1 und 2 enthält. Gibt's noch mehr Werte? Wenn nein - verwende TRUE statt 1 und FALSE statt 2. Ich würde sie auch lieber $bestellungErlaubt nennen (was aber meine Einzelmeinung sein dürfte). Mein Code oben wäre dann entsprechend anzupassen...

Und ich frage mich, ob die Information, dass ein bestimmter Code bei $bestellungErlaubt == FALSE zu verbergen ist, nicht in die Datenbank gehört. Das ist ja eine Eigenschaft eines bestimmten Codes, dass er nur bei erlaubter Bestellung zulässig ist. Das könnte man zu einer Spalte der Tabelle machen, und in istProjektstatusSichtbar diese Spalte überprüfen, wenn Bestellungen nicht erlaubt sind.

Nimm Dir davon, was Du brauchen kannst.

Rolf

--
sumpsi - posui - clusi