Výběrový seznam

Školení, která pořádám

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";
?>
Jakub Vrána, Řešení problému, 17.4.2006, diskuse: 4 (nové: 0)

Diskuse

ikona 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]))?

ikona Jakub Vrána OpenID:

in_array() hledá v hodnotách, isset() v klíčích.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.