Nette Forms style, zrušení labelu, bezpečnost

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

Ahojte, měl bych pár dotazů ohledně Nette\Forms

  1. Mám ručně napsaný a nastylovaný formulář v default.latte. Používám styly z bootstrapu.
.
.
<div class="form-group input-group">
 <div class="form-group input-group">
  <span class="input-group-addon"><i class="fa fa-user"></i></span>
  <input type="text" name="userName" id="username" class="form-control" placeholder="Username" required>
</div>
<div class="form-group input-group">
  <span class="input-group-addon"><i class="fa fa-lock"></i></span>
  <input type="password" name="password" id="key" class="form-control" placeholder="Password" required>
</div>
  <div class="checkbox">
  <span class="character-checkbox" onclick="showPassword()"></span>
  <span class="label">Show password</span>
</div>
<input type="submit" id="btn-login" class="btn btn-lg btn-custom btn-block" value="Log in">
.
.

Chtěl bych ho přepsat do Nette\Forms, tak abych nemusel moc sahat do původního stylu.

$form = new Form;
$labelName = Html::el('span')->addAttributes(array('class' => 'input-group-addon'))->setHtml('<i class="fa fa-user"></i>');
$labelPass = Html::el('span')->addAttributes(array('class' => 'input-group-addon'))->setHtml('<i class="fa fa-lock"></i>');

$form->addText("name", $labelName)
     ->setRequired('Nemáte vyplněný login!')
     ->getControlPrototype()->class('form-control');

$form->addPassword("password", $labelPass)
     ->setRequired('Nemáte vyplněné heslo!')
     ->getControlPrototype()->class('form-control');

$form->addSubmit("signIn", 'Odeslat')
     ->getControlPrototype()->class('btn btn-lg btn-custom btn-block');

Někde jsem našel, aby to nevypisovalo do tabulky, že se dá nastavit něco takového

$renderer = $form->getRenderer();
$renderer->wrappers['controls']['container'] = null;
$renderer->wrappers['pair']['container'] = 'div';
$renderer->wrappers['pair']['.required'] = 'form-group input-group';
$renderer->wrappers['label']['container'] = null;
$renderer->wrappers['control']['container'] = null;

Teď to generuje ty inputy jak jsem je zhruba chtěl.

<div class="form-group input-group">
	<label class="required" for="frm-signInForm-password"><span class="input-group-addon"><i class="fa fa-lock"></i></span></label>

	<input type="password" name="password" class="form-control text" id="frm-signInForm-password" required data-nette-rules='[{"op":":filled","msg":"Nemáte vyplněné heslo!"}]'>
</div>

Chci se zeptat dá se nějak nastavit aby místo do <label> se to ukládalo do <span> nebo <div> ??

  1. Když použiji nette forms tak jak se to má používat, že si definuji

$form a pak v .latte si ho vypíšu {control signInForm} je to bezpečnější, než když si ho definuji ručně a parametry formuláře si předávám do prezenteru nějak takto?

$request = $this->request->getPost();
$userName = $request["userName"];
$password = $request["password"];

Děkuji za odpověď.

CZechBoY
Člen | 3608
+
0
-

Muzes klidne pouzit tu tvoji sablonu jen z kazdeho atributu input name udelas input n:name.

CZechBoY
Člen | 3608
+
0
-

Hodnoty formulare si ber az v udalosti onSuccess, onError, onValidate, …

$form = new Form;
$form->addText('username');
...
$form->onSuccess[] = function (Form $form, array $values) {
  zpracovani hodnot
};
ondrusu
Člen | 118
+
0
-

CZechBoY napsal(a):

Hodnoty formulare si ber az v udalosti onSuccess, onError, onValidate, …

$form = new Form;
$form->addText('username');
...
$form->onSuccess[] = function (Form $form, array $values) {
  zpracovani hodnot
};

Když mám ručně definovaný formulář tak to ani nejde né??

Myiyk
Člen | 321
+
0
-

Jde, ale v šabloně formuláře použij n:name u jednotlivých input
např.

<input n:name="password" id="key" class="form-control" placeholder="Password" required>

Editoval Myiyk (24. 1. 2016 13:11)

ondrusu
Člen | 118
+
0
-

Tak jsem to zkusil

$form = new \Nette\Forms\Form();

$form->addText('username')
     ->setRequired('Zadejte užvatelské jméno!')
     ->setAttribute('placeholder', 'Username')
     ->getControlPrototype()->setClass('form-control');

$form->addPassword("password");


$form->onSuccess[] = array($this, "renderAuthenticate");

v default.latte mám definovaný ten formulář ručně a vyhodilo mi to tuhle hlášku.

Notice
Undefined variable: _form

<input type="text" id="username" class="form-control" placeholder="Username" required<?php $_input = $_form["username"]; echo $_input->{method_exists($_input, 'getControlPart')?'getControlPart':'getControl'}()->addAttributes(array (
      'type' => NULL,
      'id' => NULL,
      'class' => NULL,
      'placeholder' => NULL,

Nevíš co dělám špatně?? Díky

David Matějka
Moderator | 6445
+
+1
-

precti si dokumentaci https://doc.nette.org/cs/forms#…

  1. v presenterech musis vytvaret Nette\Application\UI\Form
  2. musis to mit v createComponent* metode (to mozna mas, tady to neni videt, ale vzhledem k tomu, ze si pouzival {control} makro, tak asi jo)
  3. pri manualnim vykreslovani musis zacit form makrem {form} nebo <form n:name> viz https://doc.nette.org/cs/forms#…
ondrusu
Člen | 118
+
0
-

Aha jasně, máš pravdu … Teď už to mám dobře a funguje to díky moc.

V default.latte:

<form n:name="signInForm"...
public function createComponentSignInForm() {
    $form = new \Nette\Application\UI\Form();

    $form->addText('userName')
            ->setRequired('Zadejte užvatelské jméno!')
            ->setAttribute('placeholder', 'Username')
            ->getControlPrototype()->setClass('form-control');

    $form->addPassword("password");


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

Děkuji mnohokrát.

ondrusu
Člen | 118
+
0
-

No a když už to teda takhle hezky funguje, tak má to i třeba nějakou bezpečnostní výhodu oproti tomu co jsem tam měl před tím??
díky

Myiyk
Člen | 321
+
0
-

Výhodou je hlavně validace, kterou nette/forms dělá.

Kdybys ještě měl u formuláře ->addProtection, přidalo by to kontrolu, že formulář byl prvně odeslán prohlížeči a až potom byly obdrženy data.

To by se u přihlašování mohlo hodit.

CZechBoY
Člen | 3608
+
0
-

@ondrusu Nikde k tomu tvýmu původnímu řešení nevidim php, takže těžko říct.
Minimálně nemusíš řešit xss a pokud zapneš ochranu tak nemusíš řešit ani csrf.

btw. pokud chceš ten formulář použít ještě někde jinde tak doporučuju udělat formulář jako komponentu a přidat k ní šablonu. Potom už budeš používat v šabloně presenteru jen {control mujPrihlasovaciFormular}.

ondrusu
Člen | 118
+
0
-

Ten můj původní php tu je, hned v dotazu. Uznávám že moc srozumitelně to napsané není.
Takže jak to fungovalo před tím? Měl jsem formulář v default.latte a v něm

action="basePath/auth"

a v prezenteru byla metoda
renderAuth a v ní probíhalo zpracování

$request = $this->request->getPost();
$userName = $request["userName"];
$password = $request["password"];

a s těmi proměnnými už se dále pracovalo…
Ale už to nechám tak, jak jste mi poradili, to bude možná čistější.