Nákupní košík výpis produktů a počtem kusů
- Ivan Hradil
- Člen | 2
Ahojte,
jsem začátečník v php a s Nette pracuji chvíli nicméně něco jsem už
v něm udělal. Postupně pokračuji dál a řeším složitější úkoly.
Stále mi však některé věci nejsou jasné. Nyní řeším
nákupní košík.
V prezenteru ProductsPresenter.php mám pro přidání zboží do košíku tohle
<?php
protected function createComponentShopForm(): Multiplier
{
return new Multiplier(function ($id) {
$form = new Nette\Application\UI\Form;
$form->addText('count', 'Počet zboží:')
->addRule($form::FILLED)
->addRule($form::INTEGER);
$form->addHidden('id', $id);
$form->addSubmit('send', 'Přidat do košíku');
$form->onSuccess[] = [$this, 'shopFormSucceeded'];
return $form;
});
}
public function shopFormSucceeded(Form $form, $values)
{
$postId = $this->getParameter('id');
$section = $this->session->getSection('cart');
$section->setExpiration(0, $postId);
$section->$postId = $values->count; // přidat počet kusů
$this->redirect('Cart:default');
} ?>
Zboží se přess session předá a v prezenteru CartPresenter.php vypíše takhle.
<?php
public function renderDefault()
{
$section = $this->session->getSection('cart');
$item = array();
foreach ($section as $key => $quantity) {
$item[] = $key;
}
$this->template->posts = $this->postsManager->getPosts()->where('id', $item);
}
?>
V session se mi přidává id=>pocet kusů podel id vyhledám produkty z databáze, ale ještě nechápu jak k jednotlivým produktům v košíkům přiřadím těch počet kusů co jsem předal v session. Mohli byste mi prosím někdo poradit , jak no to jít.
Předem děkuji
Ivan
Editoval Ivan Hradil (14. 11. 2019 10:38)
- KristianSubweb
- Člen | 146
Ahoj kukni si tento prispevok tam riešia https://forum.nette.org/…ozmerne-pole
Ešte taká malá rada. Ten formulár by si si mohol odpratať do model vrstvy časom sa bude obsah tvojich presenterov zvačšovať a budeš sa v tom tahšie orietovať. Taktiež aj to spracovanie toho formu by som tiež riešil v tej modelovej vrstve. Vytvoril si napríklad CardFormFactory.php v nej si vytvor napríklad getForm() kde budeš mať obsah tej funkcii v prezentery createComponentShopForm.
A potom by som si vytvoril triedu shopFormSucceeded kde to spracuješ.
Takto nejak: CardFormFactory.php
class CardFormFactory {
public function getForm(){
$form = new Nette\Application\UI\Form;
$form->addText('count', 'Počet zboží:')
->addRule($form::FILLED)
->addRule($form::INTEGER);
return $form;
}
public function createCardFormFactory($id){
$form = $this->getForm();
$form->addHidden('id', $id);
$form->addSubmit('send', 'Přidat do košíku');
$form->onSuccess[] = [$this, 'shopFormSucceeded'];
return $form;
}
public function shopFormSucceeded(Form $form){
$data
}
}
Presenter:
protected function createComponentShopForm(): Multiplier
{
return new Multiplier(function ($id) {
return $this->cardFormFactory->createCardFormFactory($id);
});
}
:)
- Ivan Hradil
- Člen | 2
KristianSubweb napsal(a):
Ahoj kukni si tento prispevok tam riešia https://forum.nette.org/…ozmerne-pole
Ešte taká malá rada. Ten formulár by si si mohol odpratať do model vrstvy časom sa bude obsah tvojich presenterov zvačšovať a budeš sa v tom tahšie orietovať. Taktiež aj to spracovanie toho formu by som tiež riešil v tej modelovej vrstve. Vytvoril si napríklad CardFormFactory.php v nej si vytvor napríklad getForm() kde budeš mať obsah tej funkcii v prezentery createComponentShopForm.
A potom by som si vytvoril triedu shopFormSucceeded kde to spracuješ.
Takto nejak: CardFormFactory.php
class CardFormFactory { public function getForm(){ $form = new Nette\Application\UI\Form; $form->addText('count', 'Počet zboží:') ->addRule($form::FILLED) ->addRule($form::INTEGER); return $form; } public function createCardFormFactory($id){ $form = $this->getForm(); $form->addHidden('id', $id); $form->addSubmit('send', 'Přidat do košíku'); $form->onSuccess[] = [$this, 'shopFormSucceeded']; return $form; } public function shopFormSucceeded(Form $form){ $data } } Presenter: protected function createComponentShopForm(): Multiplier { return new Multiplier(function ($id) { return $this->cardFormFactory->createCardFormFactory($id); }); }
:)
Díky za radu, co se týče modelu, to mám v plánu, ale zatím to řeším v prezenteru. Až to vyřeším, tak to nějak předělám.