Začátečnický dotaz – propojení s modelem

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

Zdravím, začal jsem s Nette, dřív jsem pracoval v CakePHP, ale z různých důvodu mi uplně nevyhovoval (neexistující rozumná práce s obrázky).
Nette se mi líbí, ale mám v tom zatím docela zmatek a například tuhle uplnou základní věc jsem nikde v dokumentaci nenašel.
Potřebuju před registrací ověřit jestli už uživatelské jméno a email neexistují. Chci jít cestou modelů pro každou tabulku.
Bohužel nevím a nikde jsem to nanašel, jak mám v Presenteru použít funkci z Modelu.
Nette používám „2.0.3 stabilní, uvolněný 4. 4. 2012“

Díky za případnou radu :)

V modelu (Users.php) mám tohle

public function isunique($email, $username)
    {
        $email = $this->users->where('email', $email)->fetch();
        $username = $this->users->where('username', $username)->fetch();
        return array('email'=>$email, 'username'=>$username);
    }
mkoubik
Člen | 728
+
0
-

Nejlíp si ho injektni do presenteru:

private $model;

public function injectFinal(User $model)
{
	$this->model = $model;
}

a kdekoliv v presenteru můžeš použít $this->model->isunique().


EDIT: Tohle funguje jen v dev verzi. Ve 2.0 si na model sáhni přes $this->context->userModel. Jo a musíš ho mít zaregistrovanej jako službu v config.neonhttps://doc.nette.org/cs/configuring

Editoval mkoubik (3. 6. 2012 16:20)

Proloo
Člen | 24
+
0
-

Bohužel z toho teda moc moudrej nejsem.
Jak si mám v configu zaregistrovat model „Users.php“ jako službu?
Tak abych mohl poté v presenteru použít funkci z tohoto modelu (viz, výše)?

Prošel jsem si i quickstart a tam je způsob pomocí „továren“, kterej mi ovšem taky nefunuguje a hlavně jsou tam ty továrny napsány jiným způsobem než v tom článku Konfigurace prostředí

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

config.neon:

common:
	services:
		users:
			class: Users # případně Users( abc, def, @jinaSluzba, %necoZeSekceParameters%) apod.

Presenter:

$this->context->users;
Proloo
Člen | 24
+
0
-

Ok, díky, tohle funguje, ale zjistil jsem, že pokud to je jako služba, tak by to mohlo dělat problémy při více dotazech (zde).
A že je asi lepší to mít ve factories.
V quickstartu je to tam napsáno takto:

common:
	factories:
		users: Users

A poté se funkce modelu v presenteru volá tímto způsobem:

$this->context->createUsers->isexist($form->values->email, $form->values->username);

To mi ale laděnka píše „Service ‚createUsers‘ not found.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Je to prosté: jsou služby a jsou továrničky.

Služba je jen jedna (jedna instance). Pokaždé, když si ji vyžádáš, dostaneš tu samou instanci. Vyžádat si ji můžeš pomocí:

  1. $this->context->nazevSluzby
  2. $this->context->getService('nazevSluzby')

Továrničky jsou metody, které něco vytvářejí. Když je zavoláš, vždycky vytvoří novou instanci. Způsob zavolání je jen jeden:

1. $this->context->createNazevTovarnicky()

A to proto, že se ta metoda tak prostě jmenuje :). To, že začíná tím create, je konvence.

Takže když máš v kódu $this->context->createUsers (bez těch uvozovek na konci, které značí volání funkce), tak ti framework hledá co? Službu createUsers. A tu tam samozřejmě nemáš.

Proloo
Člen | 24
+
0
-

Dobrá, díky. Ale stejně pořád nevím řešení. Jak to teda má být, abych mohl v presenteru použít funkci z modelu pomocí továrničky? Pročetl jsem celej quickstart, články v dokumentaci o databázích a modelech a stále nevím. Mám to teď vlastně uplně stejně jako v quickstartu a stejně to nefunguje.

Tohle v presenteru:

$this->context->createUsers->isexist()

a tohle v configu

common:
        factories:
                users: Users

Způsobuje chybu Service ‚createUsers‘ not found., jak to tedy má bejt správně? Potom už si poradím, ale tohle mi prostě není jasný a nikde to není jedndouše vysvětlený dle logické otázky výše „Jak to teda má být, abych mohl v presenteru použít funkci z modelu pomocí továrničky?“

Názorná a funkční ukázka by v dokumentaci byla opravdu za tisíc slov, to mi na Nette jako jediná věc vadí. To že hodně věcí není dostatečně vysvětleno a začátečníkům to opravdu dělá problémy, nerozdíl od jiných frameworků.

Editoval Proloo (4. 6. 2012 18:30)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Uá… mrkni na ten svůj kód :) Pořád sháníš službu. Službu createUsers – proto ti Nette jasně odpovídá „takovou službu neznám“. Pokud ale napíšeš:

$this->context->createUsers()->isexist()

… nebude v tom žádná magie, ale zavolá se ti ta továrnička. Brzdi s prohlášeními, že to není nikde jednoduše vysvětlený… vysvětlený je to v dokumentaci zcela dostatečně.

Proloo
Člen | 24
+
0
-

Ajo, já v tom hledal nějaký zuludnosti a že tam mám takovou hloupou chybu jsem si nevšiml. Tak v tom případě se omlouvám za hloupé dotazy a díky za pomoc :)