chyba Cannot read an undeclared property Nette\Database\Table\Selection::$sberatel_jmeno

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

Tak jsem narazil na další problém. Objevila se mi výše uvedená chyba a nemohu přijít na to proč.

Mám v config.neon službu
App\Model\UzivatelRepository
Třída Uzivatelrepository vypadá takto
namespace App\Model;

use Nette;

class UzivatelRepository
{
	use Nette\SmartObject;

	/** @var Nette\Database\Context */
	private $database;

	public function __construct(Nette\Database\Context $database)
	{
		$this->database = $database;
	}

	public function najdiUzivatele($uzivatel_jmeno)
	{
		return $this->database->table('tb_sberatele')->select('sberatel_jmeno')->where('sberatel_jmeno', $uzivatel_jmeno);
	}

a presenter, kde se snažím načíst uživatele jestli existuje:

namespace App\Presenters;

use Nette;
use Nette\Application\UI;

class PrihlaseniPresenter extends BasePresenter
{
 /** @var \App\Model\UzivatelRepository */
  private $UzivatelRepository;

  public function injectUzivatelRepository(\App\Model\UzivatelRepository $UzivatelRepository1)
  {
    $this->UzivatelRepository = $UzivatelRepository1;
  }

	protected function createComponentNovyUzivatelForm()
	{
		$form2 = new UI\Form;
		$form2->addText('prihlasovaci_jmeno', 'Jméno:')
			->setRequired('Vyplňte vaše přihlašovací jméno - rozlišuje velká a malá písmenka.');

		$form2->addPassword('prihlasovaci_heslo', 'Heslo:')
			->setRequired('Vyplňte vaše heslo - rozlišuje velká a malá písmenka.')
      ->addRule(UI\Form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaky', 3);

		$form2->addText('prihlasovaci_email', 'Email:')
			->setRequired('Vyplňte váš email.')
      ->addRule(UI\Form::EMAIL, 'Vyplnil(a) jste neplatnou emailovou adresu');

		$form2->addSubmit('tl_prihlasit', 'vytvořit účet');

		$form2->onSuccess[] = [$this, 'novyUzivatelFormSucceeded'];
		return $form2;
	}

  /** @var \Nette\Database\Table\ActiveRow */
  private $u;

	public function novyUzivatelFormSucceeded($form2, $values)
	{
    $u=$this->UzivatelRepository->najdiUzivatele($values->prihlasovaci_jmeno);
     if ($u->sberatel_jmeno == $values->prihlasovaci_jmeno) {
         $form2->addError('Tento uživatel zde již existuje. Zvolte si jiné uživatelské jméno.');
         }
  }
}

A chyba se objevuje na řádku, kde chci pracovat s $u->sberatel_jmeno

Hledal jsem na fóru a našel jsem rady jako že chybí annotace, což si myslím, že mám dobře, případně že je dobré přidat explicitní výběr sloupců, což jsem tam zkusil přidat a nepomohlo to. Takže mě došly nápady, kde hledat chybu.

Editoval Mirek (21. 9. 2016 10:43)

Oli
Člen | 1215
+
+1
-

Chybí ti tam fetch()

return $this->database->table('tb_sberatele')
	->select('sberatel_jmeno')
	->where('sberatel_jmeno', $uzivatel_jmeno)
	->fetch();

Selection si můžeš představit jako pole. Musíš ho prohnat foreachem. Pokud chceš pracovat s jedním záznamem, musíš zavolat metodu fetch, která vrací ActiveRow a na něm pak můžeš zavolat $u->sberatel_jmeno

Editoval Oli (21. 9. 2016 10:55)

Mirek
Člen | 86
+
0
-

Díky to pomohlo, jen v dokumentaci jsem nikde to fetch() neviděl použít.

Muhahe
Člen | 79
+
0
-

V tutorialech je casto pouzity nejaky cyklus na iteraci dat, ktery si vola fetch() sam. Pokud chces data pouze vratit a s necim porovnat, musis ten fetch() zavolat rucne. Myslim ze se to nazyva lazyLoading?

Mirek napsal(a):

Díky to pomohlo, jen v dokumentaci jsem nikde to fetch() neviděl použít.

CZechBoY
Člen | 3608
+
0
-

Jen si dej bacha na to, že pokud se záznam nenajde tak fetch vrací false.
Takže ten if bych přepsal na tohle

if ($u !== false) {

Editoval CZechBoY (21. 9. 2016 11:20)

Mirek
Člen | 86
+
0
-

Takže mě by spíš měla vyhovovat podmínka

if ($u) {

A měl bych ještě jeden dotaz – funkci Passwords::hash() – druhým parametrem se dá změnit počet iterací při hashování – jak funkce Passwords::verify() pozná, jaký paramert byl zadán, když u ní tato volba není

jiri.pudil
Nette Blogger | 1032
+
0
-

Ten parametr je součástí hashe, oproti kterému heslo ověřuješ

Mirek
Člen | 86
+
0
-

Aha, tak díky za vysvětlení.