Vlastní validační pravidlo ve formuláři skončí s chybou

jedlicka
Člen | 61
+
0
-

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
+
0
-

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)

jedlicka
Člen | 61
+
0
-

@DavidMatějka To je přesně ono, díky moc.