Tip: Přidání hvězdičky za povinné pole na úrovni CSS

- Jan Tvrdík
- Nette guru | 2595
Konečně jsem objevil, na co se dá použít CSS vlastnost
content. Dá se tím např. přidat červená hvězdička za
všechny povinné pole. Problémem ale je, že to funguje jen moderních
prohlížečích (tj. Opera 9.6 a FF 3.0) a bez zapnutého CSS uživatel
hvězdičku neuvidí. Na druhou stranu je to jednodušší, než si upravovat
renderer.
form label.required:after {
content: '*';
color: red;
}

- Ola
- Člen | 385
Tak podle mě by bylo lepší
$renderer->wrappers['label']['suffix'] = "*"; už z důvodu
kterej si psal (aneb IEčkáři mají smůlu) a když tam pak napíšeš, že
hvězdička znamená povinný pole a uživatelé IE ji neuvidí, tak to vypadá
divně ..
A přes css by se nastavilo že vše co je v .required je červeně (prostě styl hvězdičky) a .required label by se přenastavil zpět třeba na černou ..
Editoval Ola (3. 3. 2009 7:46)

- Honza Marek
- Člen | 1664
Pak by asi ještě šlo třeba pomocí jQuery něco takového:
// hvězdičky jen pro lidi s JS
$("form label.required").each(function () {
$(this).text($(this).text() + "*");
});
Ale rozhodně by bylo lepší, kdyby možnost hvězdičkování byla už v nette.

- Jan Tvrdík
- Nette guru | 2595
Ola napsal(a):
Tak podle mě by bylo lepší$renderer->wrappers['label']['suffix'] = "*";
Lepší by to určitě bylo, ale muselo by to fungovat :) V současnosti to přidá hvězdičku k úplně všem popiskám.

- PetrP
- Člen | 587
Uj uj uj. Přidávání tak důležité věci jako zobrazení povinnosti vyplnění parametrů rozhodně nesmí být závislé na css (respektive na vlastnosti kterou podporuje jen par prohlížečů) a ani na JS kterej by nemusel 100% fungovat ve čtečkách, mobilních prohlížečích atd.
Není nic lepšího než mít na černo-bílem monitoru: „Červené položky jsou povinné“ a podobně.

- PetrP
- Člen | 587
Už jsem se s tím jednou setkal (špatný kabel do monitoru a nevyděl jsem
všechny barvy ;])
Ale byl to spíš extrémní příklad. Přesto označovat povinně položky jen
barvou je zlo při vypnutém css nebo hlasové čtečce. Hlavně mi ale šlo
o to nedělat stejnou chybu z hvězdičkou a dávat jí přes css ani jako
obrázek a už vůbec ne jako téměř nepodporovanou vlastnost
content.

- Jod
- Člen | 701
No ale 15"palec, 8metrov má len dozadu :D a musíš so poń prísť do košíc :D , budú ti stačiŤ tri farby? Čierna, biela a červená na validáciu. Skryjem ti tam aj prekvapko v podobe tikajúcich hodiniek ,))) .
Inak pravda, hviezička napevno je asi najlepšie riešenie. To by nebol problém nejak to tam zadrôtovať hádam.

- PetrP
- Člen | 587
Jod napsal(a):
Inak pravda, hviezička napevno je asi najlepšie riešenie. To by nebol problém nejak to tam zadrôtovať hádam.
Určitě, david to má i v něčem jako todo listu. Jen jsem se dle diskuze začal bát že se to bude ubírat směrem css a js ;]
Editoval PetrP (30. 3. 2009 14:14)

- David Grudl
- Nette Core | 8285
Vyřešeno v revizi 349.
$renderer->wrappers['control']['requiredsuffix'] = " *";
// nebo
$renderer->wrappers['label']['requiredsuffix'] = " *";

- Honza Marek
- Člen | 1664
Ještě to pořád neumí červenou hvězdičku (nebere Nette\Html), ale to už je naprostý detail.

- mejla
- Člen | 14
Teď jsem to úplně nepochopil, měl jsem na mysli dosáhnout:
<th><label class="required" for="frmanyForm-name">Název <span>*</span></label></th>
css: label.required span{color:#f00}
(*) Ve stejné barvě s label je ve formuláři lehce přehlednutelná..
Editoval mejla (31. 7. 2009 8:09)

- mejla
- Člen | 14
PetrP napsal(a):
mejla napsal(a):
Zrovna jsem se s tím asi hodinu mordoval – snažil jsem se tu hvězdičku umístit do nějakého html elementu např. em, abych ji mohl zacílit přes CSS a nepodařilo se…
Třeba takhle?
$renderer->wrappers['label']['requiredsuffix'] = Html::el('spam','*');
No to jsem si právě taky myslel :-) ale přidá se htmlspecialchars()
Název<span>*</span>
viz. Honza M: Ještě to pořád neumí červenou hvězdičku (nebere Nette\Html), ale to už je naprostý detail.
Je to možná zásadní detail, protože hvězdička stejné barvy se lehce přehlédne – tudíž nemá smysl..
Editoval mejla (2. 8. 2009 18:02)

- PetrP
- Člen | 587
Aha promiň, v tom případě to je bug.
Potřebovalo by to upravit na neco v tomto duchu:
//ConventionalRenderer
public function renderLabel(IFormControl $control)
{
$head = $this->getWrapper('label container');
if ($control instanceof Checkbox || $control instanceof Button) {
return $head->setHtml(($head->getName() === 'td' || $head->getName() === 'th') ? ' ' : '');
} else {
$label = $control->getLabel();
$suffix = $this->getValue('label suffix');
$requiredsuffix = $control->getOption('required') ? $this->getValue('label requiredsuffix') : '';
$suffix = $suffix instanceof Html ? clone $suffix : Html::el(NULL)->setText($suffix);
$requiredsuffix = $requiredsuffix instanceof Html ? clone $requiredsuffix : Html::el(NULL)->setText($requiredsuffix);
if ($label instanceof Html) {
$label->add($suffix)->add($requiredsuffix);
$suffix = $requiredsuffix = '';
}
return $head->setHtml((string) $label . $suffix . $requiredsuffix);
}
}
// a taky případně upravit requeredsuffix v ConventionalRenderer::renderControl()

- Honza Marek
- Člen | 1664
Ještě by to mohlo brát Nette\Web\Html, aby hvězdičce šla dát třída a tudíž obarvení. Jinak vpodstatě jo.