Připojení k databázi v modulech
- David Zadražil
- Člen | 62
Dobrý den,
mám takový menší problém, nejprve jsem si rozpracoval přihlašování a
registrace v Sandboxu a poté jsem k němu připojil stáhnutý Modules-Usage
z examples. Vše se korektně zobrazuje včetně AdminModulu a FrontModulu.
Následně jsem ale zjistil, že pokud chci provést přihlášení, neprovede
se ani výpis z databáze a nedostane se k funkci „signInFormSubmitted“,
která zpracovává formulář.
Nemohl by mne někdo navést na chybu, pokud bude třeba zveřejním zdrojové kódy.
Předem děkuji za odpovědi.
- David Zadražil
- Člen | 62
Toto je SignPresenter
<?php
namespace FrontModule;
use Nette\Application\UI,
Nette\Security as NS;
use Nette,
Nette\Debug,
Nette\Forms,
Nette\Environment,
Nette\Application\AppForm,
Nette\Web\Html,
Nette\Forms\Form,
Nette\Forms\TextArea ,
Nette\Forms\Controls;
class /*5.2*Front_*/SignPresenter extends \BasePresenter
{
/**
* Sign in form component factory.
* @return Nette\Application\UI\Form
*/
protected function createComponentSignInForm()
{
$form = new Form;
$form->addText('username')
->setRequired('Promiň, ale bez přezdívky to neumíme..')
->setAttribute('class', 'input-xlarge big vertical')
->setAttribute('placeholder', 'Sem patří tveje přezdívka..');
$form->addPassword('password')
->setRequired('Bez hesla to taky nepujde..')
->setAttribute('class', 'input-xlarge big vertical')
->setAttribute('placeholder', 'Sem patří tvé heslo..');
$form->addSubmit('login', 'Přihlásit se')->setAttribute('class', 'btn');
$form->onSuccess[] = callback($this, 'signInFormSubmitted');
return $form;
}
public function signInFormSubmitted($form)
{
try {
$values = $form->getValues();
$this->getUser()->setExpiration('+ 3 hours', FALSE);
$this->getUser()->login($values->username, $values->password);
$this->redirect('Default:');
} catch (NS\AuthenticationException $e) {
$this->flashMessage($e->getMessage(), 'error');
}
}
}
Toto je Authenticator uložený ve složece modules
<?php
use Nette\Security as NS;
/**
* Users authenticator.
*
* @author John Doe
* @package MyApplication
*/
class Authenticator extends Nette\Object implements NS\IAuthenticator
{
/** @var Nette\Database\Table\Selection */
private $users;
public function __construct(Nette\Database\Table\Selection $users)
{
$this->users = $users;
}
/**
* Performs an authentication
* @param array
* @return Nette\Security\Identity
* @throws Nette\Security\AuthenticationException
*/
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->users->where('username', $username)->fetch();
if (!$row) {
throw new NS\AuthenticationException("Uživatel s přezdívkou '$username' nebyl nalezen.", self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $this->calculateHash($password)) {
throw new NS\AuthenticationException("Neplatné heslo.", self::INVALID_CREDENTIAL);
}
unset($row->password);
return new NS\Identity($row->id, $row->role, $row->toArray());
}
/**
* Computes salted password hash.
* @param string
* @return string
*/
public function calculateHash($password)
{
return md5($password);
}
}
?>
Toto je BasePresenter
<?php
use Nette\Environment;
use Nette\Application\Presenter;
use Nette\Application\AppForm;
use Nette\Forms\Form;
use Nette\Security\AuthenticationException;
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
protected function beforeRender()
{
$this->template->viewName = $this->view;
$this->template->root = dirname(realpath(APP_DIR));
$a = strrpos($this->name, ':');
if ($a === FALSE) {
$this->template->moduleName = '';
$this->template->presenterName = $this->name;
} else {
$this->template->moduleName = substr($this->name, 0, $a + 1);
$this->template->presenterName = substr($this->name, $a + 1);
}
}
}
?>
A toto je boostrap
<?php
/**
* My Application bootstrap file.
*/
use Nette\Application\Routers\Route;
// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';
// Configure application
$configurator = new Nette\Config\Configurator;
//$configurator->setProductionMode($configurator::AUTO)
$configurator->setTempDirectory(__DIR__ . '/../temp');
// Enable Nette Debugger for error visualisation & logging
$configurator->enableDebugger(__DIR__ . '/../log');
// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
->addDirectory(APP_DIR)
->addDirectory(LIBS_DIR)
->register();
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config.neon');
$container = $configurator->createContainer();
// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
$container->router[] = new Route('index.php', 'Front:Default:default', Route::ONE_WAY);
$container->router[] = $adminRouter = new Nette\Application\Routers\RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Default:default');
$container->router[] = $frontRouter = new Nette\Application\Routers\RouteList('Front');
$frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Default:default');
} else {
$container->router = new SimpleRouter('Front:Default:default');
}
// Configure and run the application!
$container->application->run();
?>
V config.neon mám tuto konfiguraci databáze -
`services:
database: @Nette\Database\Connection
authenticator: Authenticator( @database::table(users) )`
A zde je rozložení – Obrázek
Děkuji všem za případnou podporu, už jsem bezradný :).
- Jan Endel
- Člen | 1016
Už vidím problém, jednak máš asi dost archaickou verzi Nette ne?
Každopádně pokud používáme formuláře v presenteru, používáme vždy `
Nette\Application\AppForm` (v novém Nette
Nette\Application\UI\Form
) která je určena pro presentery.
Nette\Forms\Form
je určena pro práci mimo Nette a tam se musí
zavolat ještě $form->fireEvents();
tuhle cestu ale v tvém
případě rozhodně nedoporučuju. Stačí místo Form napsat AppForm a vše se
ti rozjede.
Editoval pilec (20. 2. 2012 17:03)
- David Zadražil
- Člen | 62
Opravdu to funguje, moc děkuji. A verzi Nette mám v2.0beta, ale je určitě možné že tam mám spoustu chyb, je to teprve má první věc v Nette, přecházím z Codeigniteru.