Call to undefined method Nette\Database\Table\Selection::add()

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

Dobrý den, chtěl bych se zeptat jak definovat metodu add() která je v modelu UserManager?

Chyba:
Call to undefined method Nette\Database\Table\Selection::add().

Laděnka:
Na řádku 67 je chyba.

57:                $password = $values->pass;
58:
59:                $row = $this->database->table('uzivatele')->fetch('login', 'email');
60:
61:                if ($row->login == $values->login and $row->email == $values->email)
62:                    {
63:                        $this->flashMessage('Uživetelské jméno nebo email je již použit v databazi!', 'error');
64:                    }
65:                    else
66:                    {
67:                        $post = $this->database->table('uzivatele')->add($username, $password);
68:
69:                        $this->flashMessage('Registrace proběhla uspěšně!', 'success');
70:                        $this->redirect('Nastroje:registrace');
71:                    }
vvoody
Člen | 910
+
0
-

Keď je zadefinovaná už v modelu UserManager tak prečo ju nevoláš nad objektom UserManager?

TomasHuttner
Člen | 66
+
0
-

Mužeš mi to prosím nějak víc přiblížit nějak sem tě nepochopil.

vvoody
Člen | 910
+
0
-

Ja zase nechápem tvoje myšlienkové pochody pri programovaní.
Podla toho kódu z prvého postu typujem že očakávaš že nasledovný kód ti vráti UserManager?

$this->database->table('uzivatele');

Typujem správne?

TomasHuttner
Člen | 66
+
0
-

Ne mělo by to registrovat uživatele!

David Matějka
Moderator | 6445
+
0
-

tu metodu add nemuzes volat nad selection, ale nad UserManager-em. Kodem $this->database->table('uzivatele') neziskas UserManager, ale Selection pro tabulku uzivatele

TomasHuttner
Člen | 66
+
0
-

Kod sem změnil na:

$post = $this->add($username, $password);

a chyba je: Call to undefined method App\NastrojePresenter::add().

Proste nevím jak udělat a by sem funkci add() která je v modelu UserManager, mohl používat v presenteru.

Mysteria
Člen | 797
+
+1
-

Injectni si UserManager do presenteru, třeba takhle a pak nad ním zavolej tu metodu.

/** @var \Model\UserManager @inject */
public $userManager;
Mariocz
Člen | 52
+
0
-

Taky si nejsem úplně jistej co přesně chceš

jestli ti jde o přidání do databáze – metoda insert():

<?php
$post = $this->database->table('uzivatele')->insert(array('username'=>$username, 'password'=>$password);
?>

a když se snažíš zjistit jestli uživatel v DB je, měl bys použít WHERE a hledat konkrétního uživatele/email a pak zjišťovat jestli se řádek vrátil nebo ne

<?php
$this->database->table('uzivatele')->where("username", $values->username);
?>
Jan Suchánek
Člen | 404
+
0
-

Presenter po odeslání nějakého formuláře na registraci

public function onSuccessExampleFormRegistration(\Nette\Application\UI $form)
{
	$values = $form->getValues();
	try {
		$this->userManager->add($values);
		$this->flashMessage('Registrace proběhla uspěšně!', 'success');
		$this->redirect('Nastroje:registrace');
	} catch(MyExampleException $e){
		$form->addError("Uživatelské jméno již zřejmě existuje, prosím zkuste jiné.");
	}

}

V nějakém UserManageru?

public function add($values){
	try {
		$this->table->insert(array("username" => $values->username, "password" => $values->password));
	} catch(PDOException $e){
		throw new MyExampleException;
	}

}

Omlouvám se za případné chyby psal jsem to rychle. Každopádně při registraci bych se nespoléhal na to, že řádek vyhledám a pokud neexistuje vkládám, ale využíval bych db, tzn. využívat vyjímky je lepší ne?

OT: Ještě by mě zajímalo nebylo by lepší při registraci uživatele ověřit jen unikátnost emailu a uživateli poslat přístup do účtu na jeho emailovou adresu?

Editoval jenicek (15. 2. 2014 16:36)

TomasHuttner
Člen | 66
+
0
-

Díky za rady už mi to funguje!