Migrace na Nette 2.1 – několik postřehů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Po osmi hodinách mám úspěšně zmigrováno, tak bych se rád podělil o některé obtíže, na které jsem cestou narazil, a způsob, jak je vyřešit.

1. Makro n:name a párové tagy

Bacha na kombinaci makra n:name a textarea (nebo jakéhokoliv jiného párového tagu). Máte-li v tagu atribut, jehož obsah je generován libovolným makrem (např. vypsání proměnné), Latte špatně vygeneruje PHP kód. Více viz bug report.

Řešení

Potřebujete-li tag vykreslit ručně, použijte makro input:

<!-- původní kód -->
<textarea n:name="summary" placeholder="{_ 'write summary here'}" rows="3" class="input-xxlarge span10">{$form['summary']->value}</textarea>

<!-- upravený kód -->
{capture $placeholderText}{_ 'write summary here'}{/capture}
{input summary placeholder => $placeholderText, rows => 3, class => "input-xxlarge span10"}

2. Problém s Template-Translatorem a obecně makry, začínajícími podtržítkem

Nette vše za podtržítkem považuje za argument makra.

Řešení

Bohužel jsem nepřišel na čisté řešení, takže jsem upravil Translator a makra přejmenoval tak, že podtržítkem končí.

<!-- původní kód -->
{_p 'LoginPage', 'Your email'}

<!-- upravený kód -->
{p_ 'LoginPage', 'Your email'}

3. Tlačítka, jejichž stisknutí nemá spustit validaci

V nové verzi Nette došlo k rozšíření funkčnosti metody setValidationScope, nově lze vyjmenovat prvky, nad kterými tlačítko spustí validaci. Spolu s touto změnou se změnil také způsob, jak říct, že tlačítko nemá validovat nic.

Řešení
# původní kód
$form->addSubmit('cancel', "Storno")
	->setValidationScope(NULL);

# upravený kód
$form->addSubmit('cancel', "Storno")
	->setValidationScope(FALSE);

4. Vlastní validátor

Pokud jste dříve vytvořili vlastní validátor, který závisel na jiném prvku formuláře, Nette vám předalo celý tento prvek. Nově předává přímo jeho hodnotu.

Řešení

V PHP:

# původní kód
public static function someValidator($item, $arg)
{
	return (int) $item->getValue() <= (int) $arg->getValue();
}

# upravený kód
public static function someValidator($item, $arg)
{
	return (int) $item->getValue() <= (int) $arg;
}

Na straně klienta:

<!-- původní kód -->
Nette.validators.SomePresenter_someValidator = function(elem, args, val) {
	var dependentInputValue = $('input[name=' + args.control + ']').val();
	return parseInt(val) <= parseInt(dependentInputValue);
};

<!-- upravený kód -->
Nette.validators.SomePresenter_someValidator = function(elem, args, val) {
	return parseInt(val) <= parseInt(args);
};
David Grudl
Nette Core | 8228
+
0
-

Díky za postřehy!

S tím validation scope by asi ještě správnější bylo >setValidationScope(array())