• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Symfony nie zapisuje

VPS Starter Arubacloud
0 głosów
136 wizyt
pytanie zadane 9 października 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)
edycja 9 października 2019 przez michal_php

Cześć.

Mam taki problem z Symfony. Otóż mam prosty formularz składający się z 2 checkboxów. I zaznaczanie lub odznaczenie daje wartość true luub false. I po wybraniu odpowiedniej konfiguracji (na checkboxach) dla siebie zapisuje i paczka jest wysyłana ajaxem do php gdzie ma doctrine to zapisać. :

 /**
     * @Route("/owner/ajax/{user}/add" , name="owner_ajax_add")
     * @return \Symfony\Component\HttpFoundation\JsonResponse
     */
    public function ajaxRequesstSaveAction(Request $request,User $user)
    {

        $val1 = $request->request->get('mixture');
        $val2 =  $request->request->get('label');

        $user->setCreatorLabel($val2);
        $user->setAssignMixture($val1);

        $en = $this->getDoctrine()->getManager();
        $en->persist($user);
        $en->flush();

        $table=[
          $val1
          $val2
        ];

        return $this->json($table,Response::HTTP_OK);
    }

I teraz się zaczyna problem.

Otóż jak ręcznie zdefiniuję wartość true lub false w polu :

$user->setCreatorLabel(tutaj ręcznie zdefiniuję);
$user->setAssignMixture(tutaj ręcznie zdefiniuję);

to zapisuje oczywiście z taką wartością jaką tam podam.Lecz gdy chcę aby Request pobrał wartość wysłaną przez ajaxa to ciągle mi zapisuje wartoćś true.Nie zależnie czy jest zaznaczony (checkbox) czy nie to ciągle zapisuje mi wartość true.

Żeby było lepiej zrobiłem sobie dla testu :

return $this->json($table,Response::HTTP_OK);

aby sprawdzić co wartość $table (tablicy zbudowana z wartości , które przychodzą) mi zwróci.Mam taką wartość jak jest znaczony checkbox to znaczy true lub false. A mimo to jeśli mam odznaczony checkbox to doctrine nic nie robi.Można powiedzieć ,że działa tylko w jedną stronę jak w mysql zdefiniuje false to za pomocą checkboxa pozamienia na true(i tu też ciekawe ,że jak nie zaznaczę a mam false w bazie i go wyśle to i tak zapisze true) ,ale w drugą stronę już nic nie robi.Z góry dziękuje za pomoca.

Zrobiłem przed chwilą mały test:

if($creatorLabel == true){
    $val1 = 'mam pozwolenie';
}else{
    $val1 = 'brak pozowalenia';
}

i w sumie za każdym razem mi pokazuje wartość 'mam pozwolenia' nie zależnie czy jest zaznaczony czy nie.Jak to można naprawić ten warunek ?

2 odpowiedzi

+1 głos
odpowiedź 9 października 2019 przez suice Gaduła (3,960 p.)

zgaduje, ze dane, które przychodzą Ci w requescie ajaxowym są w postaci stringa - "true", "false"

jezeli nawet Twoja metoda User::setCreatorLabel  żąda booleana (albo wlasciwosc encji doctrinowej), bez ustawionego strict mode kazdy string oprócz "0" zwróci true.

możesz użyć

$user->setCreatorLabel(filter_var($request->request->get('label'), FILTER_VALIDATE_BOOLEAN));

ale mimo wszystko zainteresuj się https://symfony.com/doc/current/forms.html zamiast bezposrednio korzystac z danych z requestu http

co do:

Zrobiłem przed chwilą mały test:

if($creatorLabel == true){
    $val1 = 'mam pozwolenie';
}else{
    $val1 = 'brak pozowalenia';
}

i w sumie za każdym razem mi pokazuje wartość 'mam pozwolenia' nie zależnie czy jest zaznaczony czy nie.Jak to można naprawić ten warunek ?

Dlatego warto używać operatora '==='. Nie zostanie wykonana automatyczna konwersja typów danych, dzięki czemu dostałbyś odpowiedni wynik.

1
komentarz 9 października 2019 przez Ehlert Ekspert (212,630 p.)

Nie ma potrzeby używać filter_var'a skoro Symfony go dostarcza:

https://github.com/symfony/http-foundation/blob/master/ParameterBag.php#L153

+1 głos
odpowiedź 9 października 2019 przez Ehlert Ekspert (212,630 p.)

Framework dostarcza dużo możliwości ale nie będzie za Ciebie debugować problemu. Forum podobnie. 

Podstawą jest ogarnięcie co przychodzi w requeście.

<?php

//....

dump($request->request);
dump($request->request->get('mixture'));

Po drugie jeśli robisz takie warunki do testowania to polecam używać ===

<?php

var_dump("1"==true); //true, a to dość znaczna rozbieżność oczekiwanych typów

Przed persistem do debug możesz wrzucić też sobie swój obiekt. Będziesz mieć pewność co zapisujesz.

Podobne pytania

0 głosów
0 odpowiedzi 118 wizyt
pytanie zadane 29 lipca 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
1 odpowiedź 188 wizyt
0 głosów
2 odpowiedzi 175 wizyt
pytanie zadane 7 września 2022 w PHP przez Filipczak Gaduła (4,020 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...