manuální vykreslení: u labelu chybí ‚class=„required“‘

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xlilien
Člen | 27
+
0
-

Ahoj, předem se omlouvám, že to píšu dvakrát, ale chtěl jsem zkusit, jestli na českém fóru nebude někdo znát odpověď.

Když vykresluju formulář ručně pomocí

{form signInForm}
	{label username /} {input username}
{/form}

tak ve vygenerovaném html kódu u labelu chybí class=„required“ – označení povinné položky, kterou přidávám pomocí ->setRequired(). Když vykreslím formulář pomocí standardního renderu

{control signInForm}

tak ten samý formulář u labelu již class=„required“ obsahuje. Setkali jste se s tím? Jak zajistit, aby i při manuálním vykreslování formuláře byly generovány tyto css třídy?

Samozřejmě by šlo vykreslovat pomocí

{label username class => 'required'}

ale to mi přijde hodně neobratné – musel bych hlídat na dvou místech, jestli se jedná o povinnou položku.

Předem díky za návrhy řešení.

Grelek
Člen | 233
+
0
-

Ehm, required se dává na input, ne na label.

petr.pavel
Člen | 535
+
0
-

Mě taky přijde legitimní chtít, aby required bylo (i) u label. Jak jinak chcete udělat třeba hvězdičku za popiskem, nebo celé tučným písmem.

Já používám vlastní makro, které přetěžuje to původní:

<?php
  /**
   * {label ...} and optionally {/label}
   * With css class 'required'
   */
  public function macroLabel(NMacroNode $node, NPhpWriter $writer) {
    $cmd = '
      $_input = is_object(%node.word) ? %node.word : $_form[%node.word];
      $attributes = %node.array;
      if ($_input->required) {
        $attributes += array("class" => "required");
      }
      if ($_label = $_input->getLabel())
        echo $_label->addAttributes($attributes)';  // ->startTag() may be appended to the string so don't end with } or ;
    if ($node->isEmpty = (substr($node->args, -1) === '/')) {  // {label xyz /}
      $node->setArgs(substr($node->args, 0, -1));
      return $writer->write($cmd);
    } else {                                                   // {label xyz} abc {/label}
      return $writer->write($cmd . '->startTag()');
    }
  }
?>
David Matějka
Moderator | 6445
+
0
-

snad jen jeste doplnim, ze trida required je pri vykresleni pres {control} nejen u inputu, jak pise Grelek, ale i u „pair“, ktery obaluje label a input. a deje se tak diky DefaultFormRenderer, ktery se pri manualnim vykresleni samozrejme nepouzije

xlilien
Člen | 27
+
0
-

petr.pavel napsal(a):

Mě taky přijde legitimní chtít, aby required bylo (i) u label. Jak jinak chcete udělat třeba hvězdičku za popiskem, nebo celé tučným písmem.

Já používám vlastní makro, které přetěžuje to původní:

<?php
  /**
   * {label ...} and optionally {/label}
   * With css class 'required'
   */
  public function macroLabel(NMacroNode $node, NPhpWriter $writer) {
    $cmd = '
      $_input = is_object(%node.word) ? %node.word : $_form[%node.word];
      $attributes = %node.array;
      if ($_input->required) {
        $attributes += array("class" => "required");
      }
      if ($_label = $_input->getLabel())
        echo $_label->addAttributes($attributes)';  // ->startTag() may be appended to the string so don't end with } or ;
    if ($node->isEmpty = (substr($node->args, -1) === '/')) {  // {label xyz /}
      $node->setArgs(substr($node->args, 0, -1));
      return $writer->write($cmd);
    } else {                                                   // {label xyz} abc {/label}
      return $writer->write($cmd . '->startTag()');
    }
  }
?>

Díky, tohle je přesně ono, pomohlo mi to!

Grelek napsal(a):

Ehm, required se dává na input, ne na label.

Jak píše i @matej21, class required dává default renderer na label a tr, input nemá class required ale samostatný HTML5 atribut required.