Component with name ‚poll‘ does not exist
- RVS
- Člen | 8
Jsem začátečník, poradí někdo jak na tuto chybu. Component with name ‚poll‘ does not exist. díky
DefaultPresenter.php
//DefaultPresenter.php
namespace App\Presenters;
use Nette;
use App\Model\PollControl;
class DefaultPresenter extends Nette\Application\UI\Presenter
{
protected function createComponentPoll(): PollControl
{
$poll = new PollControl;
// $poll = $this->getComponent('poll');
$poll->items = $this->item;
return $poll;
}
}
PollControl.php
//PollControl.php
namespace App\Model;
use Nette;
use Nette\Application\UI\Control;
class PollControl extends Control
{
public function render(): void
{
// vložíme do šablony nějaké parametry
$value = 'toje test vypsání textu do stránky';
$this->template->param = $value;
// a vykreslíme ji
$this->template->render(__DIR__.'/poll.latte');
}
}
poll.latte
//poll.latte
<div id="user-panel">
<h3>TEST</h3>
{control poll}
<!-- Další informace podle potřeby -->
</div>
layout.latte
//@layout.latte
{block sidebar}
{include 'poll.latte'}
{/block}
Editoval RVS (17. 12. 2023 16:04)
- nightfish
- Člen | 474
@RVS
- Kód
{control poll}
máš v šabloně DefaultPresenteru nebo někde jinde? - Uzavírej kód do formátovacích značek, ať se v něm lépe orientuje. Zároveň může být užitečné u každé ukázky kódu napsat, ve kterém souboru se daný kód nachází – obzvláště v situaci, kdy jsou ukázky z různých souborů. Pomůže to případným rádcům v orientaci a zvýší šanci na rychlou odpověď.
- nightfish
- Člen | 474
@RVS V okamžiku, kdy máš {control poll}
v layoutu,
tak musíš mít createComponentPoll()
ve všech presenterech,
které ten layoutu používají (což dost často znamená „ve všech
presenterech“).
Na tvém kódu mi není jasná jedna věc – jestli
poll.latte
, které se includuje v layoutu, je ten stejný
poll.latte
, který se používá v
PollControl::render()
– pokud ano, tak to nedává smysl.
Každopádně chybová hláška Component with name ‚poll‘ does not
exist. znamená, že se pokoušíš vykreslit komponentu poll
v šabloně komponenty/presenteru, který na sobě nemá metodu
createComponentPoll()
.
- m.brecher
- Generous Backer | 761
@RVS
Měl by sis vytvořit v projektu hierarchii s jedním abstraktním presenterem, který by byl předkem ostatních finálních presenterů. Abstraktní presenter by vytvářel komponenty pro layout. Tím by bylo zajištěno, jak píše @nightfish že komponenta umístěná v layoutu bude k dispozici ve „všech“ presenterech. Obvykle se nejvyšší presenter předek pojmenovává BasePresenter.
abstract class BasePresenter extends UI\Presenter
{
protected function createComponentPoll(): PollControl
{
$poll = new PollControl;
$poll->items = $this->item;
return $poll;
}
public function beforeRender()
{
parent::beforeRender();
$this->setLayout('layout'); // nastavení layoutu @layout.latte pro všechny finální presentery
}
}
ostatní finální presentery:
final class MyPresenter extends BasePresenter
{
public function actionDefault()
{
$this['poll'] // komponenta je k dispozici díky dědění z BasePresenter
}
}
- m.brecher
- Generous Backer | 761
@RVS
Pro voči nevidím, chyba je v šabloně:
Komponenta vykresluje poll.latte:
class PollControl extends Control
{
public function render(): void
{
$value = 'toje test vypsání textu do stránky';
$this->template->param = $value;
$this->template->render(__DIR__.'/poll.latte'); // vykresluje poll.latte
}
}
poll.latte rekurzivně vykresluje sebe sama:
<div id="user-panel">
<h3>TEST</h3>
{control 'poll'} {* rekurziví smyčka *}
<!-- Další informace podle potřeby -->
</div>
Šablona komponenty se pokusí opakovaně vykreslit komponentu – ale jako vnořenou do sebe sama tj. $presenter[‚poll‘][‚poll‘] a tato komponenta neexistuje.
Je potřeba opravit šablonu layoutu:
{block 'sidebar'}
{control 'poll'} {* komponenta UI\Control se nevkládá pomocí {include ...} *}
{/block}
a opravit šablonu komponenty:
<div id="user-panel">
<h3>TEST</h3>
{$param}
<!-- Další informace podle potřeby -->
</div>
Editoval m.brecher (18. 12. 2023 13:50)