Migrace na Nette 2.1 – několik postřehů
- _Martin_
- Generous Backer | 679
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
Díky za postřehy!
S tím validation scope by asi ještě správnější
bylo >setValidationScope(array())