DefaultFormRenderer a inputy, které mají atribut hidden=„hidden“

DefenestrationPraha
Člen | 134
+
0
-

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

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

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

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

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

@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)