Prihlasenie z ineho presenteru

nord
Člen | 52
+
0
-

Zdravim, mam v latte formular

<form method="post" action="loginUser" id="form-login-navi">
  ... Tu mam vkresleny form cez html tagy
  <div class="form-group">
      <input type="submit" name="form-submit" value="Prihlásiť">
  </div>
</form>

Chcel by som urobit to, ze ked kliknem na prihlasit, tak chcem zavolat akciu presentera sign.. Ako to mozem urobit ak nechcem aby sa mi nieco renderovalo, ale len sa vykona akcia a refreshne stranka ?
V inom frameworku som pouzil neico taketo

public function actionLogIn()
{
	cez post som dostal data
	spracoval
	refreshol
}

jednoducho ziadne renderovanie nic, len vykonanie akcie a refresh

Editoval nord (7. 8. 2017 10:02)

matopeto
Člen | 395
+
0
-

Normalne zavolas iba:

$this->redirect("Foo:bar"); pripadne $this->redirect("this");

Pripadne keby ta to pytalo template, co by nemalo, mozes zavolat este:

$this->terminate(); to ukonci prezenter, ale po redirecte by mal tiez…

Editoval matopeto (7. 8. 2017 10:11)

nord
Člen | 52
+
0
-

Ja ale neviem ako sa do tej akcie dostat :) vo <form action=""> ma byt nieco co mi to zabezpeci ? pripadne iny sposob ?

Zle som sa vyjadril, aky mam problem

Editoval nord (7. 8. 2017 12:59)

matopeto
Člen | 395
+
+1
-

Doporucujem zacat dokumentaciou od zaciatku: https://doc.nette.org/cs/

Potom formulare: https://doc.nette.org/cs/forms

A sandboxom: https://github.com/nette/sandbox kde mas prihlasovaci formular rovno implementovanim

nord
Člen | 52
+
-2
-

To co som chcel vediet bolo toto

<form method="post" action="{link Sign:login}" id="form-login-navi">

a presenter

public function actionLogin()
{
   $post = $this->getHttpRequest()->getPost();
}

Uz to ide, ale aj tak dakujem za pomoc
Som v nette novy a neviem ako to mate vy ostatny, ale z dokumentacie som sa nikdy nic nenaucil, ci uz v nette, ci iny framework alebo iny jazyk.. To co mi vzdy pomohlo bolo riesenie problemov :) Dokumentacia sa mi moc nepaci, pre cloveka ktory je v nette novy to nie je dost vysvetlene (Ale to je len moj nazor)

Editoval nord (7. 8. 2017 13:21)

matopeto
Člen | 395
+
+2
-

@nord sice ti to ide ale dobry pristup to nie je. Radsej sa nauc framework a urob to poriadne – cez nette formulare. Nette sa ti postara o rozne bezpecnostne veci – escapovanie, kontrola hodnot, server side validacia, (aj javascript validacia) xsrf, Ktore takto musis riesit sam.

Bez dokumentacie a pochopenia frameworku daleko nezajdes a ked ano tak to pravdepodobne bude nic moc nebezpecny kod ktory bude ohybat nette (bez urazky)

Pokial sa ti dokumentacia nepaci, prejdi si aspon ten sandbox.

Pavel Kravčík
Člen | 1180
+
0
-

@matopeto zapomněl na ten nejdůležitější důvod… přiděláš si kurevsky moc práce do budoucna. :)

nord
Člen | 52
+
+2
-

Mate pravdu :) len ma opusta dobran nalada akosi, ale to patri k tomu ked clovek s niecim zacina..
Diki za rady, urobim to teda poriadne :)

nord
Člen | 52
+
0
-

A ak chcem mat prihlasovanie v layoute ako modalne okno, teda na kazdej stranke chcem mat moznost sa prihlasit.. Kde mam vytvorit formular ?

Spravil som si FormFactory

namespace App\Forms;

use Nette;
use Nette\Application\UI\Form;

/**
 * Class SignInFactory
 * @package App\Forms
 */
class SignInFactory extends Nette\Object
{
    /**
     * @return Form
     */
    public function create()
    {
        $form = new Form;
        $form->addGroup();
        $form->addText('mail')
             ->setAttribute('autofocus')
             ->setType('email')//html5
             ->addRule($form::MAX_LENGTH, 'E-mail môže mať maximálne %d znakov', 30)
             ->addRule($form::EMAIL, 'Zadaná hodnota nie je e-mail')
             ->setRequired('Nevyplnili ste e-mail');
        $form->addPassword('password')
             ->setRequired('Zadajte heslo');
        $form->addSubmit('sendForm', 'Přihlásit');
        $form->onSuccess[] = [$this, 'loginUser'];

        return $form;
    }
}

teraz musim v kazdom prezentery ten form vytvarat pri renderovani ?

/**
* @return Nette\Application\UI\Form
*/
protected function createComponentSignForm()
{
   $form = $this->signInFormFactory->create();
}

Alebo to robim uplne zle ? :D

Editoval nord (7. 8. 2017 16:06)

matopeto
Člen | 395
+
0
-

Pridaj si to bud do spolocneho predka alebo do traity (pokial nemas rad dedenie :) ), ktoru budes pridavat tam kde potrebujes.

Editoval matopeto (7. 8. 2017 16:27)

nord
Člen | 52
+
0
-

Takze musim v kazdom presentery vytvarat component? Aj pri kazdom renderovani ?

matopeto
Člen | 395
+
0
-

nord napsal(a):

Takze musim v kazdom presentery vytvarat component? Aj pri kazdom renderovani ?

pokial to chces mat na kazdej stranke ano. Ale napisane v kode to budes mat iba raz… (Mozno je na to nejaky sposob iny ale to ja netusim :))

nord
Člen | 52
+
0
-

Do BasePresenter som hodil toto

/**
    * @return Nette\Application\UI\Form
    */
   protected function createComponentSignForm()
   {
       $form = $this->signInFactory->create();
       $form->onSuccess[] = function () {
           $email    = $this->request->getPost('mail');
           $password = $this->request->getPost('password');
           $authenticator = new Nette\Security\SimpleAuthenticator([
               $email => $password,
           ]);
           $this->getUser()->setAuthenticator($authenticator);
           $this->getUser()->login($email, $password);
       };
       $form->onSuccess[] = function () {
           $this->redirect('Homepage:');
       };

       return $form;
   }

Ten samotny login este skratim ale funguje :)

matopeto
Člen | 395
+
0
-

nerob toto:

$this->request->getPost('mail');

ale pouzi normalne values s formu vid: https://github.com/…mFactory.php#L42

este raz vravim, pozri si ten sandbox poriadne :)