Menschelei: HTML in PHP / PHP in HTML
Naps
- php
Hi,
jedes mal wenn ich vor dem "Problem" stehe, bin ich mit dem Ergebnis nicht wirklich zufrieden.
Um ein ganz kleines Beispiel zu nennen:
<select>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
Wenn ich die selektierte Option anzeigen will:
<select>
<option value="1" <?php echo ($option == 1) ? 'selected': '';?>>1</option>
<option value="2" <?php echo ($option == 2) ? 'selected': '';?>>2</option>
<option value="3" <?php echo ($option == 3) ? 'selected': '';?>>3</option>
<option value="4" <?php echo ($option == 4) ? 'selected': '';?>>4</option>
<option value="5" <?php echo ($option == 5) ? 'selected': '';?>>5</option>
</select>
Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?
MfG Naps
Hallo,
Wie kann man so etwas anders umsetzen?
Befasse dich mit Schleifen.
Gruß
Kalk
Hello,
jedes mal wenn ich vor dem "Problem" stehe, bin ich mit dem Ergebnis nicht wirklich zufrieden.
Um ein ganz kleines Beispiel zu nennen:
<select>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
>
> Wenn ich die selektierte Option anzeigen will:
>
> ~~~html
<select>
> <option value="1" <?php echo ($option == 1) ? 'selected': '';?>>1</option>
> <option value="2" <?php echo ($option == 2) ? 'selected': '';?>>2</option>
> <option value="3" <?php echo ($option == 3) ? 'selected': '';?>>3</option>
> <option value="4" <?php echo ($option == 4) ? 'selected': '';?>>4</option>
> <option value="5" <?php echo ($option == 5) ? 'selected': '';?>>5</option>
> </select>
Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?
Kannst ja mal in meiner Vergangenheit kramem.
http://forum.de.selfhtml.org/archiv/2007/4/t150060/#m974901
Da gab es Funktionen mit Durchgriff bis auf die Datenbank.
Ist auch nicht hübsch, aber vielleicht regt es Dich noch zum neuen Nachdenken an?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo!
Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?
$selected = 5;
$html = '';
for ($i = 1; $i <= 5; $i++) {
$html .= '<option value="' . $i . '"' . ($i == $selected ? ' selected' : '') . '>' . $i . "</option>\n";
}
echo $html;
Disclaimer: Ich kann kein PHP. Ungetesteter beispielhafter Code.
Mit Templating-Sprachen, die das Notieren von Wiederholungen vereinfachen. Sie sorgen auch für das korrekte Escaping von Werten. Ist nicht so hässlich wie das händische Zusammenbauen von Strings (siehe oben).
Mit objektorientierter Programmierung. Mit Formular-Widget-Klassen, die eine Datenstruktur entgegennehmen und das entsprechende HTML rendern. PHP-Webframeworks bringen sowas mit sich.
Grüße
Mathias
- Indem man sich nicht wiederholt (Don’t repeat yourself – DRY)
Und das wiederholts du gleich auf 3 Sprachen/Schreibweisen? :D
Hi,
- Indem man sich nicht wiederholt (Don’t repeat yourself – DRY)
Und das wiederholts du gleich auf 3 Sprachen/Schreibweisen? :D
Hat es bestimmte Gründe, daß Du die Zitatzeichen kaputtmachst? (ist mir auch schon in anderen Posts von Dir aufgefallen ...)
cu,
Andreas
- Indem man sich nicht wiederholt (Don’t repeat yourself – DRY)
Und das wiederholts du gleich auf 3 Sprachen/Schreibweisen? :D
Hat es bestimmte Gründe, daß Du die Zitatzeichen kaputtmachst? (ist mir auch schon in anderen Posts von Dir aufgefallen ...)
Nein, jetzt wo du es sagst:
ich hatte einige Beiträge ohne /my/ verfasst, dann kopiert, mich angemeldet und wieder eingefügt.
Für nicht angemeldete Benutzer ist das Zitatzeichen scheinbar > während mein persönliches »» ist.
Liebe(r) Naps,
in meinen Projekten stehen solche Dinge nicht in einer Template-Datei, sondern werden per Schleife eingefügt. Dazu nutze ich in der Regel diesen Ansatz:
<form ...>
<p>
<select name="Schluessel">
</select>
</p>
...
</form>
Der obige HTML-Code steht in einer HTML-Datei, welche als Vorlage geladen wird. Die <option>-Elemente werden nun in einer Schleife erzeugt und eingebunden:
$html = file_get_contents('./meine/template/datei.html');
$options = '';
foreach ($meine_daten as $key => $value) {
$options .= sprintf(
"\t\t\t".'<option value="%1$s">%2$s</option>'."\r\n",
htmlspecialchars($key),
htmlspecialchars($value)
);
}
$html = preg_replace(
'~(?is)(<select[^>]*name="Schluessel"[^>]*>[\r\n]*)~',
'$1'.$options,
$html
);
Hilft Dir das als Anregung weiter?
Liebe Grüße,
Felix Riesterer.
in meinen Projekten stehen solche Dinge nicht in einer Template-Datei, sondern werden per Schleife eingefügt. Dazu nutze ich in der Regel diesen Ansatz:
<form ...>
<p>
<select name="Schluessel">
</select>
</p>
...
</form>
>
> Der obige HTML-Code steht in einer HTML-Datei, welche als Vorlage geladen wird. Die <option>-Elemente werden nun in einer Schleife erzeugt und eingebunden:
>
> ~~~php
$html = file_get_contents('./meine/template/datei.html');
>
> $options = '';
>
> foreach ($meine_daten as $key => $value) {
> $options .= sprintf(
> "\t\t\t".'<option value="%1$s">%2$s</option>'."\r\n",
> htmlspecialchars($key),
> htmlspecialchars($value)
> );
> }
>
> $html = preg_replace(
> '~(?is)(<select[^>]*name="Schluessel"[^>]*>[\r\n]*)~',
> '$1'.$options,
> $html
> );
Hilft Dir das als Anregung weiter?
Ja das war eigentlich genau das, was ich meinte.
Aber würdest du das so auch bei größeren / komplexeren Sachen verwenden?
Ich habe schon oft versucht, zu erfahren wie andere das machen aber bekomme von den meisten einfach nur die Antwort "verwende eine Template-Engine".
Wenn ich das ganze jetzt komplett objektorientiert angehe, und eine Klasse verwende, die mir das Formular erstellt, schaut es nachher meistens noch "hässlicher". Bei 0815 Formularen lasse ich mir das einreden, aber wenn das Formular etwas komplexer aufgebaut ist habe ich noch nie eine Klasse gesehen die das vernünftig lösen kann.
MfG Naps
Hallo,
Ich habe schon oft versucht, zu erfahren wie andere das machen aber bekomme von den meisten einfach nur die Antwort "verwende eine Template-Engine".
Und was ist an der Antwort schlecht?
Wenn ich das ganze jetzt komplett objektorientiert angehe, und eine Klasse verwende, die mir das Formular erstellt, schaut es nachher meistens noch "hässlicher". Bei 0815 Formularen lasse ich mir das einreden, aber wenn das Formular etwas komplexer aufgebaut ist habe ich noch nie eine Klasse gesehen die das vernünftig lösen kann.
Hässlichen Low-Level-Code, der HTML-Code durch Stringverkettung zusammenbaut, in eine Klasse zu packen macht ihn nicht schöner. Das ist nicht Sinn der Sache. Der Sinn ist Abstraktion.
HTML programmatisch zusammenzubauen ist nie schön. Webframeworks bringen grundlegende Helfer mit, damit diese Klassen möglichst lesbar sind. Sie arbeiten nicht direkt auf Stringebene, sondern auf Element- und Attributebene oder sogar auf DOM-Ebene. Dadurch werden die Logiken nicht simpler, aber der Code sauberer. Durch die Separation of Concerns hat man z.B. nicht ständig mit dem Escapen von Daten zu tun. Das passiert automatisch auf einer Ebene darunter.
Einige Templating-Sprachen sind XML-basiert und somit ggf. durch XSL transformierbar. Sie erlauben es, Markup deklarativ zu erzeugen und andere Komponenten mit einfachen Elementen einzubinden. Über Expressions werden die Daten eingebunden.
Mathias
Mahlzeit,
Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?
Wenn es eine grössere Anwendung ist, solltest du dir mal ne Template-Engine wie Smarty ansehen.