setRequired v případě chyby nevloží class
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- eldest
- Člen | 58
Zdravím všechny,
zajímalo by mě, jestli nevíte, proč se mi při situaci, kdy odešlu
formulář (a mám vypnutý JavaScript) zobrazí správně chybová hláška ze
setRequired(…), ale už se tomu elementu nevloží class
například error?
Případně byl by nějaký elegantní způsob jak toho docílit?
Díky všem.
- sKopheK
- Člen | 207
Na tento problém jsem upozorňoval už dříve, zatím bohužel bez jakékoliv reakce (https://forum.nette.org/…oveho-zapisu). Takže nezbývá, než si udělat si vlastní makro / přepsat stávající. Např. moje řešení v Nette 2.1dev:
V config.neon:
common:
nette:
latte:
macros:
- CustomFormMacros::install
CustomFormMacros.php:
use Nette\Latte\MacroNode,
Nette\Latte\PhpWriter;
class CustomFormMacros extends \Nette\Latte\Macros\MacroSet
{
public static function install(\Nette\Latte\Compiler $compiler)
{
$set = new static($compiler);
$set->addMacro('input', callback($set, 'macroInput'), NULL, NULL);
$set->addMacro('label', callback($set, 'macroLabelRequiredStart'), callback($set, 'macroLabelRequiredEnd'), NULL);
}
public function macroLabelRequiredStart(MacroNode $node, PhpWriter $writer)
{
$cmd = '
$_input = is_object(%node.word) ? %node.word : $_form[%node.word];
if ($_label = $_input->getLabel())
{
$attributes = %node.array;
$css_class = isset($_input->getLabelPrototype()->class) ? (array)$_input->getLabelPrototype()->class : array();
if ($_input->required)
{
$css_class[] = "required";
}
if ($_input->hasErrors())
{
$css_class[] = "error";
}
if (count($css_class) > 0)
{
$attributes += array("class" => join(" ", $css_class));
}
echo $_label->addAttributes($attributes)->startTag();
echo $_label->getText();
}';
return $writer->write($cmd);
}
public function macroLabelRequiredEnd(MacroNode $node, PhpWriter $writer)
{
return $writer->write('?></label><?php');
}
public function macroInput(MacroNode $node, PhpWriter $writer)
{
$words = $node->tokenizer->fetchWords();
if (!$words) {
throw new CompileException("Missing name in {{$node->name}}.");
}
$name = array_shift($words);
$cmd = $name[0] === '$' ? '$_input = is_object(%0.word) ? %0.word : $_form[%0.word];'
: '$_input = $_form[%0.word];';
$cmd .= 'if ($_input->hasErrors()) { $_control = $_input->getControlPrototype(); $css_class = isset($_control->class) ? $_control->class : ""; $css_class .= " error"; $_control->class(trim($css_class)); };';
$cmd .= 'echo $_input->getControl(%1.raw)->addAttributes(%node.array)';
return $writer->write($cmd,
$name,
implode(', ', array_map(array($writer, 'formatWord'), $words))
);
}
}