Riesen Code für Mini Funktion ... Was anderes statt IF - Else ?

Valayar

Grünschnabel
Hi,

erstmal Hallo an Alle. Ich bin seit einiger Zeit hier im Forum unterwegs um mir Tipps
und Tricks zu suchen. Ich habe gerade erst angefangen PHP zu lernen und versuche
nun auch endlich mein erstes eigenes Skript.
Nun hab ich folgendes Problem, ich habe ein Formular mit 3 Checkboxen,
jede der Checkboxen steht für ein Bild, welches auf der 2ten Seite nur angezeigt
werden soll wenn die Checkbox aktiv ist. Das alles klappt eigentlich wunderbar,
allerdings hab ich für 3 Bilder schon einen riesigen Code und ich würde gerne ein
paar Tipps bei euch einholen wie ich das besser/anders machen kann. Da dort
noch viele viele viele Bilder hinzukommen mit eigenen Checkboxen würde der Code
einfach nur gigantisch werden. Egal genug gelabert ich schreib mal meinen Code hier
rein:

Das Formular:
Code:
<form action="recruitment.php" method="POST">
    <table border='1' border-color='red'>
	<tr style="border: 2 solid blue">
		<td><b>Klasse</b></td><td colspan='3'><center><b>Skillung</center></b></td>
		<tr>
		<td rowspan='2'><b>Paladin</b></td>
    <td><img src='img/pala_holy.png' alt='Holy Paladin'></td>
    <td><img src='img/pala_protection.png' alt="Protection Paladin"></td>
    <td><img src='img/pala_retri.png' alt='Retribution Paladin'></td>
		<tr>
        <td><input type="checkbox" name="Pala_Holy" value="$Pala_Holy"  /></td>
        <td><input type="checkbox" name="Pala_Prot" value="$Pala_Prot"></td>
        <td><input type="checkbox" name="Pala_Retri" value="$Pala_Retri"></td>
    </tr> 
...

So, hier dann die Datei wo es ausgegeben wird mit dem dazugehörigen PHP Code:
Code:
<?
$Pala_Holy = false;
$Pala_Prot = false;
$Pala_Retri = false;
?>

<?php
if (isset($_POST['Pala_Holy'])) {
    $Pala_Holy = true;
}
else { $Pala_Holy = false;}
?>
<?php
if (isset($_POST['Pala_Prot'])) {
    $Pala_Prot = true;
}
else { $Pala_Prot = false;}
?>
<?php
if (isset($_POST['Pala_Retri'])) {
    $Pala_Retri = true;
}
else { $Pala_Retri = false;}
?>

<table border='1' border-color='red'>
	<tr style="border: 2 solid blue">
		<td><b>Klasse</b></td><td colspan='3'><center><b>Skillung</center></b></td></tr>
		<tr>
		<td>Paladin</td>
		<td colspan='3' width='150px'>
	<center>&nbsp;	<?
if ($Pala_Holy == true) {
echo "<img src='img/pala_holy.png' alt='Holy Paladin'>";
} else {
echo ""; }
?>
<?
if ($Pala_Prot == true) {
echo "<img src='img/pala_protection.png' alt='Protection Paladin'>";
} else {
echo ""; }
?>&nbsp;
<?
if ($Pala_Retri == true) {
echo "<img src='img/pala_retri.png' alt='Retri Pala'>";
} else {
echo ""; }
?></center></td>
		</tr>


Also bitte nicht lachen falls es wirklich zu Umständlich oder schlecht ist,
ich bin gerade am Anfang PHP zu lernen :)

Ich danke euch schonmal für eure Hilfe

Gruß
Vala
 
Ja, dein Code ist wirklich umständlich.

Ich würde mir am Besten Arrays mit den Dateinamen anlegen:
PHP:
$Images = array("Pala_Holy"=>"img/pala_holy.png"
                       /* weitere */);
foreach ($_POST as $PostVar)
{
  if (isset($Images[$PostVar]))
    echo "<img src='".$Images[$PostVar]."' />";
}
Eigentlich könnte man noch prüfen, ob die POST-Variable mit Pala_ anfängt.
Suche mal nach [phpf]substr[/phpf]
 
Das ging ja schnell :)
Danke für die Antwort, ich werde gleich mal versuchen das in die Tat
umzusetzen. Dachte mir schon das es so nicht richtig sein kann, weil
das ja endviel Code wird. Aber es hat funktioniert, und ich hatte mein
erstes kleines Erfolgserlebnis :P Ich bleib dran und versuch mich dann
an Arrays.
Besten Dank nochmal


*DankeKlick*
 
Du kannst auch die IF-Bedingungen weglassen, wenn du sie umänderst.

Bisher:
PHP:
$Pala_Holy = false;
// ...
if (isset($_POST['Pala_Holy'])) {
    $Pala_Holy = true;
}
else { $Pala_Holy = false;}
Besser:
PHP:
$Pala_Holy = isset($_POST['Pala_Holy']);
 
Hallo,

ich würde dann sogar noch einen Schritt weiter gehen: Wenn man den Bildern aussagekräftige Namen gibt, kann man diese auch gleich z.B. für das ALT-Attribut verwenden. Sofern keine Notwendigkeit besteht, die Bilder in unterschiedliche Ordner zu packen, kann man alle in einen Ordner legen und z.B. mittels dir() und read() alle Namen in ein Array einlesen, in einer for-Schleife die Checkboxen bilden und ihnen den Namen der Bilder zuordnen.
So wäre man am Ende in der Lage, eine "unendlich" große Galerie mit vielleicht 30-40 Zeilen Code zu schreiben, die dynamisch alleine dadurch erweitert wird, in dem man Bilder einfach in den Ordner packt.

Greetz
cw

Beispiel (für die, die's evtl. interessiert) Hier werden Bilder aus einem Ordner mit thumbs (kleinere Vorschaubilder), gekennzeichnet durch den "_", eingelesen (der Ordner mit den "großen" Bildern hat den gleichen Namen nur ohne den "_", die Bildnamen sind identisch). Im Orginal habe ich bei mir noch ein javascript, dass mir bei Bedarf auf Klick entweder die Bilder einzeln oder als Diashow anzeigt.. und natürlich die notwendigen Formatierungen in den css):
PHP:
$arr_singlepics=array();
$ordner="/images/pics";
// Bild-Verzeichnis einlesesn
if(is_dir($ordner."_")) {
	$d = dir($ordner."_");
	while (false !== ($entry = $d->read())) {
		if($entry != "." && $entry!= "..") {
				$arr_singlepics[]=$entry;									
		}
	}
	$d->close();
	foreach($arr_singlepics as $picname) {
		echo '<div class="singlepic">';
		echo '<a href="'.$ordner.'/'.$picname.'"><img src="'.$ordner.'_/'.$picname.'" border="0"></a>';
		echo '</div>';
	}
}

Jetzt noch das Bilder-Array verwenden, um in einer for-Schleife die passenden Checkboxen zu generieren.... das wär's.
 
Zuletzt bearbeitet:
Ich hab das Ganze nun mal mit den Arrays umgesetzt und bin auf jeden
Fall auf viel weniger Code gekommen. Ich wette ihr würdet es noch mit
weniger schaffen aber für mich ist das nen Riesenerfolg *g*

Habs jetzt so:
Code:
<?
$Pala_Images = array("Pala_Holy"=>"img/pala_holy.png",
                     "Pala_Prot"=>"img/pala_protection.png",
                     "Pala_Retri"=>"img/pala_retri.png");
$Warri_Images = array("Warri_Arms"=>"img/warrior_arms.png",
                      "Warri_Fury"=>"img/warrior_fury.png",
                      "Warri_Prot"=>"img/warrior_protection.png");             
$Druid_Images = array("Druid_Balance"=>"img/druid_balance.png",
                      "Druid_Feral"=>"img/druid_feral.png",
                      "Druid_Resto"=>"img/druid_resto.png");  
$Warlock_Images = array("Warlock_Affli"=>"img/warlock_affli.png",
                        "Warlock_Demo"=>"img/warlock_demo.png",
                        "Warlock_Destro"=>"img/warlock_destro.png");
$Shami_Images = array("Shami_Ele"=>"img/shaman_ele.png",
                        "Shami_Enh"=>"img/shaman_enhancement.png",
                        "Shami_Resto"=>"img/shaman_resto.png"); 
$Hunter_Images = array("Hunter_Beast"=>"img/hunter_beast.png",
                        "Hunter_Marksman"=>"img/hunter_marksman.png",
                        "Hunter_Survival"=>"img/hunter_survival.png");  
$Dk_Images = array("Dk_Blood"=>"img/dk_blood.png",
                   "Dk_Frost"=>"img/dk_frost.png",
                   "Dk_Unholy"=>"img/dk_unholy.png");
$Mage_Images = array("Mage_Arcan"=>"img/mage_arcan.png",
                     "Mage_Fire"=>"img/mage_fire.png",
                     "Mage_Frost"=>"img/mage_frost.png");
$Mage_Images = array("Mage_Arcan"=>"img/mage_arcan.png",
                     "Mage_Fire"=>"img/mage_fire.png",
                     "Mage_Frost"=>"img/mage_frost.png");                     
$Rouge_Images = array("Rouge_Assa"=>"img/rouge_assassination.png",
                     "Rouge_Combat"=>"img/rouge_combat.png",
                     "Rouge_Sub"=>"img/rouge_subtlety.png");                     
                   ?>


und dann halt für jedes Image Arrys:
<?
foreach ($_POST as $PostVar)
{
if (isset($Warri_Images[$PostVar]))
echo "<img src='".$Warri_Images[$PostVar]."' />";
}
?>


Mein nächster Schritt ist dann wie ich das in eine Datenbank packe
damit die Aktualisierung auch erhalten bleibt :)

Danke an euch alle nochmal, war echt nett. :)
 
Ich wette ihr würdet es noch mit
weniger schaffen aber für mich ist das nen Riesenerfolg *g*
Ja das glaube ich dir. Glückwunsch :D
Aber mit deiner Vermutung hast du Recht. Ich würde die Arrays noch zusammenfügen:
PHP:
$AllImages = array_merge($Pala_Images, $Warri_Images, $Druid_Images, $Warlock_Images, $Hunter_Images, $Dk_Images, $Mage_Images, $Rouge_Images);
Und dann noch:
PHP:
foreach ($_POST as $PostVar)
{
  if (isset($AllImages[$PostVar]))
    echo "<img src='".$AllImages[$PostVar]."' />";
}
Dann brauchst du nicht für jedes einzelne Array eine Prüfung zu durchlaufen.
Übrigens hast du das Array $Mage_Images doppelt.

PS: Man kann PHP-Code mit dem BB-Code [code=php]Code[/code] highlighten.
 
Zurück