PhpStorm a napovídání nad $this->template

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.

v rubrice Nette | blog píše David Grudl | nahoru

Komentáře

  1. Tomáš Votruba #1

    avatar

    Díky za moc pěkný návod, budu odkazovat na školeních :)

    Když už jsme u toho, používáš metody add() nebo setParameters()?

    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.

    | reagoval [6] David Grudl
  2. Martin Váňa #2

    avatar

    +1

    Nevíte jak na napovídání metod formulářů/komponent? Díky.

    	public function actionEditCategory($id){
    		...
    		$this['editCategoryForm']->setDefaults([
    			'id' => $category->id,
    			'name' => $category->name,
    			'weight' => $category->weight,
    		]);
    	}
    
    | reagoval [5] Karel Borkovec [6] David Grudl
  3. Martin #3

    Tohle je super, ale napovídání přímo v latte template by bylo ůplně nejlepší :)

    public function render() {
    	$this->template->date = new DateTime();
    }
    
    {$date->format()} <!-- tohle by našeptávalo -->
    
    | reagoval [4] Felix [6] David Grudl
  4. Felix #4

    avatar

    #3 Martine,
    To by vyzadovalo celkem velkou inspekci. 🙂 Problem je, ze nevis ktery presenter/control se vaze na kterou sablonu.

    | reagoval [6] David Grudl
  5. Karel Borkovec #5

    avatar

    #2 Martine Váňo, Existuje plugin Nette do PHPStormu a ten ti s tím pomůže 😉

    | reagoval [6] David Grudl
  6. David Grudl #6

    avatar

    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.


phpFashion © 2004, 2025 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.