kdyby/forms-replicator Nefunguje mi tlačítko, co má přidat prvky

ondrapech
Člen | 49
+
0
-

Ahoj, potřeboval ybch radu, co dělám špatně. Zahrnul jsem kdyby/forms-replicator a podle návodu zkusil zprovoznit. Vše vypadá že funguje jen tlačítko, co má přidávat prvky v replicatoru nedělá nic.

public function createComponentProductForm()
{
    $form = new Form();

    // Společné nastavení
    $form->addSelect(
        'type',
        'Typ produktu',
        [
            'software' => 'Software',
            'hardware' => 'Hardware',
            'action_set' => 'Akční sada',
            'partner_service' => 'Partnerská služba',
        ])
        ->addCondition($form::EQUAL, 'partner_service')->toggle('partner_service')
        ->addCondition($form::IS_IN, ['action_set', 'partner_service'])->toggle('action_set');

    $form->addText('code', 'Kód produktu');
    $form->addText('name', 'Název produktu');
    $form->addText('label', 'Popis produktu');
    $form->addText('price_without_vat', 'Cena bez DPH');
    $form->addCheckbox('active', 'Aktivní');
    $form->addSubmit('submitForm', 'Uložit produkt');

    //Nastvení akční sady
    $actionSet = $form->addContainer('action_set');
    $actionSet->addMultiSelect('products', 'Produkty v sadě', ['Produkt1', 'Produkt2']);

    //Nastavení partnerské služby
    $partnerService = $form->addContainer('partner_service');
    $partnerService->addCheckbox('requires_confirmation', 'Vyžaduje potvrzení zákazníkem');
    $partnerService->addDynamic('options', function (Container $container) {
        $container->addText('name', 'Název');
        $container->addSelect(
            'type',
            'Typ',
            [
                'input' => 'Krátký text',
                'texarea' => 'Dlouhý text',
                'select' => 'Výběz z možností',
                'checkbox' => 'Zaškrtávací políčko',
            ]
        );
        $container->addCheckbox('required', 'Povinný');
        $container->addSubmit('remove', 'Remove')
            ->setValidationScope(false) # disables validation
            ->onClick[] = [$this, 'removePartnerServiceOption'];
    });
    $partnerService->addSubmit('addOption', 'Přidat další možnost +')
        ->onClick[] = [$this, 'addPartnerServiceOption'];

    return $form;
}

public function addPartnerServiceOption(SubmitButton $button)
{
    $button->parent->createOne();
}

public function removePartnerServiceOption(SubmitButton $button)
{
    $option = $button->parent->parent;
    $option->remove($button->parent, TRUE);
}

Formulář zatím rendruju automaticky ale následně bude rendrovaný manuálně. Při kliknutí na tlačítko se znovu načte stránka ale nic se do formuláře nepřidá. Uměl by mi někdo poradit, co dělám špatně.
Nenašel jsem ani žádnou alternativu za kdyby/forms-replicator :(.
Používám Nette 2.4

"php": ">= 5.6",
		"nette/application": "^2.4",
		"nette/bootstrap": "^2.4.2",
		"nette/caching": "^2.5",
		"nette/database": "^2.4",
		"nette/di": "^2.4",
		"nette/finder": "^2.4",
		"nette/forms": "^2.4",
		"nette/http": "^2.4",
		"nette/mail": "^2.4",
		"nette/robot-loader": "^2.4 || ^3.0",
		"nette/security": "^2.4",
		"nette/utils": "^2.4",
		"latte/latte": "~2.4.0",
		"tracy/tracy": "^2.4",
		"kdyby/translation": "^2.5",
		"kdyby/forms-replicator": "@dev"

Ještě jedna věc, metoda createOne() ve třídě \Nette\Forms\Controls\SubmitButton neexistuje ale v manuálu replikatoru je uváděna všude, kde jsem hledal. stejně jako metoda addDynamic() v \Nette\Forms\Form ale hádám, že ty tam přidává replikator.
Předem moc děkuji za rady.

Editoval ondrapech (11. 3. 2019 15:32)

David Matějka
Moderator | 6445
+
0
-

Ahoj, chybu tam na první pohled nevidím, ale doporučuju místo kdyby balíčků, které již nejsou udržované, používat contributte, v případě replicatoru je to form-multiplier

ondrapech
Člen | 49
+
0
-

Zkusil jsem použít form-multiplier jak jsi psal. Podle návodu v gitu. Přidávání prvků funguje dobře ale mazání téměř vůbec.
První kliknutí na remove tlačítko smaže pouze to tlačítko, prvky formuláře nechá a tlačítko u dalších prvků už potom nefunguje. S tím by mi někdo neuměl pomoct?

...
//Nastavení partnerské služby
    $partnerService = $form->addContainer('partner_service');
    $partnerService->addCheckbox('required_confirmation', 'Vyžaduje potvrzení zákazníkem');

    $multiplier = $partnerService->addMultiplier('options', function (Container $container, Form $form) {
        $container->addText('name', 'Název');
        $container->addSelect('type', 'Typ', [
            'input' => 'Krátký text',
            'textarea' => 'Textové pole',
            'select' => 'Výběr z možností',
            'checkbox' => 'Zaškrtávací políčko',
        ]);
        $container->addText('options', 'Možnosti'); //TODO Zobrazit jen když jde o selectbox
        $container->addCheckbox('required', 'Povinné');
        });

    $multiplier->addRemoveButton('Remove')
        ->addClass('btn btn-sm btn-danger');

    $multiplier->addCreateButton('Přidat další')
        ->addClass('btn btn-sm btn-success');

    return $form;
<div class="card mb-4" id="partner_service">
    {formContainer partner_service}
    <h6 class="card-header">
        Specifické údaje produktu
    </h6>
    <div class="card-body">
        <div class="form-group row">
            <label class="col-form-label col-sm-2 text-sm-right pt-sm-0">Potvrzení zákazníkem</label>
            <div class="col-sm-10">
                <label class="custom-control custom-checkbox m-0">
                    <input n:name="required_confirmation" class="custom-control-input">
                    <span class="custom-control-label">Tento produkt/službu vyžaduje potvrzení objednávky zákazníkem</span>
                </label>
            </div>
        </div>
        <div class="table- pt-4">
            <h6>Volitelná pole partnerské služby</h6>
            <table class="table">
                <thead>
                <tr>
                    <th>Název pole</th>
                    <th>Typ</th>
                    <th class="text-center">Povinné</th>
                    <th class="text-right">Možnosti</th>
                </tr>
                </thead>
                <tbody>
                <tr n:multiplier="options">
                    <td>
                        <input n:name="name" class="form-control"
                               placeholder="Zadejte název pole...">
                    </td>
                    <td>
                        <select n:name="type" class="form-control">
                        </select>
                        <input n:name="options" value="Ano,Ne"
                               data-role="tagsinput" class="form-control">
                    </td>
                    <td class="text-center">
                        <input n:name="required">
                    </td>
                    <td class="text-right">
                        {btnRemove options}
                    </td>
                </tr>
                </tbody>
                <tfoot>
                <tr>
                    <td colspan="4" class="text-right">
                        Přidat další pole
                        {btnCreate options}
                    </td>
                </tr>
                </tfoot>
            </table>
        </div>
    </div>
    {/formContainer}
</div>

Editoval ondrapech (12. 3. 2019 9:53)

ondrapech
Člen | 49
+
0
-

Další věc co by mě zajímala a v manuálu už není. Jak ten formulář použít pro editaci?
Když si tam naklikám, vyplním 5 řádků a uložím si je a pak to budu chtít editovat, tak jak tomu formuláři nasetuju že těhle 5 řádků už tam je a mají tyhle výchozí hodnoty? Normálně u formuláře použiju ->setDefaults() ale nevím jak si tam vytvořím ty prvky když jsou dynamické.

Zapp3
Člen | 8
+
0
-

Pro editaci stačí setDefaults(), ale musíš ho použít na ten container

	$form['options']->setDefaults($optionsArray)

Případně

$multiplier = $partnerService->addMultiplier('options', function (Container $container, Form $form) {
    $container->addText('name', 'Název');
    $container->addSelect('type', 'Typ', [
        'input' => 'Krátký text',
        'textarea' => 'Textové pole',
        'select' => 'Výběr z možností',
        'checkbox' => 'Zaškrtávací políčko',
    ]);
    $container->addText('options', 'Možnosti'); //TODO Zobrazit jen když jde o selectbox
    $container->addCheckbox('required', 'Povinné');
    });

$multiplier->addRemoveButton('Remove')
    ->addClass('btn btn-sm btn-danger');

$multiplier->addCreateButton('Přidat další')
    ->addClass('btn btn-sm btn-success');

	$multiplier->setValues($optionsArray);
Martk
Člen | 656
+
0
-

@ondrapech V jaké verzi to nefunguje?

ondrapech
Člen | 49
+
0
-

Nainstaloval jsem z Gitu verzi 3.0.5 ale zkoušel jsem i starší. Je možné, že to bude moje chyba.

Editoval ondrapech (12. 3. 2019 21:57)

Martk
Člen | 656
+
0
-

@ondrapech 3.0.5 obsahovalo chybu při mazání, raději bych použil 3.0.6 (contributte/forms-multiplier) ale chyba neměla by mít nic společného s tím co jsi psal. Zkoušel jsme tvůj kód a vše bylo v pohodě. Používal jsi ajax? Můžeme to vyřešit na slacku, tam jsem martk (pehapkari.slack.com)

Výchozí hodnoty takhle jak zmiňuje Zapp3, konkrétně

$form->setDefaults([
	'partner_service' => [
		'options' => [
			['name' => 'xxx', 'type' => 'input', 'options' => 'Možnost'],
			['name' => 'xxx', 'type' => 'input', 'options' => 'Možnost'],
			['name' => 'xxx', 'type' => 'input', 'options' => 'Možnost'],
		]
	]
]);

Editoval Martk (13. 3. 2019 8:55)

ondrapech
Člen | 49
+
0
-

Martk napsal(a):

@ondrapech 3.0.5 obsahovalo chybu při mazání, raději bych použil 3.0.6 (contributte/forms-multiplier) ale chyba neměla by mít nic společného s tím co jsi psal. Zkoušel jsme tvůj kód a vše bylo v pohodě. Používal jsi ajax? Můžeme to vyřešit na slacku, tam jsem martk (pehapkari.slack.com)

Výchozí hodnoty takhle jak zmiňuje Zapp3, konkrétně

$form->setDefaults([
	'partner_service' => [
		'options' => [
			['name' => 'xxx', 'type' => 'input', 'options' => 'Možnost'],
			['name' => 'xxx', 'type' => 'input', 'options' => 'Možnost'],
			['name' => 'xxx', 'type' => 'input', 'options' => 'Možnost'],
		]
	]
]);

No, asi jsem úplný retoš ale jak se zaregistruju do slacku. Slack už používám ale když dám nové prostředí tak tam nic jako registraci nevidím, jen přihlášení.

David Matějka
Moderator | 6445
+
+1
-

@ondrapech pozvánku do slacku vytvoříš na https://pehapkari.herokuapp.com/

ondrapech
Člen | 49
+
0
-

Problém byl v tom, že jsem používal špatnou třídu pro vytváření formuláře. místo \Nette\Application\UI\Form jsem měl use na \Nette\Form\Form

Setování výchozích hodnot mi nefungovalo. Ale jde pdole návodu zde https://forum.nette.org/…s-multiplier

Jen je potřeba ty dynamické prvky nasetovat před ostatními prvky formuláře. Aby se tak stalo předtím, než se vytvoří ta komponenta formuláře.

Editoval ondrapech (15. 3. 2019 10:10)

Croc
Člen | 270
+
0
-

Zdravím, za mě bych spíše doporučil WebChemistry/forms-multiplier
(nyní už contributte/forms-multiplier). Je stále ve vývoji a dokázal jsem s ním věci které Kdyby/replicator neumí.