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

Symfony nie zapisuje

Object Storage Arubacloud
0 głosów
142 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,670 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,670 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 122 wizyt
pytanie zadane 29 lipca 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
1 odpowiedź 195 wizyt
0 głosów
2 odpowiedzi 178 wizyt
pytanie zadane 7 września 2022 w PHP przez Filipczak Gaduła (4,020 p.)

92,551 zapytań

141,397 odpowiedzi

319,528 komentarzy

61,936 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...