Špatné zpracování formuláře

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

Čau kluci,
Mám takový dost zvláštní problém mám vytvořený formulář pro přihlašování ale z nějakého nesmyslného důvodu posílá data do url a tím pádem se nic nestane…

/rs-nette/prihlaseni/?flashMessage=1&username=admin&password=aaaaaa&_submit=Přihlásit&_do=loginForm-submit

LoginPresenter.php

<?php
namespace App\CoreModule\Presenters;

use App\Forms\UserForms;
use Nette\Application\UI\Form;
use Nette\Utils\ArrayHash;
use Nette\Security\AuthenticationException;

final class LoginPresenter extends BaseCorePresenter
{

    /** @var UserForms @inject */
    private $userFormsFactory;

    /** @var array Společné instrukce pro přihlašovací a registrační formuláře. */
    private $instructions;

    /** @persistent */
    public $flashMessage;

    /**
     * Konstruktor s injektovanou továrničkou na uživatelské formuláře.
     * @param UserForms $userForms automaticky injektovaná třída továrničky na uživatelské formuláře
     */
    public function __construct(UserForms $userForms)
    {
        parent::__construct();
        $this->userFormsFactory = $userForms;

    }


    /** Volá se před každou akcí presenteru a inicializuje společné proměnné. */
    public function startup()
    {
        parent::startup();
        $this->setLayout('layoutLogin');
        $this->instructions = [
            'message' => null,
            'redirection' => ':Core:Administration:'
        ];
    }

    /**
     * Vrací komponentu přihlašovacího formuláře z továrničky.
     * @return Form
     */
    protected function createComponentLoginForm()
    {
        $this->instructions['message'] = 'Byl jste úspěšně přihlášen.';
        return $this->userFormsFactory->createLoginForm(ArrayHash::from($this->instructions));
    }

    /*
    protected function createComponentLoginForm()
    {
        //$this->instructions['message'] = 'Byl jste úspěšně přihlášen.';
        //$instructions = ArrayHash::from($this->instructions);

        $form = new Form;
        $form->addText('username', '')
                ->setAttribute('class', 'form-control')
                ->setAttribute('placeholder', 'Email address')
                ->setRequired('Zadejte username');
        $form->addPassword('password', '')
                ->setAttribute('class', 'form-control')
                ->setAttribute('placeholder', 'Password')
                ->setRequired('Zadejte password');
        $form->addSubmit('submit', 'Přihlásit')
                ->setAttribute('class', 'btn btn-default');

        $form->onSuccess[] = [$this, 'onLoginFormSuccess'];
        return $form;
    }

    public function onLoginFormSuccess(Form $form)
    {
        //$presenter = $this; // Získej presenter ve kterém je formulář umístěn.
        //$this->redirect(':Core:Login:default');
        $this->redirect(':Core:Login:default', []);
        try {
            $values = $form->getValues();
            // Extrakce hodnot z formuláře.
            $username = $values->username;
            $password = $values->password;
            //dump($username);

            // Zkusíme zaregistrovat nového uživatele.
            //if ($register) $this->user->getAuthenticator()->register($username, $password);
            $this->user->login($username, $password); // Zkusíme se přihlásit.

            // Pokud instrukce obsahují zprávu, tak ji pošli do příslušného presenteru.
            $this->flashMessage('Byl jste úspěšně přihlášen.');
            //$this->restoreRequest($this->backlink);
            //$this->redirect(':Core:Administration:');
        } catch (AuthenticationException $ex) { // Registrace nebo přihlášení selhali.
            $this->flashMessage('Něco se porouchalo');
        }
    }*/
}

Userforms.php

<?php
namespace App\Forms;

use Nette\Application\UI\Form;
use Nette\Object;
use Nette\Security\AuthenticationException;
use Nette\Security\User;
use Nette\Utils\ArrayHash;

/**
 * Class UserFormsFactory
 * @package App\Forms
 */
class UserForms extends Object
{
	/** @var User Uživatel. */
	private $user;

	/**
	 * Konstruktor s injektovanou třidou uživatele.
	 * @param User $user automaticky injektovaná třída uživatele
	 */
	public function __construct(User $user)
	{
		$this->user = $user;
	}

	/**
	 * Přihlašuje a případně registruje uživatele.
	 * @param Form $form                   formulář, ze kterého se metoda volá
	 * @param null|ArrayHash $instructions uživatelské instrukce
	 * @param bool $register               registruj nového uživatele
	 */
	private function login($form, $instructions, $register = false)
	{
		$presenter = $form->getPresenter(); // Získej presenter ve kterém je formulář umístěn.
		try {
                    $values = $form->getValues();
			// Extrakce hodnot z formuláře.
			$username = $values->username;
			$password = $values->password;

			// Zkusíme zaregistrovat nového uživatele.
			if ($register) $this->user->getAuthenticator()->register($username, $password);
			$this->user->login($username, $password); // Zkusíme se přihlásit.

			// Pokud jsou zadány uživatelské instrukce a formulář je umístěn v presenteru.
			if ($instructions && $presenter) {
				// Pokud instrukce obsahují zprávu, tak ji pošli do příslušného presenteru.
				if (isset($instructions->message)) $presenter->flashMessage($instructions->message);

				// Pokud instrukce obsahují přesměrování, tak ho proveď na příslušném presenteru.
				if (isset($instructions->redirection)) $presenter->redirect($instructions->redirection);
			}
		} catch (AuthenticationException $ex) { // Registrace nebo přihlášení selhali.
			if ($presenter) { // Pokud je formulář v presenteru.
				$presenter->flashMessage($ex->getMessage()); // Pošli chybovou zprávu tam.
				$presenter->redirect('this'); // Proveď přesměrování.
			} else { // Jinak přidej chybovou zprávu alespoň do samotného formuláře.
				$form->addError($ex->getMessage());
			}
		}
	}

	/**
	 * Vrací formulář se společným základem.
	 * @param null|Form $form formulář, který se má rozšířit o společné prky, nebo null, pokud se má vytvořit nový formulář
	 * @return Form formulář se společným základem
	 */
	private function createBasicForm(Form $form = null)
	{
		$form = $form ? $form : new Form;
		$form->addText('username', '')->setAttribute('class', 'form-control')->setAttribute('placeholder', 'Email address')->setRequired();
		$form->addPassword('password', '')->setAttribute('class', 'form-control')->setAttribute('placeholder', 'Password');
		return $form;
	}

	/**
	 * Vrací komponentu formuláře s přihlašovacími prvky a zpracování přihlašování podle uživatelských instrukcí.
	 * @param null|Form $form              komponenta formuláře, která se má rozšířit o přihlašovací prvky, nebo null, pokud se má vytvořit nový formulář
	 * @param null|ArrayHash $instructions uživatelské instrukce pro zpracování registrace
	 * @return Form komponenta formuláře s přihlašovacími prky
	 */
	public function createLoginForm($instructions = null, Form $form = null)
	{
		$form = $this->createBasicForm($form);
		$form->addSubmit('submit', 'Přihlásit')->setAttribute('class', 'btn btn-default');
		$form->onSuccess[] = function (Form $form) use ($instructions) {
                    $this->login($form, $instructions);
		};
		return $form;
	}

	/**
	 * Vrací komponentu formuláře s registračními prvky a zpracování registrace podle uživatelských instrukcí.
	 * @param null|Form $form              komponenta formuláře, která se má rozšířit o registrační prvky, nebo null, pokud se má vytvořit nový formulář
	 * @param null|ArrayHash $instructions uživatelské instrukce pro zpracování registrace
	 * @return Form komponenta formuláře s registračními prky
	 */
	public function createRegisterForm($instructions = null, Form $form = null)
	{
		$form = $this->createBasicForm($form);
		$form->addPassword('password_repeat', 'Heslo znovu')
			->addRule(Form::EQUAL, 'Hesla nesouhlasí.', $form['password']);
		$form->addText('y', 'Zadejte aktuální rok (antispam)')->setType('number')->setRequired()
			->addRule(Form::EQUAL, 'Špatně vyplněný antispam.', date("Y"));
		$form->addSubmit('register', 'Registrovat');
		$form->onSuccess[] = function (Form $form) use ($instructions) {
			$this->login($form, $instructions, true);
		};
		return $form;
	}
}

Nevíte někdo čím by to mohlo být způsobené?

A také když se pokusím prozkoumat prvek tak v form mám jako → <form novalidate="">

Předem všem děkuji za rady.

S pozdravem
jAk3r

Editoval jAkErCZ (2. 4. 2017 22:40)

jAkErCZ
Člen | 324
+
0
-

Vyřešeno!

Problém byl že v @login.lette nebyla definována metoda post…

CZechBoY
Člen | 3608
+
+1
-

@jAkErCZ renderujes form rucne nebo jak se to mohlo stat?

Zuben45
Člen | 268
+
0
-

renderuje automaticky přes

{control loginForm}

chyba bude možná někde v configu, že by tam něco přepisoval.

je ale divné, že jsme zkoušeli

$form->setMethod('post');

a také to nefungovalo, jedině možná cache no.

Editoval Zuben45 (3. 4. 2017 16:35)