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

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

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))
              );
    }
}
eldest
Člen | 58
+
0
-

děkuju moc za pomoc :). Akorát to budu muset asi nějak rozchodit, protože mi to nefunguje.

Nette 2.0.12