Component with name ‚poll‘ does not exist

RVS
Člen | 8
+
0
-

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
+
0
-

@RVS

  1. Kód {control poll} máš v šabloně DefaultPresenteru nebo někde jinde?
  2. 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ěď.
RVS
Člen | 8
+
0
-

{control poll} mám šabloně poll.latte kterou načítám do layout.latte

nightfish
Člen | 474
+
0
-

@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
+
0
-

@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
+
0
-

@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)

RVS
Člen | 8
+
0
-

Díky všem za rady, s vaší pomocí je problém vyřešen.