Próbowałem zadać uniwersalne pytanie, ale było bardziej nieczytelne. Może komuś mimo to zechce się rzucić okiem, uprościłem ile się dało.
Dlaczego listener nie wysyła poprawnie produktów w linii $event->getZamowienie()->getZamowienieProdukty()
a chwilę później kontroler robi to poprawnie w linii $produkty = $zamowienie->getZamowienieProdukty()
W debugerze w obu przypadkach $produkty są typu doctrine/orm/persistentcollection i wyglądają identycznie (ale w obu przypadkach nie widać jakie dane przechowują)
//Manager, tu zapisuje dane do db i wypstrykuję dispatchera class ZamowienieManager { public function tworzZamowienie($klient) { $zamowienie = new Zamowienie(); $zamowienie->setIdklient($klient); $zamowienie->setDatazlozeniacurrent(); $this->tworzProduktyZamowienia($zamowienie); $this->em->persist($klient); $this->em->persist($zamowienie); $this->em->flush(); $this->dispatcher->dispatch(OrderPlacedEvent::NAME, new OrderPlacedEvent($zamowienie)); $this->addFlashBag($zamowienie); } private function tworzProduktyZamowienia($zamowienie) { foreach ($this->cart as $isbn => $quantity) { $ksiazka = $this->em ->getRepository('AppBundle:Ksiazka') ->find($isbn); $zm = new ZamowienieProdukt(); $zm->setIdzamowienie($zamowienie); $zm->setIsbn($ksiazka); $zm->setTytul($ksiazka->getTytul()); $zm->setAutor($ksiazka->getAutor()); $zm->setIlosc($quantity); $this->em->persist($zm); } } public function addFlashBag($zamowienie){ $this->session->getFlashBag()->add( 'idzamowienie',$zamowienie->getIdzamowienie();); } }
//Listener. wysyła maila potwierdzającego zamówienie. POPRAWNIE WYŚWIETLA DANE ZAMÓWIENIA, NIE WYŚWIETLA PRODUKTÓW. class Listener { public function onOrderPlaced(OrderPlacedEvent $event) { ... $body = $this->renderTemplate($event); ... } private function renderTemplate($event) { return $this->twig->render( 'AppBundle:Cart:potwierdzenieMail.html.twig', http://www.php.net/array( 'zamowienie'=>$event->getZamowienie(), 'produkty'=>$event->getZamowienie()->getZamowienieProdukty() ) ); }
//kontroler, POPRAWNIE WYŚWIETLA DANE ZAMÓWIENIA, I PRODUKTY. public function potwierdzenieAction(Request $request) { $idzamowienie=$request->getSession()->getFlashBag()->get('idzamowienie'); $zamowienie = $this->getDoctrine() ->getRepository('AppBundle:Zamowienie') ->find($idzamowienie[0]); $produkty = $zamowienie->getZamowienieProdukty(); return $this->render('AppBundle:Cart:potwierdzenie.html.twig',[ 'zamowienie'=>$zamowienie, 'produkty'=>$produkty]); }
Tak się dzieje, jak do produktu przypisujesz zamówienie, ale zamówienie nie wie o tym, że coś zostało do niego "przypisane".
W tym wypadku robiąc coś takiego:
$zm->setIdzamowienie($zamowienie); [php] i zakładając coś takiego: [php] class ZamowienieProdukt { public function setIdZamowienie(Zamowienie $zamowienie) { $this->idZamowienie = $zamowienie; return $this; } }
class ZamowienieProdukt { public function setIdZamowienie(Zamowienie $zamowienie) { $this->idZamowienie = $zamowienie; $zamowienie->addZamowienieProdukt($this); return $this; } }
class Zamowienie { public function addZamowienieProdukt(ZamowienieProdukt $zamowienieProdukt) { if(false === http://www.php.net/in_array($zamowienieProdukt, $this->zamowienieProdukty, true)) { $this->zamowienieProdukty[] = $zamowienieProdukt; } return $this; } }
dziękuję, działa. (z twojego kodu pominąłem warunek in_array bo $this->zamowienieProdukty jest obiektem)
//function tworzZamowienie ... $this->em->persist($zamowienie); $this->em->flush(); $zamowienie = $this->em->getRepository('AppBundle:Zamowienie')->find($zamowienie->getIdzamowienie()); $this->dispatcher->dispatch(OrderPlacedEvent::NAME, new OrderPlacedEvent($zamowienie));
ZamowienieManager
tworzZamowienie
tworzProduktyZamowienia
addFlashBag
setIdklient
setDatazlozeniacurrent
itp.
karygodne nazewnictwo
no wiem. Zacząłem tak nazywać, więc później już poleciała lawina tych potworków. Najpierw chciałem by było zrozumiałe dla mnie (bo nikt inny miał tego nie oglądać), ale szybko okazało się że to jest niezrozumiałe też dla mnie.
$em->refresh($zamowienie);
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)