Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

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

Jak se zbavit upozorňování PhpStormu 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 bude 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
{
    /** @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|\Nette\Bridges\ApplicationLatte\Template $template
 */
final class ArticlePresenter extends Nette\Application\UI\Presenter

Od této chvíle je napovídání perfektní:

Zbývá ještě vyřešit napovídání v šabloně. To zatím Latte plugin neumí, nicméně až to bude umět, mohl by k tomu využívat opět tu stejnou třídu šablony. Mohlo by se například zavést nové makro {template App\Presenters\ArticleTemplate}, kterým by se název třídy předal.

Komentáře

  1. Tomáš Votruba https://tomasvotruba.cz/blog #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 2 měsíci | odpovědět | reagoval [6] David Grudl
  2. Martin Váňa https://martinvana.com/blog/ #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 2 měsíci | odpovědět | 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 2 měsíci | odpovědět | reagoval [4] Felix [6] David Grudl
  4. Felix https://f3l1x.io #4

    avatar

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

    před 2 měsíci | odpovědět | 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 2 měsíci | odpovědět | reagoval [6] David Grudl
  6. David Grudl http://davidgrudl.com #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 měsícem | odpovědět

Zanechat komentář

Text komentáře
Kontakt

(kvůli gravataru)



*kurzíva* **tučné** "odkaz":http://example.com /--php phpkod(); \--

phpFashion © 2004, 2017 David Grudl | o blogu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

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