DefaultFormRenderer a inputy, které mají atribut hidden=„hidden“
- DefenestrationPraha
- Člen | 134
Ahoj,
pohrávám si teď s renderováním formulářů a pozoruji jednu drobnost. Je-li nějaká control v rámci formuláře označena jako hidden=„hidden“ pomocí atributu, tak se sice nevykreslí, ale ve formuláři se kolem ní udělá kontejner, který má úplně stejné vlastnosti, jako kontejner ne-hidden inputů. Což třeba v případě, že si tam dáte padding, vytvoří „mezeru“ ve formuláři.
A label samotný zůstane být vidět, i když toto umím opravit přímo v Rendereru (přidat mu class hidden).
<div class=„form-group row form-outline“>
<div class=„col-sm-12 kraken-label“><label
for=„Group“>Skupina</label></div>
<div class=„col-sm-12 form-outline“><select name=„group“
id=„Group“ hidden=„hidden“ class=„1“ disabled=""><option
value=„2“>2 – Ostraváci (ostravaci@circletech.net)</option><option
value=„10“>10 – Pražáci (prazaci@circletech.net)</option></select></div>
</div>
Nedávalo by smysl, aby se inputy označené atributem hidden chovaly zcela stejně jako inputy typu hidden, aspoň při svém vykreslování? Tj. žádný viditelný label a použít wrapper pro hidden inputy místo toho pro běžné inputy?
- m.brecher
- Generous Backer | 905
@DefenestrationPraha
Nedávalo by smysl, aby se inputy označené atributem hidden chovaly zcela stejně jako inputy typu hidden
Určitě ne, máš na vybranou, chceš hidden input bez doprovodného html, použiješ addHidden(), z nějakého důvodu potřebuješ dynamicky schovat input, ale ponechat label ? Nastavíš atribut hidden. Feature, kdy jeden prvek ovlivňuje ostatní bez zřejmého důvodu, byť je to dobře míněno, vede k neočekávanému chování.
- Kamil Valenta
- Člen | 844
@DefenestrationPraha pokud se ten select skrývá nějak podmíněně (jinak mi to ani moc smysl nedává), proč to neskrýváš csskem na úrovní celé .form-group row ?
- DefenestrationPraha
- Člen | 134
Kamil Valenta napsal(a):
@DefenestrationPraha pokud se ten select skrývá nějak podmíněně (jinak mi to ani moc smysl nedává), proč to neskrýváš csskem na úrovní celé .form-group row ?
No to já bych moc chtěl, ale jak to mám udělat? Dívám-li se na examply rendererů, nevidím možnost ovlivnit třídu celé .form-group row pro každý prvek zvlášť. Wrappers to nastavují pro všechny prvky naráz.
Maximálně se dostanu k labelu.
- Kamil Valenta
- Člen | 844
Těch možností je více. Buď to celé obsluhuješ nějakým JS, který má určitě přístup k parent prvku. V jQuery např. .parents().
Nebo čistě v CSS pomocí :has().
- m.brecher
- Generous Backer | 905
@DefenestrationPraha
No to já bych moc chtěl
Jen tak mě napadlo zkusit na to jít takto:
$renderAsHidden = true/false;
$renderAsHidden
? $form->addText('name')
->setDefaultValue($value);
: $form->addHidden('name')
->setDefaultValue($value);
Pozor na to, že prvek hidden není v defaultu zabezpečen proti hacknutí, ale v nette/forms, když si prohlédneš konstruktor prvku Hidden je nějaká ne oficielně podporovaná možnost zabezpečení pomocí $persistentValue, předaném do konstruktoru:
class Nette\Forms\Controls\HiddenField extends BaseControl
{
private bool $persistValue = false;
private bool $nullable = false;
public function __construct($persistentValue = null) // toto by mělo umožnit zabezpečení hodnoty prvku
{
parent::__construct();
$this->control->type = 'hidden';
$this->setOption('type', 'hidden');
$this->value = '';
if ($persistentValue !== null) {
$this->unmonitor(Nette\Forms\Form::class);
$this->persistValue = true;
$this->value = (string) $persistentValue;
}
}
// ...
}
Jestli to nejsou kritická data, tak se to možná zabezpečovat nemusí, musí se to uvážit.
Editoval m.brecher (27. 7. 13:49)