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',
'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]);
}
Czy to chodzi o to, że bez przeładowania strony nie mogę wywołać powiązanej z Entity/Zamowienie (ManyToOne) kolekcji (Doctrine\Common\Collections\Collection) którą zwraca ->getZamowienieProdukty(), gdy ten obiekt (new Zamowienie) dopiero co utworzyłem i dopiero co zapisałem go flush() do bazy danych? (wiem, że to zdanie wygląda jakby było pisane przed dałna, staram się jak mogę, zasób słów jest jaki jest)
Ten post edytował porzeczki 18.10.2016, 01:24:55