Zend Framework v3, ajaxowa walidacja danych

0

Cześć.
Mam w moim module formularz kontaktowy. Chciałbym, aby po wypełnieniu formularza, dane zostały poddane walidacji asynchronicznie, ewentualne błędy zostały zwrócone, a po poprawnym wypełnieniu formularza, został on wysłany, po czym zostałyby schowany, do następnego przeładowania strony.

Filtracje danych od strony PHP, rozumiem, działa wszystko jak należy, natomiast totalnie nie mam pojęcia jak zrobić to tak, jak potrzebuję, tym bardziej w Zendzie, gdzie cały czas jestem na etapie nauki tego frameworka.

Nie potrzebuję kodu, tylko ogólne wskazówki jakie tematy mam obadać, aby wszystko zadziałało jak należy.

0

Zend jak zwykle nie grzeszy dokumentacją... Tutaj udało mi się dokopać do wersji nr 3 (chyba) https://docs.zendframework.com/zend-form/quick-start/#validating-forms.
Po prostu zrób wszystko w jQuery. Czy czego tam używasz to ajaxa z użyciem eventu on submit. W controllerze, w akcji przeprowadź normalną walidację i jak się nie powiedzie to ustaw odpowiedni http_status_code (nie wiem jak w zendzie to zrobic obiektowo) i zwróc informacje z walidacji, a jak sie powiedzie to zwroc 200 i tyle.

0

Oki mam coś takiego :
ContactController

 
        $form = $this->form;
        $request = $this->getRequest();
        $response = $this->getResponse();

        $form->setInputFilter(new ContactFormFilter());

        if (!$this->getRequest()->isPost())
            return new ViewModel(['form' => $this->form]);

        $data = $request->getPost();

        $form->setData($data);

            if (!$form->isValid())
            {
                return $response->setContent(\Zend\Json\Json::encode($form->getMessages()));
            }

        return new ViewModel(['form' => $this->form]);

contact.phtml

 script type="text/javascript">
    $(function(){
        $("#foo").submit(function(event){
            event.preventDefault();


            $.ajax({
                url: '/kontakt',
                type: 'POST',
                dataType: 'json',
                contentType: "application/json; charset=utf-8",
                async: true,
                data: ($("#foo").serialize()),
                success: function (data) {
                    console.log(data);
                    alert(data);
                },
                error: function (data) {
                    console.log(data);
                    alert(data.personal-data);
                }
            });
        })
    })
</script>

i w konsoli zwraca mi takie coś:

 
Object
-email :Object
-message :Object
-subject :Object
-personal-data :Object

Po otworzeniu któregoś z obiektu pokazuje się:

isEmpty :"Pole jest wymagane"

Tyle, że za każdym razem jest to samo, nawet po uzupełnieniu formularza.

0

Rozwiązanie:
należy usunąć contentType: "application/json; charset=utf-8",

Nie wiem dlaczego ale to działa. Chyba coś w php nie rozpoznaje danych w formacie JSON. Mógłby ktoś to wyjaśnić?

Czy dobrą praktyką jest, że w akcji contactAction tworzę osobną procedurę dla zapytania ajaxowego oraz "zwykłego" kiedy dane są filtrowane, przy wyłączonym javascripcie?

Jak to jest z bezpieczeństwem takich danych? Np gdybym chciał zrobić formularz logowania. Czy dane przesyłane w ten sposób byłyby bezpieczne?

1 użytkowników online, w tym zalogowanych: 0, gości: 1