Dotazování z databáze v komponentě a následné vytvoření komponenty v BasePresenteru

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

Zdravím, začal jsem používat Nette a narazil jsem na problém. Když jsem chtěl v @layout.latte volat komponentu, která by vykreslovala na stránku data uživatele(například: jste přihlášen jako $jmeno $heslo), ale nejsem schopen s tím pohnout.
Chtěl bych se zeptat, jak mám zdárně docílit toho, abych v komponentě vytáhl data z databáze, podle parametru v BasePresenteru?
Hází to chybu za chybou a asi nemá cenu je všechny vypisovat. Nejlepší by bylo, kdyby někdo poradil, jak to udělat korektně.

Komponenta Informace.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
use Nette\Application;
class Informace extends \App\Presenters\BasePresenter {
public $database;

    public function __construct(Nette\Database\Context $database)

    {
        parent::__construct($database);

        $this->database = $database;
    }

     public function render($username)
    {
        $this->template->info = $this->database->table('users')
                ->where('username',$username);
    }
}

BasePresenter

<?php

namespace App\Presenters;

use Nette,
	App\Model,
        App\Components,
        Nette\Application\UI\Control;


/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{


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

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





   protected function createComponentSignInForm()
	{

		$form = new Nette\Application\UI\Form;

                $form->  addText('username')
			->setRequired('Zadejte uživatelské jméno.')
                        ->setAttribute('placeholder', 'Uživatelské jméno');

		$form->addPassword('password')
			->setRequired('Zadejte heslo.')
                        ->setAttribute('placeholder', 'Heslo');
		$form->addCheckbox('remember', 'Zůstat přihlášen');

		$form->addSubmit('send', 'Přihlásit');

                $form->getElementPrototype()->class('login');
		// call method signInFormSucceeded() on success
		$form->onSuccess[] = $this->signInFormSucceeded;


		return $form;
	}


        public function signInFormSucceeded($form, $values)
	{

		if ($values->remember) {
			$this->getUser()->setExpiration('14 days', FALSE);
		} else {
			$this->getUser()->setExpiration('20 minutes', TRUE);
		}

		try {
			$this->getUser()->login($values->username, $values->password);
			$this->redirect('Homepage:');

		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}


        protected function createComponentSignOutForm() {
         $form = new Nette\Application\UI\Form;
         $form->addSubmit('logout', 'Odhlásit');
          $form->getElementPrototype()->class('login');
		// call method signInFormSucceeded() on success
	$form->onSuccess[] = $this->actionOut;
         return $form;
        }

        public function actionOut()
	{
		$this->getUser()->logout();
		$this->flashMessage('Odhlášení proběhlo úspěšně');
		$this->redirect('Homepage:');
	}

  protected function createComponentMenu()
    {
        $control = new \Menu();

        return $control;
    }
   protected function createComponentInformace()
    {
        $control = new \Informace($database);

        return $control;
    }

}

@layout.latte

{control informace $user->id}

Předem děkuji za reakci :-)

mkoubik
Člen | 728
+
+1
-
  1. Tu komponentu bys měl dědit od Nette\Application\UI\Control, ne od presenteru.
  2. V createComponentInformace předávej $this->database
protected function createComponentInformace()
{
	return new \Informace($this->database);
}

3. Nepředávej $username do render(), ale předej si Nette\Security\User do té komponenty v konstruktoru. V presenteru se k němu dostaneš přes $this->getUser().

Editoval mkoubik (11. 8. 2014 11:00)

Šaman
Člen | 2666
+
+1
-

Začni tím, že si v Nette trochu rozkoukáš a naprogramuješ si něco podle jednoduchých ukázek.
Abych řekl pravdu, skončil jsem se čtením u toho, že komponentu dědíš od Presenteru. Copak komponenta 'Informace' je BasePresenter?

Nezmo
Člen | 7
+
0
-

Děkuji za odpovědi.
Nette\Application\UI\Control jsem zprvu měl, ale ze zoufalství jsem už psal nesmysly.
Doopravdy stačilo

protected function createComponentInformace()
{
    return new \Informace($this->database);
}

A já nad tím přemýšlel sto let. Děkuji moc :-)