Autor Wątek: symfony4 tworzenie koszyka do sklepu internetowego  (Przeczytany 71 razy)

Lenny

  • Newbie
  • *
  • Wiadomości: 4
    • Zobacz profil
symfony4 tworzenie koszyka do sklepu internetowego
« dnia: Listopad 02, 2018, 11:52:53 »
Witam mam do zrobienia projekt(na uczelnie) sklepu internetowego, nie mam pomysłu jak zrobić sklep próbowałem zapisywac sklep do sesji użytkownika:

    public function getCartData(Request $request)
    {
        /** @var ArrayCollection $data */
        $data = $request->getSession()->get("shopCart", new ArrayCollection());
        return $data;
    }

niestety otrzymywałem błąd
Failed to start the session because headers have already been sent by "C:\Projekty\PhpStorm\shop\vendor\symfony\var-dumper\Dumper\AbstractDumper.php" at line 181.
Nie wiem w jaki sposób to naprawić, myślałem też by zapisywac koszyk użytkownika do bazy danych? Jak powinno się taki koszyk zrobić?

Michał Pipa

  • Administratorzy
  • Full Member
  • *****
  • Wiadomości: 173
    • Zobacz profil
Odp: symfony4 tworzenie koszyka do sklepu internetowego
« Odpowiedź #1 dnia: Listopad 02, 2018, 13:03:44 »
Failed to start the session because headers have already been sent by "C:\Projekty\PhpStorm\shop\vendor\symfony\var-dumper\Dumper\AbstractDumper.php" at line 181.

To jest dość typowy problem. Do działania sesji potrzebne jest ustawienie cookie. Cookie jest ustawiane w nagłówkach HTTP, a one muszą być wysłane zanim zostanie wysłany pierwszy bajt odpowiedzi HTTP. Dlatego gdy zaczniesz już wysyłać odpowiedź, to nie możesz już ustawić żadnych nagłówków.

Symfony rozwiązuje ten problem nie wysyłając nic aż do ostatniej chwili, kiedy we front kontrolerze jest wywoływana metoda getContent() na obiekcie response. Do tego momentu nie powinno się nic wysyłać, czyli w uproszczeniu nie powinieneś nigdy w aplikacji Symfony wykonywać echo, ani podobnych. Jak chcesz coś wysłać, to umieść to w obiekcie response.

Z komunikatu wynika, że wykonałeś gdzieś wcześniej var_dump, co zablokowało możliwość ustawiania nagłówków i uruchomienia sesji. Odnajdź to wywołanie var_dump i je usuń.

Cytuj
Nie wiem w jaki sposób to naprawić, myślałem też by zapisywac koszyk użytkownika do bazy danych? Jak powinno się taki koszyk zrobić?

Koszyk można zapisywać zarówno w sesji, jak i w bazie danych. Wszystko zależy od tego, co chcesz osiągnąć. Koszyk w bazie danych będzie mógł być dostępny dla wielu sesji tego samego użytkownika (np. z wielu różnych urządzeń). Zapisywanie w sesji za to jest nieco prostsze.

Lenny

  • Newbie
  • *
  • Wiadomości: 4
    • Zobacz profil
Odp: symfony4 tworzenie koszyka do sklepu internetowego
« Odpowiedź #2 dnia: Listopad 02, 2018, 15:06:26 »
Ok faktycznie ten dump() przeskadzał tylko mam jeszcze jedno pytanko bo pierwszy raz w sumie używam w synfony ajax i front:
        $(".cartBtn").click(function () {
            var id = $(this).data('id');
            console.log(id);
            $.ajax({
                type: 'POST',
                data: {
                    id: id
                },
                url: "/addToCart",
                dataType: 'json',
                async: true,
                success: function (dataAjax) {
                    console.log(dataAjax);
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    alert(thrownError);
                }
            });
            //alert($(this).data('id'));
        });
route:
addToCart:
  path:     /addToCart
  controller: App\Controller\Front\MainController::addToCart
i w funckji
    public function addToCart(Request $request)
    {
        /** @var ArrayCollection $data */
        $data = $request->getSession()->get("shopCart", new ArrayCollection());
        $data->add($request->request->get('id'));
        $request->getSession()->set("ShopCart", $data);
        return new JsonResponse(['action' => "Pomyślnie dodano przedmiot do koszyka"]);
    }
Nie wiem czemu ale otrzymuje błąd, przy ajaxie i jak wszedłem ręcznie na /addToCart o zwraca mi to głowną strone a nie tego ajaxa :/