Vložení formuláře do @layout
- Shaggy
- Člen | 21
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
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
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">×</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
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.
- Marek Bartoš
- Nette Blogger | 1280
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