jak obejít stav „out of range“ v AddSelect
- jik
- Člen | 149
Zdravím,
mám data zobrazované ve formuláři roletou (typu Select), která mohou
nabývat určité množiny hodnot. Jednotliví uživatelé přitom mohou
nastavit (podle svých práv) pouze určitou podmnožinu a nemohou odeslat
formulář s jinou hodnotou. Ovšem mohou načíst položky, které jinou
hodnotu mají – ale v takovém případě lze odeslat hodnoty pouze
z povoleného rozsahu. Nette 2.1 ale kontroluje, jestli je hodnota
v přípustném rozsahu hodnot, tedy pokud do formuláře přijde hodnota mimo
rozsah povolený uživateli, ohlásí chybu. Nechci ostatní hodnoty doplňovat
do tohoto pole, protože bych musel zase řešit filtrování na výstupu
z formuláře.
Nejjednodušším řešením by bylo nekontrolovat ve formuláři položku na
rozsah hodnot – ale nevím jak – lze nějak ty kontroly vypnout?
V jakémkoliv jiném případě kolem toho musím vystavět dost velikou
konstrukci, která v zásadě udělá to samé.
- Jan Tvrdík
- Nette guru | 2595
Od verze 2.1 lze pro tyhle případy použít
$form->getHttpData($form::DATA_LINE, 'selectBoxName')
.
- marek-m
- Člen | 66
Tato funkcionalita aj mne znacne komplikuje zivot, nieje neako mozne obyst tuto vlastnost, alebo resp. nieje mozne zmenit funkcionalitu choicecontrol na to, ze ak neexistuje hodnota v selecte, tak nech nenastavuje setValue? Ide mi o to, aby formular, resp. naplnanie dat pokracovalo dalej. Vynimka ma totalne zabija, napr. pri prevode starych aplikacii a pod…, pricom naozaj staci len nenastavit hodnotu.
- Tanadche
- Člen | 11
Můžeš si zdědit SelectBox a upravit v něm funkci setValue
(pokud nechceš, aby se kontrolovalo, jestli se zvolený prvek vyskytuje v poli
možností, tak si uprav ještě getValue
).
Pokud používáš Nette 2.1 a vyšší tak to budeš používat takhle:
$form['select'] = new MySelect('Select bez výjimky', $items);
- Jan Endel
- Člen | 1016
Tanadche napsal(a):
Můžeš si zdědit SelectBox a upravit v něm funkci
setValue
(pokud nechceš, aby se kontrolovalo, jestli se zvolený prvek vyskytuje v poli možností, tak si uprav ještěgetValue
).
Pokud používáš Nette 2.1 a vyšší tak to budeš používat takhle:$form['select'] = new MySelect('Select bez výjimky', $items);
Au
- jik
- Člen | 149
Jan Endel napsal(a):
Nemůžeš do selectboxu načíst hodnoty všechny a vlastní validací si pak pohlídat, že ti tam uživatelé nehodí něco na co nemají právo?
Ne, beru to z tabulky, která má tisíce záznamů a potřebuji vystoupit pouze pár do rolety – ale výchozí hodnota může být jakákoliv.
Tanadche napsal(a):
…au
Jak tedy takovou situaci trochu slušně řešit?
Jan Tvrdík napsal(a):
Od verze 2.1 lze pro tyhle případy použít $form->getHttpData($form::DATA_LINE, ‚selectBoxName‘).
Můžete to prosím trochu rozvést? Nerozumím tomu.
- Oli
- Člen | 1215
@jik můžeš na to zkusit form-selecitze s modem ‚select‘. Mělo by se to chovat stejně jako tady (sekce Single Item Select)
- jik
- Člen | 149
Tak jsem se k tomu musel vrátit. Mám
protected function createComponentEditpozForm() {
$form->getHttpData($form::DATA_LINE, 'stav_id');
...
}
a v šabloně je
{foreach $stavy as $item}
<p><input type=select name="stav_id" value={$item->id}>{$item->nazev}</p>
{/foreach}
<?php $form->render('begin') ?>
<?php echo $form['stav_id']->control ?>
<?php $form->render('end') ?>
Vrací mi to „Form is not anchored and therefore can not determine whether it was submitted.“ V čem dělám chybu?
Oprava: měl jsem tam pole, ne objekt, takže v šabloně je:
{foreach $stavy as $id=>$value}
<p><input type=select name="stav_id" value={$id}>{$value}</p>
{/foreach}
<?php $form->render('begin') ?>
<?php echo $form['stav_id']->control ?>
<?php $form->render('end') ?>
a zpráva: „Component with name ‚stav_id‘ does not exist“. Tedy formulářový prvek neexistuje. Měl jsem za to, že je 2. parametrem $form->getHttpData.
Editoval jik (4. 6. 2015 10:54)