Přidání rozměrů produktu v košíku za pomocí multiplieru

vanaveno
Člen | 144
+
0
-

Ahojte,
řeším teď objednávkový systém s oblečením na principu eshopu. V košíku vybraných produktů bych jim potřeboval přidat požadované rozměry. Tak například si zákazník objedná dva kusy konkrétního kabátu, mělo by mu to nabídnout dva formuláře, kde vyplní své rozměry. Když si k tomu vybere ještě dvoje kalhoty, tak by mu to mělo nabídnout opět dva formuláře, kde ovšem vyplňuje jiné parametry, takže pro každý typ oblečení, jiné typy formulářů. Asi jedinná možnost je použít multiplier ovšem jak to zboží identifikovat.

Do šablony jsem vložil tohle:

<?php
							<td colspan="5">
							{if ($item->catId)==19 }
								{for $i = 1; $i <= ($item->quantity); $i++}
								<h2>{$i}. ks - {$item->title}</h2>
								{control kabatyForm-$i}
								{/for}
							{/if}
							{if ($item->catId)==20 }
								{for $i = 1; $i <= ($item->quantity); $i++}
								<h2>{$i}. ks - {$item->title}</h2>
								{control kalhotyForm-$i}
								{/for}
							{/if}
							</td>

?>

Jelikož se počet formulářů odvíjí od počtu kusů daného produktu v košíku, nemohu k identifikaci formuláře použít id produktu, protože by se opakovalo, na druhou stranu to id potřebuji, abych obsah formulářů předal v sessions. Zkoušel jsem do multiplieru přidat ještě jeden parametr, ale házi mi to : Value must be scalar or null, object given in field ''

<?php
							<td colspan="5">
							{if ($item->catId)==19 }
								{for $i = 1; $i <= ($item->quantity); $i++}
								<h2>{$i}. ks - {$item->title}</h2>
								{control kabatyForm-$i, $item->key}
								{/for}
							{/if}
							{if ($item->catId)==20 }
								{for $i = 1; $i <= ($item->quantity); $i++}
								<h2>{$i}. ks - {$item->title}</h2>
								{control kalhotyForm-$i, $item->key}
								{/for}
							{/if}
							</td>

?>

V prezenteru má

<?php

    protected function createComponentKabatyForm(): Multiplier
{

    return new Multiplier(function ($b, $id) {
		$itemBid = 'b'.$b;
        $form = new Nette\Application\UI\Form;
		$form->addText('obvodhrudniku', 'Obvod hrudníku:')
			->setRequired('Musíte zadat obvod hrudníku');
		$form->addText('obvodpasu', 'Obvod pasu:')
			->setRequired('Musíte zadat obvod pasu');
		$form->addText('obvodboku', 'Obvod boku:')
			->setRequired('Musíte zadat obvod boku');
		$form->addText('delkarukavu', 'Délka rukávu:')
			->setRequired('Musíte zadat obvod rukávu');
		$form->addHidden('itemBid', $itemBid);
		$form->addHidden('productId', $id);
		$form->onSuccess[] = [$this, 'kabatyFormSucceeded'];

        return $form;
	});

?>

Řešil někdo něco podobného?
Předem děkuji, za každou radu.

Editoval vanaveno (21. 11. 2019 9:50)

David Matějka
Moderator | 6445
+
0
-

Ahoj, byt tebou, tak upravim UX toho procesu, aby byl formular nikoliv v kosiku, ale v miste, kde pridavas ten produkt do kosiku – tedy v detailu produktu.
a jelikoz se dle toho, co rikas, vzdy jedna o nejake atypy, tak do kosiku pridas vzdy jako polozku id prodktu a parametry nastavene ve formulari (a pripadne quantity). ke kazde polozce si pak v ramci toho kosiku (treba jen v session) vytvor unikatni id pro lepsi identifikaci.

vanaveno
Člen | 144
+
0
-

David Matějka napsal(a):

Ahoj, byt tebou, tak upravim UX toho procesu, aby byl formular nikoliv v kosiku, ale v miste, kde pridavas ten produkt do kosiku – tedy v detailu produktu.
a jelikoz se dle toho, co rikas, vzdy jedna o nejake atypy, tak do kosiku pridas vzdy jako polozku id prodktu a parametry nastavene ve formulari (a pripadne quantity). ke kazde polozce si pak v ramci toho kosiku (treba jen v session) vytvor unikatni id pro lepsi identifikaci.

Jo to by taky šlo. Vzhledem k tomu, že je to můj první eshop, který programuji, tak jsem to chtěl udělat klasický objednávací proces a rozměry produktu vložit až někde před dokončením, ale jestli by to bylo komplikované, tak dám na tebe a půjdu cestou nejmenšího odporu.

Ještě k tomu multiplieru. Takže k němu nelze dát další identifikační parametr, kromě jednoho?

Každopádně dík za radu.

David Matějka
Moderator | 6445
+
+1
-

ne, musis mu predat jen jeden identifikator. nyni by si mohl pouzit to unikatni id, ktere vytvoris pro kazdou kombinaci produkt-rozmery

ale tohle reseni jsem ani nenavrhoval z duvodu, ze je technicky snazsi (coz sice je), ale primarne ze je ten proces snazsi i z pohledu uzivatele.

Martk
Člen | 652
+
+3
-

Nečetl jsem celou diskuzi a odpovídám jen na toto:

Ještě k tomu multiplieru. Takže k němu nelze dát další identifikační parametr, kromě jednoho?

Můžeš udělat zanořené multipliery:

return new Multiplier(function ($id) {
	return new Multiplier(function ($id2) use ($id) {

	});
});
{control multiplier-firstId-secondId}