Formulář se neodešle ke zpracování do příslušné funkce

ondrapech
Člen | 49
+
0
-

Ahoj, aktuálně řeším problém, kdy se mi dynamický formulář při kliknutí na tlačítko odeslat nezpracuje příslušnou zadefinovanou funkcí. Už mě vážně nenapadá proč :( Je to můj první dynamický formulář, tak možná dělám něco špatně.

	public function createComponentPartnerServiceProduct()
{
    return new Multiplier(function ($productId) {

        $product = $this->productModel->getProduct($productId)->fetch();
        $inputs = $product->related('is_czech_products_partner_service.product_id')->fetchAll();
        $form = new BootstrapForm();
        //$form->ajax = true;
        $form->renderMode = RenderMode::Inline;
        //$form->setRenderer(new \AlesWita\FormRenderer\BootstrapV4Renderer);
        $form->addHidden('id')->setDefaultValue($productId);
        //TODO Vstupy formuláře dávat do containeru
        foreach ($inputs as $input) {
            switch ($input->type) {
                case 'input':
                    $in = $form->addText($input->system_name, $input->name);
                    if ($input->required) {
                        $in->setRequired("Hodnota {$input->name} je povinná!");
                    }
                    break;
                case 'select':
                    $in = $form->addSelect($input->system_name, $input->name, explode(',', $input->options));
                    if ($input->required) {
                        $in->setRequired("Hodnota {$input->name} je povinná!");
                    }
                    break;
                case 'checkbox':
                    $in = $form->addCheckbox($input->system_name, $input->name);
                    if ($input->required) {
                        $in->setRequired("Hodnota {$input->name} je povinná!");
                    }
                    break;
                case 'textarea':
                    $in = $form->addTextArea($input->system_name, $input->name);
                    if ($input->required) {
                        $in->setRequired("Hodnota {$input->name} je povinná!");
                    }
                    break;
            }
        }
        $form->addSubmit('addPartnerService', 'Přidat produkt')
            ->setBtnClass('btn btn-success btn-block');
        $form->onSuccess[] = [$this, 'PartnerServiceProductSucceeded'];
        return $form;

    });
}

public function partnerServiceProductSucceeded($form, \stdClass $values)
{
    dump($values);
}

Pouze se obnoví stránka a vyplněné hodnoty jsou v URL v GETu.. Do funkce partnerServiceProductSucceeded se aplikace ani nedostane. Předem moc díky za rady :)

manwe
Člen | 44
+
0
-

evidentne ti to skoci do onError… dej si

$form->onError[] = function($form){
	dump($form->getErrors());
});

Editoval manwe (2. 5. 2019 10:18)

ondrapech
Člen | 49
+
0
-

manwe napsal(a):

evidentne ti to skoci do onError… dej si

$form->onError[] = function($form){
	dump($form->getErrors());
});

Přidal jsem

	$form->onError[] = function() use ($form) {
    dump($form->getErrors());
};

Ale stejné chování jako onSuccess, žádnou chybu nevypsalo.

David Matějka
Moderator | 6445
+
0
-

od čeho dědí BootstrapForm?

ondrapech
Člen | 49
+
0
-

David Matějka napsal(a):

od čeho dědí BootstrapForm?

BootstrapForm dědí od Nette\Application\UI\Form

https://github.com/…trap-4-forms

MajklNajt
Člen | 498
+
0
-

zameral by som sa na to, prečo odoslané dáta vidíš v URL – nemeníš niekde (napr. pri ručnom vykreslovaní) metódu odosielania formuláru na GET?

ondrapech
Člen | 49
+
0
-

MajklNajt napsal(a):

zameral by som sa na to, prečo odoslané dáta vidíš v URL – nemeníš niekde (napr. pri ručnom vykreslovaní) metódu odosielania formuláru na GET?

Tenhle formulář se vykresluje automaticky

									<div n:if="$product->type == 'partner_service'" class="modal modals-default fade" id="partnerService{$product->id}">
    <div class="modal-dialog">
        <form class="modal-content">
            <div class="modal-body">
                <p class="text-center text-big mb-0 pb-0">{$product->name}</p>
                <p class="text-center text-muted mb-2">{$product->label}</p>
                <div class="w-100 m-auto pt-2 pb-2">
                    {control partnerServiceProduct-$product->id}
                </div>
                <button type="button" class="btn btn-default btn-block"
                        data-dismiss="modal">Zavřít
                </button>
            </div>
        </form>
    </div>
</div>
MajklNajt
Člen | 498
+
0
-

tak to vyzerá na problém toho rendereru, lebo keď form nemá method="post", tak sa odosiela metódou GET a Nette očakáva POST (kým nezavoláš $form->setMethod("get")), ak sa nemýlim…

Editoval MajklNajt (2. 5. 2019 12:38)

David Matějka
Moderator | 6445
+
+1
-

Problem je v celém tom obalovacim formu. Smaž jej. Mimochodem, potřebuješ opravdu multiplier? Máš tam nad tím nějaký foreach?

MajklNajt
Člen | 498
+
+1
-

…a teraz som si všimol, že tebe to musí vygenerovať HTML, kde máš <form>..</form> a v ňom ďalší vnoerný <form>..</form>, čiže <form class="modal-content"> asi zmeň na <div class="modal-content">

ondrapech
Člen | 49
+
0
-

David Matějka napsal(a):

Problem je v celém tom obalovacim formu. Smaž jej. Mimochodem, potřebuješ opravdu multiplier? Máš tam nad tím nějaký foreach?

Nevím, jde to udělat lépe?
Já vypisuju produkty foreachem a v případě, že je to type == ‚partner_service‘ tak při přidání na účet chci vyplnit ještě nějaké údaje. Které má každý partnerská služba jiné a načítají se z DB, tzn. potřebuju vytvořit komponentu formuláře pro ten konkrétní produkt. Ostatní produkty se prostě přidají na účet, tam ten formulář nepotřebuju. Ale nevím dopředu kolik tech formulářů bude. Myslím, že to jinak neudělám :)

ondrapech
Člen | 49
+
0
-

David Matějka napsal(a):

Problem je v celém tom obalovacim formu. Smaž jej. Mimochodem, potřebuješ opravdu multiplier? Máš tam nad tím nějaký foreach?

Problém byl v tom <form> ve view. Díky, toho bych si nevšiml, je to zkopírovanej modal z dokumentace.