Jak se zbavit upozorňování PhpStormu, NetBeans nebo dalších IDE na
„undefined fields“ a aktivovat napovídání u objektu
$this->template
v presenterech?
Tedy jak změnit tento pohled s podtrženým abc
a prázdným
napovídacím okénkem:
Na tento?
Jednoduše. Stačí do presenteru (například BasePresenter) doplnit tuto anotaci:
/**
* @property-read \Nette\Bridges\ApplicationLatte\Template|\stdClass $template
*/
abstract class BasePresenter extends Nette\Application\UI\Presenter
Pozn.: v nejnovějších verzích Nette 2.4 až je tato anotace přímo v kódu.
Třída šablony
Třída stdClass
v anotaci je workaround pro PhpStorm, který
jinak všechny proměnné považuje za nedefinované. Nicméně zajímavější
je si vytvořit třídu se seznamem skutečných proměnných, které šablona
má, včetně jejich typů. Může vypadat třeba takto:
class ArticleTemplate extends Nette\Bridges\ApplicationLatte\Template
{
/** @var string */
public $lang;
/** @var int */
public $page;
/** @var string[] */
public $menu;
/** @var Model\Page */
public $article;
}
a potom ji v anotaci konkrétního presenteru uvedeme namísto
stdClass
:
/**
* @property-read ArticleTemplate $template
*/
final class ArticlePresenter extends Nette\Application\UI\Presenter
Od této chvíle je napovídání perfektní:
Aktualizace: Latte
plugin už podporuje napovídání přímo v šablonách. Stačí přidat
{templateType App\Presenters\ArticleTemplate}
na začátek
šablony.
Komentáře
Tomáš Votruba #1
Díky za moc pěkný návod, budu odkazovat na školeních :)
Když už jsme u toho, používáš metody
add()
nebosetParameters()
?Sám preferuju
setParameters()
, kde je těžší přepsat si existující proměnnou v dlouhé metodě, protože ji volám jednou na konci.Martin Váňa #2
+1
Nevíte jak na napovídání metod formulářů/komponent? Díky.
Martin #3
Tohle je super, ale napovídání přímo v latte template by bylo ůplně nejlepší :)
Felix #4
#3 Martine,
To by vyzadovalo celkem velkou inspekci. 🙂 Problem je, ze nevis ktery presenter/control se vaze na kterou sablonu.
Karel Borkovec #5
#2 Martine Váňo, Existuje plugin Nette do PHPStormu a ten ti s tím pomůže 😉
David Grudl #6
Doplnil jsem článek o příklad s třídou ArticleTemplate
#1 Tomáši Votrubo, setParameters() nepoužívám, je to ukecanější a nelze u něj řešit napovídání jako s ArticleTemplate.
#2 Martine Váňo, do setDefaults() se dá taky předat objekt, který bude mít definované jednotlivé properties. Zatím musí být iterovatelný (třeba potomek ArrayHash), v další verzi formulářů už to nebude potřeba.
#3 Martine, #4 Felix#5 Karel Borkovec přidal jsem na konec článku poznámku o napovídání v šablonách
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.