Tovarne generovane proti rozhraniu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Lourdy
Člen | 3
+
0
-

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
+
0
-
  1. smaz to nastavovani a vykreslovani templaty z presenteru (v renderDefault metode)
  2. do komponenty pred ten radek $this->template->render() dej nastaveni sablony (to, co si delal v presenteru)
  3. V salone presenteru pak vykreslis komponentu pomoci {control registraciaForm}
Lourdy
Člen | 3
+
0
-

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

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

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

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)