Výběrový seznam
V HTML formulářích často potřebujeme vytvořit položky značky <select>
a některou z nich označit. Ať jsou položky konstantní nebo dynamické z číselníku, určitě se pro jejich výpis vyplatí vytvořit funkci:
<?php /** Převod pole na HTML volby * @param array pole, ze kterých budou vytvořeny volby * @param array skalární hodnota nebo pole s označenými prvky * @param bool zajistí, že <option> nebudou obsahovat atribut value * @return string řetězec s HTML volbami * @copyright Jakub Vrána, https://php.vrana.cz/ */ function optionlist($options, $selected = array(), $not_values = false) { $return = ""; if (!is_array($selected)) { $selected = array($selected); } foreach ($options as $key => $val) { $checked = in_array(($not_values ? $val : $key), $selected); $return .= '<option' . ($not_values ? '' : ' value="' . htmlspecialchars($key) . '"') . ($checked ? ' selected="selected"' : '') . '>' . htmlspecialchars($val) . "</option>"; } return $return; } ?>
Místo jedné vybrané položky je možné funkci předat pole všech vybraných, což se hodí pro <select multiple>
. Funkci trochu komplikuje parametr $not_values
, který zajistí, že klíče pole se budou ignorovat. To jednak zmenší výsledný HTML kód a jednak umožňuje snadno předávat např. pole range(1, 12)
.
Pokud se ve výběrovém seznamu má použít číselník z databáze, dá se tato funkce dobře zkombinovat s funkcí mysql_get_vals
:
<?php $skupiny = mysql_get_vals("SELECT id, nazev FROM skupiny ORDER BY nazev"); $vybrano = mysql_get_vals("SELECT skupina, skupina FROM vyrobky_skupiny WHERE vyrobek = " . intval($_GET["select"])); echo "<select name='skupiny[]' multiple='multiple'>" . optionlist($skupiny, $vybrano) . "</select>\n"; ?>
Diskuse
MiSHAK:
Zařadil bych tento článek i do výuky, protože hodně lidí zapomíná ( ve skriptech ), že select může mít i více vybraných hodnot :-)
Když už odřádkovat ( "\n" ), tak i obsah ( option ) selectu...
BTW: not_values je trošku matoucí, spíše by se hodilo use_values... ale to je IMHO jen můj názor.
<?php
> ..., $selected = array(), ...
>if (!is_array($selected)) {
> $selected = array($selected);
> }
?>
Pěkná zkratka :-)

JKa:
Jen poznámka na okraj, IMHO konstrukci:<?php
if(!is_array($selected)) {
$selected = array($selected);
}
?>
... lze napsat i takto:
<?php
$selected = (array) $selected;
?>
vojta:
Ahoj, nešlo by to ještě trochu zrychlit?Místo IF (in_array(($not_values ? $val : $key))
Použít IF (isset ($selected [$not_values ? $val : $key]))?
Jakub Vrána
:
in_array() hledá v hodnotách, isset() v klíčích.


Diskuse je zrušena z důvodu spamu.

