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

Symfony nie zapisuje

0 głosów
52 wizyt
pytanie zadane 4 dni temu w PHP, Symfony, Zend przez michal_php Gaduła (3,950 p.)
edycja 4 dni temu 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ź 4 dni temu przez suice Gaduła (3,820 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.

komentarz 4 dni temu przez Ehlert Mędrzec (170,260 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ź 4 dni temu przez Ehlert Mędrzec (170,260 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 38 wizyt
pytanie zadane 29 lipca w PHP, Symfony, Zend przez michal_php Gaduła (3,950 p.)
0 głosów
1 odpowiedź 69 wizyt
–1 głos
1 odpowiedź 80 wizyt
pytanie zadane 1 czerwca w PHP, Symfony, Zend przez michal_php Gaduła (3,950 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

66,984 zapytań

113,890 odpowiedzi

241,331 komentarzy

46,940 pasjonatów

Przeglądających: 239
Pasjonatów: 9 Gości: 230

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...