registrace v modálním okně

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

Zdravím, snažím se udělat registraci v modálním okně s využitím SignFormFactory.php, SignPresenter.php ze Sandboxu. Neustále mám problém s hláškou: Argument 1 passed to App\Forms\SignFormFactory::__construct() must be an instance of Nette\Security\User, none given, called in C:\dev\localhost_www\vinicola\app\presenters\HomepagePresenter.php on line 20 and defined
Modální okno bych rád měl jakou součást menu, které je definované v @layout.latte. Laděnka mi vypisuje chybu v souboru SignFormFactory.php, konkrétně na řádku public function __construct(User $user). Děkuji za rady.

Kód SignFormFactory.php

<?php

namespace App\Forms;

use Nette;
use Nette\Application\UI\Form;
use Nette\Security\User;


class SignFormFactory extends Nette\Object
{
	/** @var User */
	private $user;


	public function __construct(User $user)
	{
		$this->user = $user;
	}


	/**
	 * @return Form
	 */
	public function create()
	{
		$form = new Form;
		$form->addText('username', 'Uživatelské jméno: ')
			->setRequired('Please enter your username.');

		$form->addPassword('password', 'Heslo:')
			->setRequired('Please enter your password.');

		$form->addCheckbox('remember', ' Zapamatuj si mě');

		$form->addSubmit('send', 'Sign in');

		$form->onSuccess[] = array($this, 'formSucceeded');
		return $form;
	}


	public function formSucceeded(Form $form, $values)
	{
		if ($values->remember) {
			$this->user->setExpiration('14 days', FALSE);
		} else {
			$this->user->setExpiration('20 minutes', TRUE);
		}

		try {
			$this->user->login($values->username, $values->password);
		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}

}

Kód HomepagePresenter.php

<?php

namespace App\Presenters;

use Nette;
use App\Forms\SignFormFactory;



class HomepagePresenter extends BasePresenter
{

  /**
	 * Sign-in form factory.
	 * @return Nette\Application\UI\Form
	 */
	protected function createComponentSignInForm()
	{
		$form = (new SignFormFactory())->create();
		$form->onSuccess[] = function ($form) {
			$form->getPresenter()->redirect('Homepage:');
		};
		return $form;
	}


	public function actionOut()
	{
		$this->getUser()->logout();
		$this->flashMessage('You have been signed out.');
		$this->redirect('in');
	}

}
Matey
Člen | 142
+
+1
-

ahoj,

je potrebné zaregistrovať si to v config.neon

services:
	- App\Forms\SignFormFactory

a v presenteri potom

/** @var \App\Forms\SignFormFactory @inject */
public $signFormFatory;

protected function createComponentSignInForm()
{
    $form = $this->signFormFactory->create();
    $form->onSuccess[] = function ($form) {
        $form->getPresenter()->redirect('Homepage:');
    };
    return $form;
}
Neo-Mike
Člen | 22
+
0
-

V config.neon to mám. Zde to už bylo při vytvoření projektu.

services:
	- App\Model\UserManager
	- App\Forms\SignFormFactory

Pokud potom v presenteru použiji $form = $this->signFormFactory->create(); dostávám chybu Cannot read an undeclared property App\Presenters\HomepagePresenter::$signFormFactory.. Podle toho co jsem si nastudoval v dokumentaci, by se měl formulář volat právě pomocí $form = (new SignFormFactory())->create();.

CZechBoY
Člen | 3608
+
0
-

Urcite ne pomoci new v presenteru.
Do presenteru si predej tovarni tridu (factory) a na ni zavolej create() metodu.

David Matějka
Moderator | 6445
+
+2
-

precti si v doc jak ziskavat zavislosti

Azathoth
Člen | 495
+
+1
-

@Neo-Mike přes $form = (new SignFormFactory())->create() to rozhodně dělat nemůžeš, protože voláš prázdný konstruktor, ale ten konstruktor požaduje usera. Ukaž, jak vypadá ten HomepagePresenter? Měl jsi tu $signInFactory proměnnou public? A měl jsi tam inject anotaci?

Neo-Mike
Člen | 22
+
0
-

Vycházel jsem z této dokumentace: https://doc.nette.org/cs/forms#… – konkrétně sekce: Formuláře v presenterech. Takže jsem asi něco špatně pochopil.

EDIT: Takže už to funguje. Díky za nastrčení k získání závislostí. Problém byl v tom. Konkrétně jsem špatně vytvářel nový formulář (neměl jsem uvedené /** @var SignFormFactory @inject */ u proměnné SignFormFactory).

Editoval Neo-Mike (6. 3. 2016 11:58)