Vlastní validace na formuláři s dynamickým obsahem
- jedlicka
- Člen | 70
Ahoj.
Měl bych dotaz na vlastní validaci ve formuláři.
Mám formulář, ve kterém se dynamicky přidávají položky pomocí ajaxu
(přes tlačítko + v dynamicControlAdd
).
Pokud použiju validaci pomocí
addRule(Form::FILLED, 'Číslo je povinné')
, a není zadané
číslo, tak se zobrazí klasický alert a přidané položky zůstanou a mohu
zadat pouze číslo.
Pokud ovšem použiju vlastní validaci pomocí
addRule([$this, 'validateNumber'], ' ')
(chci před odesláním
formuláře zjistit, zda už v DB neexistuje záznam se stejným číslem), tak
se formulář „překreslí“ a ztratí se dynamické položky, takžse se
musí přidat všechny znova.
Děkuji za jakoukoliv radu.
Presenter:
<?php
public function actionAddContract()
{
$do = $this->getParameter('do');
if (empty($do)) {
$id = $this->getParameter('id');
$customer = $this->database->table(Constants::DB_TABLE_CUSTOMERS)->where(array('id' => $id))->limit("1")->fetch();
if ($customer) {
$this->template->customer = $customer;
}
}
}
protected function createComponentAddContractForm()
{
$form = new Form;
$input = $form->addText("number", "Cislo:")->setAttribute('class', 'form-control')->setAttribute('placeholder', '');
// OK - vyskoci alert
$input->addRule(Form::FILLED, 'Číslo je povinné');
// chyba - sice se zobrazi error, ale dojde ke ztrate dynamickych prvku
$input->addRule([$this, 'validateNumber'], ' ');
$form->addSubmit('send', 'Pridat')->setAttribute('class', 'btn btn-success');
$form->onSuccess[] = [$this, 'addContractSubmit'];
}
public function validateNumber(Nette\Forms\Controls\TextInput $input)
{
$value = $input->getValue();
$item = $this->database->table(Constants::DB_TABLE_CONTRACTS)->where(array('uid' => $this->uid))->where('cislo ?', $value)->fetch();
if ($item) {
$input->addError('Číslo již existuje.');
return false;
}
return true;
}
?>
Latte:
{snippet contract}
{form addContractForm}
<ul class="errors" style="list-style-type:none" n:if="$form->hasErrors()">
<li n:foreach="$form->errors as $error" style="color: red;font-weight: bolder;">{$error}</li>
</ul>
{input number}
{control dynamicControlAdd}
{input send}
{/form addContractForm}
{/snippet contract}