Dotazování z databáze v komponentě a následné vytvoření komponenty v BasePresenteru
- Nezmo
- Člen | 7
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
- Tu komponentu bys měl dědit od
Nette\Application\UI\Control
, ne od presenteru. - 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)