jak obejít stav „out of range“ v AddSelect

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jik
Člen | 149
+
0
-

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 Endel
Člen | 1016
+
0
-

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?

Jan Tvrdík
Nette guru | 2595
+
+1
-

Od verze 2.1 lze pro tyhle případy použít $form->getHttpData($form::DATA_LINE, 'selectBoxName').

marek-m
Člen | 66
+
0
-

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
+
-3
-

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);
marek-m
Člen | 66
+
0
-

:-) to mi je jasne

Jan Endel
Člen | 1016
+
0
-

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
+
0
-

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.

Aurielle
Člen | 1281
+
0
-

Docela hezky to popsal sám David tady: https://phpfashion.com/…-v-nette-2-1

Oli
Člen | 1215
+
0
-

@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
+
0
-

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)