Vlastní validační pravidlo ve formuláři skončí s chybou
- jedlicka
- Člen | 72
Ahoj,
měl bych dotaz na vlastní validace furmulářů.
Chtěl bych, aby se před odesláním formuláře zkontrolovalo např. zadání
jména, zda zadané jméno náhodou již v databázi neexistuje a pokud ano,
aby vyskočil klasický alert validace.
Jak toto udělat?
Napadlo mě to udělat buď vlastním pravidlem rule
na daném
prvku formuláře nebo pomocí onValidate
na celém
formuláři.
Zkoušel jsem obě varianty, ale vždy my to skončí na stejné chybě
v latte: Undefined variable: customer
, tzn. že po vyhodnocení
této validace se znova zavolá actionAddContract, ale
$do
(stejně tak $id
) je null, takže se nenastaví
$customer
do šablony. Ta validace se zavolá, to je OK, ale
nevím, proč se při té validaci (ať už rule
nebo
onValidate
) volá action<>
(stejně tak i
render<>
), když při vyhodnocování standardního pravidla
se nevolá.
Presenter:
<?php
public function actionAddContract()
{
$do = $this->getParameter('do');
if (empty($do)) {
$id = $this->getParameter('id');
$customer = $this->database->table('customers')->where(array('id' => $id))->limit("1")->fetch();
if ($customer) {
$this->template->customer = $customer;
}
}
}
protected function createComponentAddContractForm()
{
$form = new Form;
$input = $form->addText("name", "name:")->setAttribute('class', 'form-control')->setAttribute('placeholder', '');
// validace pomoci rule
$input->addRule([$this, 'validateName']);
/*
validace pomoci onValidate
$form->onValidate[] = function (Form $form) {
$nameField = $form['name'];
$nameValue = $nameField->getValue();
if ($nameValue !== 'nazev') {
$nameField->addError('Nazev není "nazev"');
return;
}
};
*/
$form->addSubmit('send', 'Pridat')->setAttribute('class', 'btn btn-success');
$form->onSuccess[] = [$this, 'addContractSubmit'];
}
public function validateName(Nette\Forms\Controls\TextInput $input)
{
if ($input->getValue() === 'nazev') { // je OK
return true;
}
$input->addError('Nazev "' . $input->getValue() . '" je špatny');
return false;
}
?>
latte:
{if $customer}
<h3 class="text-center">Nazev: {$customer}</h3>
{else}
<h3 class="text-center">Nazev: none</h3>
{/if}
{form addContractForm}
{input name}
{input send}
{/form addContractForm}
Díky za každou radu.
Martin
- David Matějka
- Moderator | 6445
Ahoj, action se volá vždy před zpracováním formuláře, viz životní cyklus presenteru, konkrétně část s „handle“
aby se ti přeneslo id, tak přidej ten parametr do signatury
public function actionAddContract()
,
tedy public function actionAddContract($id)