Na navigaci | Klávesové zkratky

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.

před 7 lety v rubrice PHP | blog píše David Grudl | nahoru

Mohlo by vás zajímat

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.

    před 7 lety | 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,
    		]);
    	}
    před 7 lety | 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 -->
    před 7 lety | 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.

    před 7 lety | 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 😉

    před 7 lety | 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

    před 7 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 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í.