kdyby/forms-replicator Nefunguje mi tlačítko, co má přidat prvky
- ondrapech
- Člen | 49
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
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
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
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
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 | 661
@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
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
@ondrapech pozvánku do slacku vytvoříš na https://pehapkari.herokuapp.com/
- ondrapech
- Člen | 49
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
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í.