Neufnkcne templateType, ako overit funkcnost?
- MKI-Miro
- Člen | 279
Ahojte
V presenteru mam:
$product= $this->productRepository->findAll()->get($id);
$productViewModel = new ViewModels\ProductViewModel();
$productViewModel->id = $product->id;
$productViewModel->name = $product->name;
$this->setView("productDetail", $productViewModel);
ViewModel:
namespace App\Presenters\ViewModels;
class ProductViewModel
{
public int $id;
public string $name;
}
V latte:
{templateType App\Presenters\ViewModels\ProductViewModel}
<h1 class="product-title">{$name}</h1>
Zahlasi mi ze nepozna premenu $name
Robim nieco zle?
Dakujem
Edit: nefunguje to ani takto
$this->template->render(__DIR__ . '/templates/product/product.latte', (array)$productViewModel);
Edit2: ak by vedel niekto pomoct som ochotny aj zaplatit
Podla tohto clanku https://blog.nette.org/…-type-system
by mala trieda dedit od extends \Nette\Bridges\ApplicationLatte\Template
ak to ale pridam tak dostanem error
Too few arguments to function Nette\Bridges\ApplicationLatte\Template::__construct(), 0 passed in ProductPresenter.php on line 102 and exactly 1 expected
Editoval MKI-Miro (9. 6. 2020 11:09)
- MajklNajt
- Člen | 502
@MKI-Miro čo očakávaš, že spraví
$this->setView("productDetail", $productViewModel);
? tá metóda
má iba jeden parameter a tým je názov view (teda šablóny), pokiaľ chceš
do šablóny predať nejaké dáta, použi
$this->template->productViewModel = $productViewModel;
a v šablóne potom používaj
<h1 class="product-title">{$productViewModel->name}</h1>
- Marek Bartoš
- Nette Blogger | 1280
Takto vytvoříš a vyrenderuješ custom template, z konkrétní třídy
$template = $this->createTemplate(TemplateClass::class);
assert($template instanceof TemplateClass);
...
$template->render();
Automaticky (pro $this->template
) se vytváří
Foo\Bar\ExampleTemplate
pro Foo\Bar\ExamplePresenter
,
pokud daná třída existuje. Jinak se použije DefaultTemplate.
Do $template->render()
nepředáváš žádný view model,
$template
je ten view model.
A potřebuješ "nette/application": "3.0.x-dev"
, není to
zatím ve stable verzi. V té jsou zatím jen makra templateType
a
varType
a ta sama o sobě slouží čistě pro napovídání
https://github.com/…/Control.php#…
Editoval Mabar (9. 6. 2020 14:57)
- MKI-Miro
- Člen | 279
MajklNajt napsal(a):
templateType
sa používa, aby phpStorm vedel našepkávať, ty si domiešal úplne jablká s hruškami
isiel som podla tohto
https://blog.nette.org/…ypovy-system
cize rad by som mal vedel v sablone akeho typu su premenne
- MKI-Miro
- Člen | 279
Mabar napsal(a):
Takto vytvoříš a vyrenderuješ custom template, z konkrétní třídy
$template = $this->createTemplate(TemplateClass::class); assert($template instanceof TemplateClass); ... $template->render();
Automaticky (pro
$this->template
) se vytváříFoo\Bar\ExampleTemplate
proFoo\Bar\ExamplePresenter
, pokud daná třída existuje. Jinak se použije DefaultTemplate.Do
$template->render()
nepředáváš žádný view model,$template
je ten view model.A potřebuješ
"nette/application": "3.0.x-dev"
, není to zatím ve stable verzi. V té jsou zatím jen makratemplateType
avarType
a ta sama o sobě slouží čistě pro napovídání
mam nette/application (v3.0.5):
skusam to teda takto:
$latte = $this->template->getLatte();
$productTemplate = new ProductTemplate($latte);
$productTemplate->id = $product->id;
$productTemplate->name = $product->name;
$template = $this->createTemplate($productTemplate);
$template->render();
Pricom ProductTemplate vyzera takto
namespace App\Presenters;
class ProductTemplate extends \Nette\Bridges\ApplicationLatte\Template
{
public int $id;
...
dostavam
rgument 1 passed to Latte\Engine::render() must be of the type string, null given, called in C:\wamp64\www\mania\vendor\nette\application\src\Bridges\ApplicationLatte\Template.php on line 50
Editoval MKI-Miro (9. 6. 2020 16:05)
- David Grudl
- Nette Core | 8239
Hele netuším, čeho se přesně snažíš dosáhnout. Pokud ti jde o napovídání v PhpStormu, tak stačí vytvořit třídu ProductViewModel, přidat {templateType} do šablony jak to máš v prvním příspěvku, a víc nic není potřeba dělat.
- MKI-Miro
- Člen | 279
David Grudl napsal(a):
Hele netuším, čeho se přesně snažíš dosáhnout. Pokud ti jde o napovídání v PhpStormu, tak stačí vytvořit třídu ProductViewModel, přidat {templateType} do šablony jak to máš v prvním příspěvku, a víc nic není potřeba dělat.
snazim sa aby som v sablone bolo jasne akeho typu premenna je
ale nijako sa mi nedari to aby potom v sablone dokazal rozpoznat napr premenu {$name} – zahlasi ze ju nepozna.
Dost som aj zmateny z tej dokumentacie k tomu – pride mi dost nejasna
- Marek Bartoš
- Nette Blogger | 1280
Zajímalo by mě, jak jsi z návodu, ve kterém do createTemplate() předávám název třídy došel k tomu, že tam máš dávat nějaký objekt. createTemplate() ten objekt vytvoří za tebe, nemáš ho vytvářet sám. A potřebuješ dev verzi nette/application, takže 3.0.5 ti moc nepomůže
- David Grudl
- Nette Core | 8239
MKI-Miro napsal(a):
snazim sa aby som v sablone bolo jasne akeho typu premenna je
Jak říkám, stačí vytvořit třídu a použít
{templateType}
. Dělal jsi to dobře. Pokud se PhpStorm zváří,
že proměnnou nezná, je to možná chyba v pluginu. Máš
poslední verzi?
Dost som aj zmateny z tej dokumentacie k tomu – pride mi dost nejasna
A kde jsi přišel na ty věci s createTemplate a setView, co přece nikde v dokumentaci není…
- MKI-Miro
- Člen | 279
David Grudl napsal(a):
MKI-Miro napsal(a):
snazim sa aby som v sablone bolo jasne akeho typu premenna je
Jak říkám, stačí vytvořit třídu a použít
{templateType}
. Dělal jsi to dobře. Pokud se PhpStorm zváří, že proměnnou nezná, je to možná chyba v pluginu. Máš poslední verzi?
ono error zahlsi samotny nette je nepozna (nie plugin)
>
Dost som aj zmateny z tej dokumentacie k tomu – pride mi dost nejasna
A kde jsi přišel na ty věci s createTemplate a setView, co přece nikde v dokumentaci není…
to sa ospraveldnujem skusal som co sa dalo → dokumentaci celkovoo aj pre latte je fajn problem je ze pre smotne latte to je pisane tak univerzalne (nie je to pisane priamo pre nette – neeviem ci to vysvetlujem spravne)