vlastni trida na vyrobu formularu

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

ahoj, chtel jsem si udelat oddelenout tridu na vyrobu formularu aby se mi toto nepletlo v Presenteru.

mam tedy

namespace AdminModule;

use \Nette\Application\UI\Form;
use \Nette\Security as NS;

class LoginBoardPresenter extends BasePresenter
{
    public function startup()
    {
        parent::startup();
        $this->session->start();
    }

    /* component factoriew */
    protected function createComponentSignInForm()
    {
        $FormFactory = new FormFactory;

        return $FormFactory->loginForm();
    }
}

a FormFactory vypada takto:

namespace AdminModule;

use \Nette\Application\UI\Form;

class FormFactory extends Form
{
    public function loginForm()
    {
        $form = new Form;

        $form->addText('username', 'Login:')
                ->setRequired('Vyplňte prosím Login.')
                ->setAttribute('placeholder', 'Vaše přihlašovací jméno');

        $form->addPassword('password', 'Heslo:')
                ->setRequired('Vyplňte prosím heslo.')
                ->setAttribute('placeholder', 'Vaše heslo');

        $form->addSubmit('send', 'Přihlásit se')
                ->setAttribute('class', 'btn btn-large btn-warning fS140p');

        $form->addCheckbox('remember', 'Zůstat přihlášen');

        $form->onSuccess[] = callback($this, 'signInFormSubmitted');

        $form->addProtection('Vypršel časový limit, odešlete formulář znovu');

        return $form;
    }


    public function signInFormSubmitted($form)
    {
        try
        {
            $user = $this->getUser();
            $values = $form->getValues();

            if($values->remember)
            {
                $user->setExpiration('+30 days', FALSE);
            }

            $user->login($values->username, $values->password);
            $this->flashMessage('Přihlášení proběhlo úspěšně jako "'.$user->identity->jmeno.'"', 'success');
            $this->redirect('Dashboard:');

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

ale pri odeslani formulare se nemohu dostat na getUser()

Nette\MemberAccessException
Call to undefined method AdminModule\FormFactory::getUser().

problem na

		try
36:            {
37:                $user = $this->getUser();
38:                $values = $form->getValues();
39:
40:                if($values->remember)
41:                {
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Třída Form ani ta tvoje třída nemá metodu getUser(). Můžeš si do té továrny v konstruktoru předávat instanci Nette\Security\User a tu metodu si dopsat.

vosy
Člen | 532
+
0
-

Toto je blbost ale nejak nevim jak se dovolat getUser()

public function getUser()
    {
        return User->getUser();
    }
Marek Šneberger
Člen | 130
+
0
-

Třeba nějak takhle…

namespace AdminModule;

use \Nette\Application\UI\Form;

class FormFactory extends Form
{
/**
* @var \Nette\Security\User
*/
private $user;

	/**
	* @param\Nette\Security\User
	*/
	public function __construct(\Nette\Security\User $user)
	{
		parent::__construct();
		$this->user = $user;
	}
// Zbytek Tvé třídy
}
vosy
Člen | 532
+
0
-

dekuji

vosy
Člen | 532
+
0
-

mel jsem to podobne:

namespace AdminModule;

use \Nette\Application\UI\Form;
use \Nette\Security as NS;

class FormsFactory
{
    /** @var NS\User */
    public $user;

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

ale hazi mi to chybu

Recoverable Error

Argument 1 passed to AdminModule\FormFactory::__construct() must be an instance of Nette\Security\User, none given, called in /Volumes/ext1/wwwServer/vosyAdmin/v1/app/AdminModule/presenters/LoginBoardPresenter.php on line 19 and defined

protoze v prezenteru mam

class LoginBoardPresenter extends BasePresenter
{
    public function startup()
    {
        parent::startup();
        $this->session->start();
    }

    /* component factoriew */
    protected function createComponentSignInForm()
    {
        $FormsFactory = new FormsFactory;

        return $FormsFactory->loginForm();
    }

takze bych mel predavat NS\User i v konstructoru?
nejak:

	$FormsFactory = new FormsFactory($user);

ale kde tu $user promenou vzit v prezenteru?

Jan Tvrdík
Nette guru | 2595
+
0
-

Doporučuji ti přečíst si http://nette.merxes.cz/…ponenty.texy

vosy
Člen | 532
+
0
-

dix, ale stale se nemohu dohrabat k $this->getUser.

namespace AdminModule;

use \Nette\Application\UI\Form;
use \Nette\Security as NS;

class FormsFactory extends \Nette\Object
{
    public function loginForm()
    {
        $form = new Form;

        $form->addText('username', 'Login:')
                ->setRequired('Vyplňte prosím Login.')
                ->setAttribute('placeholder', 'Vaše přihlašovací jméno');

        $form->addPassword('password', 'Heslo:')
                ->setRequired('Vyplňte prosím heslo.')
                ->setAttribute('placeholder', 'Vaše heslo');

        $form->addSubmit('send', 'Přihlásit se')
                ->setAttribute('class', 'btn btn-large btn-warning fS140p');

        $form->addCheckbox('remember', 'Zůstat přihlášen');

        // $form->onSuccess[] = callback($this, 'signInFormSubmitted');

        $form->addProtection('Vypršel časový limit, odešlete formulář znovu');

        return $form;
    }
}
namespace AdminModule;

use \Nette\Application\UI\Form;
use \Nette\Security as NS;

class LoginBoardPresenter extends BasePresenter
{
    /** @var \FormsFactory */
    public $FormsFactory;

    public function inject(FormsFactory $formFactory)
    {
        $this->FormsFactory = $formFactory;
    }

    public function startup()
    {
        parent::startup();
        $this->session->start();
    }

    /* component factoriew */
    protected function createComponentSignInForm()
    {
        $form = $this->FormsFactory->loginForm();
        $form->onSuccess[] = function (Form $form)
        {
            try
            {
                $user = $this->getUser();
                $values = $form->getValues();
    // print_r($values);
                if($values->remember)
                {
                    $user->setExpiration('+30 days', FALSE);
                }

                $user->login($values->username, $values->password);
                $this->flashMessage('Přihlášení proběhlo úspěšně jako "'.$user->identity->jmeno.'"', 'success');
                // $this->redirect('Dashboard:');

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

        return $form;
    }
}

chyba:
Fatal Error
Using $this when not in object context

to jest na radku
$user = $this->getUser();

Jiří Nápravník
Člen | 710
+
0
-

místo

$form->onSuccess[] = function (Form $form)
        {

udělej:

$presenter = $this;
$form->onSuccess[] = function (Form $form) use ($presenter)
        {

a v těle té funkce potom místo $this->getUser() zavolej $presenter->getUset();

vosy
Člen | 532
+
0
-

Hezkyyyyyyyy, jsi nejlepsiii diky :)