Form submit using component's method and AJAX

3 years ago

fronty
Member | 16
+
0
-

Hi,

I have problem with form submit using component's method added as form's onSuccess callback in AJAX.

Presenter:

<?php
// Form dependencies setter
public function getForm(FT\Forms\Form $form = NULL) {
    if ($form === NULL) $form = new FT\Forms\Form();
    $form->setTranslator($this->translator);
    return $form;
}

// Component factory
protected function createComponentSearchDMSClient($name) {
    $form = $this->getForm();
    $search = new App\SearchDMSClient($this, $name, $form);
    $search->setTranslator($this->translator);
    return $search;
}


?>

SearchDMSClient.php component:

<?php

protected $form;

public function __construct(Nette\ComponentModel\IContainer $parent, $name, FT\Forms\Form $form) {
    parent::__construct($parent, $name);
    $this->setForm($form);
}

public function setForm(FT\Forms\Form $form) {
    $form->getControlElement()->addClass('ajax');
    $form->addText('ic', 'client.ic')->getControlPrototype()->setPlaceholder('client.ic');
    $form->addText('name', 'client.name')->getControlPrototype()->setPlaceholder('client.name');
    $form->addText('surname', 'client.surname')->getControlPrototype()->setPlaceholder('client.surname');

    $form->addSubmit('_send', 'forms.search');

    $form->onSuccess[] = $this->proccessForm;

    return $this;
}


public function proccessForm(FT\Forms\Form $form) {
    $values = $form->getValues(TRUE);

    echo '<pre>';
    print_r($values);
    exit();
}
?>

FT\Forms\Form is my implementation of Nette\Forms\Form, it only adds some custom control factories.

When I remove AJAX, method proccessForm is called correctly, but in AJAX mode nothing happens. AJAX request is done, but component's method isn't called at all.
I suppose, that this problem has something to do with linking to parent presenter, so I tried also late tighting (without $parent and $name parameters in SearchDMSClient's __construct), but it also worked only without AJAX.

Could you please point me to right direction?

Thank's to all in advance.

3 years ago

fronty
Member | 16
+
0
-

OK, problem solved. It wasn't a problem of linking to presenter, but form custom template. I registered _send as input[type=“submit”], but rendered as this:

<button name="_send" class="btn btn-default">
    <span class="fa fa-search"></span> {_forms.search}
</button>

That's quite a big problem of Nette forms, it doesn't have any implementation of <button> as form submit. I know there can be mismatch on server-side interpretation of sent value, but even so.

3 years ago

Pavel Kravčík
Member | 964
+
+2
-
echo '<pre>';
print_r($values);
exit();

//faster
dump($values); exit;

Did you mean n:name=“_send” or {input _send}?