Nette Forms style, zrušení labelu, bezpečnost
- ondrusu
- Člen | 118
Ahojte, měl bych pár dotazů ohledně Nette\Forms
- 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>
??
- 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ěď.
- ondrusu
- Člen | 118
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é??
- ondrusu
- Člen | 118
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
precti si dokumentaci https://doc.nette.org/cs/forms#…
- v presenterech musis vytvaret Nette\Application\UI\Form
- 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)
- pri manualnim vykreslovani musis zacit form makrem
{form}
nebo<form n:name>
viz https://doc.nette.org/cs/forms#…
- ondrusu
- Člen | 118
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.
- CZechBoY
- Člen | 3608
@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
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ší.