Vlastní validace na formuláři s dynamickým obsahem

jedlicka
Člen | 61
+
0
-

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}
David Matějka
Moderator | 6445
+
0
-

Ahoj, doporucuju pouzit treba contributte/multiplier