Připojení k databázi v modulech

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

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.

dcepelik
Člen | 36
+
0
-

Zdrojáky budou určitě potřeba, bez nich se lze jen dohadovat, kde je chyba.

David Zadražil
Člen | 62
+
0
-

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
+
0
-

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
+
0
-

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.