Jak vyřešit napovídání nad objektem $this->template v PhpStorm

David Grudl
Nette Core | 8133
+
+18
-

Jak se zbavit upozorňování PhpStormu na „undefined fields“ a aktivovat napovídání u objektu $this->template v prezenterech?

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

Více na blogu.

Aby fungovalo i napovídání dynamicky přidaných proměnných, které je dostupné po dvojím stisknutí Ctrl+Space, je potřeba šablonu uložit do lokální proměnné:

Felix
Nette Core | 1189
+
+2
-

Elegantni reseni, sam jej pouzivam! :-)

HonzaN
Člen | 64
+
0
-

Nebylo by řešení i pro Netbeans ?

Pavel Kravčík
Člen | 1182
+
0
-

@HonzaN: Částečně to jde bez té | podmínky.

Tharos
Člen | 1030
+
0
-

Je to moc hezké, ale k dokonalosti tomu ještě chybí vyřešení šablon vyrobených přes TemplateFactory. U nich totiž podtržení zůstává.

Nicméně není podtržení jako podtržení a tohle má pro programátora jasné poselství:

Field declared dynamically, což přesně vyjadřuje to, co se tam děje. Prostě daň za __get a __set

Komu ten „warning“ vyloženě vadí, může zvážit ještě řešení v duchu $template->set('abc', TRUE) (mohlo by to vcelku hezky přijímat i pole parametrů pro multi-set)…

Editoval Tharos (15. 8. 2017 9:10)

CZechBoY
Člen | 3608
+
0
-

@Tharos můžeš použít

$template->setParameters(array $appendedParameters);
Tharos
Člen | 1030
+
+1
-

@CZechBoY Jj. Ale taky to má IMHO drobnou vadu na kráse :). Tu metodu má až Template, nikoliv ITemplate. TemplateFactory sice vyrábí Template, ale ITemplateFactory vyrábí ITemplate… :)

Takže pokud chci být například v nějaké mailovací třídě závislý na interface ITemplateFactory namísto na nějaké konkrétní implementaci (kterou je TemplateFactory), pak setParameters použít nemohu… :)

Tomáš Votruba
Moderator | 1114
+
0
-

@Tharos Napadá tě nějaké řešení?

CZechBoY
Člen | 3608
+
+1
-

@TomášVotruba Posunout setParameters do interfacu. Alespon nejaka varianta predani promennych skrze interface by byla primocara a ne zavisla na konkretni implementaci.

Tharos
Člen | 1030
+
0
-

@TomášVotruba Já osobně bych udělal to, co navrhuje @CZechBoY. Když může mít ITemplate metodu setFile (což bych osobně čekal až u nějaké FileTemplate :-P, protože si dokážu představit i šablonu uloženou jinde, než ve file systemu), tak proč by nemohlo mít i metodu setParameters(array $parameters) (což využije snad každá myslitelná implementace).

A co se warningu v PhpStormu týče, asi víc než hack se stdClass na úrovni abstraktního presenteru se mi asi víc líbí prostě si nastavit IDE:

Teď jsem to vyzkoušel a funguje to, u instancí tříd s __get a __set už to ten „warning“ nedává. (Hmmm… Popravdě jdu teď u sebe commit přidávající stdClass anotaci revertnout.)

Editoval Tharos (15. 8. 2017 12:12)

CZechBoY
Člen | 3608
+
+1
-

@Tharos imo horsi varianta… stdClass je hack, ale aspon ti to nasepta co uz tam mas.
Vypnutim ty inspekce to nevypnes jen u templatu, ale uplne vsude a to muze byt obcas na skodu.

Tharos
Člen | 1030
+
0
-

@CZechBoY Hmm, tak máš pravdu. Když si s tím víc hraju, tak se to chová tak trochu neintuitivně… Nefunguje to bohužel tak, že by si to všímalo pouze tříd implementujících __get nebo __set, což jsem si zprvu myslel…

Tady IDE například vůbec nevadí zápis do $this->test (což bych ještě chápal, protože to je v PHP legitimní), ale přístup k té hodnotě už IDE vadí, byť v tomto případě PHP ani nepípne.

Editoval Tharos (15. 8. 2017 9:09)

Tomáš Votruba
Moderator | 1114
+
0
-

@Tharos @CZechBoY Dokázali byste to nějak dát to pull-requestu? :)

Follow-up po https://github.com/…ion/pull/184