Tovarne generovane proti rozhraniu
- Lourdy
- Člen | 3
Dobry den,
uz sa s tym skusam pohnut den, presiel som 10 tem co su na fore aj inde o
„Component with name does not exist. a pod. no nic, vacsine nechcelo najst
hned "registraciaForm“..
Neviem ci som nieco prehliadol alebo je to zvlastne chovanie:
registraciaForm mi najde, ale uz jeho vstupy (inputy, labely, email, atd.
nie)
cim to moze byt?
temp som vymazal, rozne ine experimenty s kodom tiez nepomohli
Nette\InvalidArgumentException
Component with name 'menoAPriezvisko' does not exist.
<div class="riadok">
<div class="l"><?php if ($_label = $_form["menoAPriezvisko"]->getLabel()) echo $_label ?></div>
<div class="r"><?php echo $_form["menoAPriezvisko"]->getControl() ?></div>
</div>
Presenter mam v klasickom adresari
tieto 3 subory
IRegistraciaFormularFactory.php,
RegistraciaFormular.php
RegistraciaFormular.latte
su v adresari App\components
RegistraciaPresenter.php:
<?php
namespace App\Presenters;
use Nette,
Nette\Application\UI;
/**
* Registrácia presenter.
*/
class RegistraciaPresenter extends BasePresenter
{
/** @var \App\Components\IRegistraciaFormularFactory @inject */
public $registraciaFormularFactory;
public function renderDefault()
{
$this->template->setFile(__DIR__ . '/../components/RegistraciaFormular.latte');
$this->template->render();
}
protected function createComponentRegistraciaForm()
{
return $this->registraciaFormularFactory->create();
}
}
?>
config.neon:
<?php
services:
- App\Components\IRegistraciaFormularFactory
?>
IRegistraciaFormularFactory.php:
<?php
namespace App\Components;
interface IRegistraciaFormularFactory
{
/** @return \App\Components\RegistraciaFormular */
public function create();
}
?>
RegistraciaFormular.php:
<?php
namespace App\Components;
use Nette\Application\UI;
class RegistraciaFormular extends UI\Form {
public function render() {
$this->template->render();
}
protected function createComponentRegistraciaForm()
{
$form = new UI\Form;
$form->addText('menoAPriezvisko', 'meno a priezvisko:')->setAttribute('id','menoAP')
->setRequired('Nevyplnili ste meno a priezvisko..');
// ...
$form->addSubmit('submit', 'registrovať');
return $form;
}
}
?>
RegistraciaFormular.latte:
(...)
{form registraciaForm}
<div class="riadok">
<div class="l">{label menoAPriezvisko /}</div>
<div class="r">{input menoAPriezvisko}</div>
</div>
<div class="riadok">
(...)
{/form registraciaForm}
Editoval Lourdy (6. 9. 2014 17:07)
- David Matějka
- Moderator | 6445
- smaz to nastavovani a vykreslovani templaty z presenteru (v renderDefault metode)
- do komponenty pred ten radek
$this->template->render()
dej nastaveni sablony (to, co si delal v presenteru) - V salone presenteru pak vykreslis komponentu
pomoci
{control registraciaForm}
- Lourdy
- Člen | 3
RegistraciaFormular.php ma byt zviazany napevno s nejakou sablonou? (myslel som, ze sa injektuje len RegistraciaFormular.php a vykresli sa v lubovolnych sablonach, napr. vzdy inak)
ale aj tak je to teraz tato chyba:
(cervenym je vysvieteny 17:)
Cannot read an undeclared property App\Components\RegistraciaFormular::$template.
class RegistraciaFormular extends UI\Form {
15:
16: public function render() {
17: $this->template->setFile('RegistraciaFormular.latte');
18: $this->template->render();
19: }
Editoval Lourdy (6. 9. 2014 19:29)
- David Matějka
- Moderator | 6445
Jo uz to vidim, ty tak nejak zvlastne kombinujes dedeni formulare a
subkomponenty v kontrolu.
koukni na tohle, pokud to
chces pouzit, tak ta trida musi dedit od UI\Control.
Pokud chces pouze podedit formular, tak v tom RegistraciaFormular smaz render metodu a to z createComponentRegistraciaForm presun treba do konstruktoru. ale doporucuji spise ten zpusob odkazovany vyse
- Lourdy
- Člen | 3
Podakujem neskor, uz som potom nemal net, v nedelu som sa s tym nehral a teraz som bol tri dni prec.
Ucil som sa z dokumentacie, trieda teda naozaj dedila z UI\Control, ale
pisalo chybu, ze ocakava Form, tak som dal dedit UI\Form, potom uz tuto chybu
nepisalo, len tu druhu – nezname inputy a labely a ostatne polozky
formulara.
(teraz som skusil 2. postup z uvedenej stranky co dal posledne Matej a je to
ta ista chyba:
Recoverable Error
Argument 1 passed to Nette\Latte\Macros\FormMacros::renderFormBegin() must be
an instance of Nette\Forms\Form
Ta stranka co dal Matej je ale vyborna, 1. postup funguje, akurat nepouziva
rozhranie.
Tak budem mat nakoniec komponenty vzdy len v jednom subore (bez rozhrania) a
funguje oddelenie (nemusi byt vsetko v presenteri).
Tak velka vdaka matejovi, mas to u mna.
Editoval Lourdy (11. 9. 2014 11:24)
- Šaman
- Člen | 2666
Asi je to tím, že mícháš dvě věci:
- Formulář (Nette\…\Form) není komponenta. Takže ani nemůže vytvářet
subkomponenty pomocí
createComponentFooForm();
- Komponenta (Nette\…\Control) může vytvářet své komponenty, ale zase nemá žádné inputy, prostě to není formulář.
Matoucí je asi to, že formulář můžeš vrátit jakoby to byla komponenta a že ji stejně vykresluješ. To ale umožňuje defaultní renderer…
- pokud chceš jen formulář a pokaždé si ho vykreslit po svém, tak ukázka je tady (obsah traity patří do presenteru). V configu nepracuješ s rozhraním, ale rovnou si necháš vytvořit tovární třídu jako službu. Vykreslení provádíš v šabloně presenteru (případně komponenty, prostě tam, kde máš createComponent…)
- pokud ho chceš vytvořit v komponentě a pak jen vykreslit onu komponentu (tak to asi teď máš), tak je ukázka zde (opět obsah traity je kód presenteru). V tomto případě si necháš továrničku vygenerovat pomocí rohraní
P.S. I u té první možnosti samozřejmě můžeš zpracovat formulář přímo v kódu, kde ten formulář definuješ. Já to tam nemám jenom proto, že se snažím z komponent nevolat $this->presenter, takže jsem celé přihlašování přesunul do presenteru. Mimochodem obslužné metody je možné řadit, takže v případě datových formulářů mohu zpracovat (uložit) data, ale případnou flashmessage a hlavně přesměrování nechat až na presenter.
Editoval Šaman (11. 9. 2014 14:56)