Vložení formuláře do @layout

Shaggy
Člen | 21
+
0
-

Dobrý den,
snažím se vložit formulář do @layout pomocí {control ContactForm}. Formulář mám definovaný v presenteru ContactPresenter. Když formulář vykreslím v default.latte, vše funguje, ale jakmile se ho pokusím přidat do @layout, vždy mi vyskočí chyba, že tento formulář neexistuje (Component with name ‚ContactForm‘ does not exist.). Našel jsem tady na fóru starší příspěvěk, podle kterého mám formulář vložit do BasePresenteru, ale to mi také nefungovalo.
https://forum.nette.org/…dovane-latte
Chtěl bych se tedy zeptat, v čem dělám chybu?
Díky.

David Matějka
Moderator | 6445
+
0
-

ahoj, ta továrníčka createComponentContactForm sice obsahuje velké „C“, na komponentu se však poté odkazuje s prvním malým písmenem, tedy {control contactForm}

Shaggy
Člen | 21
+
0
-

To jsem také zkoušel, ale stále mi to píše tu samou chybu.

David Matějka
Moderator | 6445
+
0
-

a přesunul si to teda do toho base presenteru, jo?

Shaggy
Člen | 21
+
0
-

Ano. Ale to mi nepomohlo, nebo něco píšu špatně.

abstract class BasePresenter extends Presenter
{
    protected function createComponentContactForm()
    {
        $form = new UI\Form;
        $form->addtext('name', 'Vaše jméno:');
        return $form;
    }
}
Shaggy
Člen | 21
+
0
-

Také jsem zkoušel vypsat obsah Contact/default.latte přes {include Contact/default.latte}. Vypíše to vše kromě komponenty {control contactForm}, u té to vždy vyhodí chybu.

CZechBoY
Člen | 3608
+
0
-

A jakou chybu?

btw metoda addText ma velke T

Shaggy
Člen | 21
+
0
-

Chybu „Component with name ‚contactForm‘ does not exist.“. Ale píše to jen, když v @layout použiju {include Contact/default.latte} a v Contact/default.latte použiju {control contactForm}. Když tam napíšu cokoliv jiného, vše funguje.

Kaczmi
Člen | 8
+
+1
-

Ještě zkontroluj, jestli presenter, na kterém jsi, opravdu dědí z toho správného BasePresenteru (může dědit např. jenom z UI\Presenter, a tam ta továrnička samozřejmě není)

Shaggy
Člen | 21
+
0
-

Já už opravdu nevím, co mám špatně.. zkusil jsem to přepsat všemi způsoby, ale prostě přád mi to píše, že komponenta contactForm neexistuje.
Zkusím tedy ještě přiložit kód, jestli by to nějak pomohlo.
@layout:

<div class="modal-content">
	<span class="close">&times;</span>
	<p>{control contactForm}</p> //nebo {include Contact/default.latte}, ale to dělá tu stejnou chybu.
</div>

ContactPresenter:

namespace App\Presenters;

use Nette;
use Nette\Application\UI;

class ContactPresenter extends Nette\Application\UI\Presenter //nevím, jestli to mám přepsat na BasePresenter (když jsem to přepsal, nepomohlo to)
{
    protected function createComponentContactForm()
    {
        $form = new UI\Form;
        $form->addText('name', 'Vaše jméno:');
        return $form;
    }
}

BasePresenter:

use Nette\Application\UI\Form;

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    protected function createComponentContactForm()
    {
        $form = new Form();
        $form->addText('name', 'Vaše jméno:');
        return $form;
    }
}
Marek Bartoš
Nette Blogger | 1280
+
0
-

Tvá createComponentContactForm() metoda musí existovat v každém presenteru v jehož šabloně chceš danou komponentu použít. Tzn., že pokud chceš komponentu vypsat v layoutu a layout je společný pro všechny presentery, tak má createComponentContactForm() být v base presenteru a každý presenter musí base presenter dědit. Celé to bude vypadat takto:

BasePresenter.php

use Nette\Application\UI\Form;
use Nette\Application\UI\Presenter;

abstract class BasePresenter extends Presenter
{
    protected function createComponentContactForm(): Form
    {
        $form = new Form();
        $form->addText('name', 'Vaše jméno:');
        return $form;
    }
}

V base presenteru definujeme komponentu

@layout.latte

{control contactForm}

V layoutu komponentu vypíšeme

ContactPresenter.php

class ContactPresenter extends BasePresenter
{
}

V konkrétním presenteru, který má používat @layout.latte dědíme BasePresenter, aby v presenteru existovala metoda na vytvoření komponenty použité v layoutu.

Shaggy
Člen | 21
+
0
-

Už mi to přestalo házet chybu, že komponenta neexistuje. Teď, když použiji tvůj postup, mi to vyhodí chybu „Cannot load presenter ‚Contact‘, class ‚App\Presenters\ContactPresenter‘ was not found“.

Marek Bartoš
Nette Blogger | 1280
+
+1
-

A existuje ta třída? V daném namespace? Psal jsem ti jen pseudo kód s vysvětlením, jak používat komponenty v layoutu, php namespaces si můžeš nastudovat třeba z tohoto odkazu https://symfonycasts.com/…s/namespaces

Shaggy
Člen | 21
+
0
-

Díky za odpovědi :-). Už vše funguje jak má.