Magento 2: Jak wysyłać dane za pomocą formularza Ajax w formie niestandardowej?

11

Czy ktoś może mi wyjaśnić, w jaki sposób mogę utworzyć prosty formularz na stronie Magento-2 do wysyłania danych za pomocą Ajax? Mam już formularz i akcję kontrolera, która wysyła dane bez użycia ajax.

Illia Arefyev
źródło
Myślę, że ten link pomoże ci kliknąć tutaj
Pankaj Sharma
spójrz na moją odpowiedź, może pomóc bardziej niż zaakceptowana
LucScu,
Pokazuje błąd do odpowiedzi> Niezdefiniowana właściwość:> przestrzeń nazw \ nazwa modułu \ Kontroler \ Indeks \ Indeks \ Przechwytywacz :: $ _ jsonHelper Udostępnij, aby poprawić odpowiedź
Rohit Chauhan

Odpowiedzi:

16

Możesz po prostu ustawić poniższy kod w pliku phtml, aby używać ajax, Musisz zmienić swój customurl w poniższym kodzie,

<script type="text/javascript">
    require(["jquery"],function($) {
        $(document).ready(function() {
            var customurl = "<?php echo $this->getUrl().'frontname/index/index'?>";
            $.ajax({
                url: customurl,
                type: 'POST',
                dataType: 'json',
                data: {
                    customdata1: 'test1',
                    customdata2: 'test2',
                },
            complete: function(response) {             
                country = response.responseJSON.default_country;
                state = response.responseJSON.state;         
                console.log(state+' '+country);   
                },
                error: function (xhr, status, errorThrown) {
                    console.log('Error happens. Try again.');
                }
            });
        });
    });
</script>

w pliku kontrolera metody execute () ,

<?php
 use Magento\Framework\Controller\ResultFactory;
 public function execute()
    {
        $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);

        $response = $this->resultFactory->create(ResultFactory::TYPE_RAW);
        $response->setHeader('Content-type', 'text/plain');
        $country = 'india';
        $state = 'gujarat';
        $response->setContents(
            $this->_jsonHelper->jsonEncode(
                [
                    'default_country' => $country,
                    'state' => $state,
                ]
            )
        );
        return $response;
    } 
Rakesh Jesadiya
źródło
4
możesz pobrać dane do kontrolera za pomocą $ this-> getRequest () -> getParam ('customdata1');
Rakesh Jesadiya
1
odpowiedź dostaje odpowiedź skryptową.
Rakesh Jesadiya
2
complete: funkcja (odpowiedź) tutaj masz odpowiedź.
Rakesh Jesadiya
1
musisz ustawić odpowiedź w powyższym $ this -> _ jsonHelper-> jsonEncode (['default_country' => $ country, 'state' => $ stan,]) kod w kontrolerze
Rakesh Jesadiya
1
w powyższym przypadku kraj i kraj default_country powracają z odpowiedzi
Rakesh Jesadiya
13

Zaakceptowana odpowiedź jest dobra, ale myślę, że może być przydatna, skorzystaj z walidacji js, którą oferuje magento core. Spróbuj użyć poniższego skryptu js:

<script type="text/javascript">
require([
    "jquery",
    "mage/mage"
],function($) {
    $(document).ready(function() {
        $('#form_id').mage(
            'validation',
            { 
                submitHandler: function(form) {
                    $.ajax({
                        url: "url to module/controller/action",
                        data: $('#form_id').serialize(),
                        type: 'POST',
                        dataType: 'json',
                        beforeSend: function() {
                            // show some loading icon
                        },
                        success: function(data, status, xhr) {
                            // data contains your controller response
                        },
                        error: function (xhr, status, errorThrown) {
                            console.log('Error happens. Try again.');
                            console.log(errorThrown);
                        }
                    });
                }
            }
        );
    });
});
</script>

Nie zapominaj, że kontroler musi zwrócić odpowiedź JSON, taką jak:

$response = $this->resultFactory
    ->create(\Magento\Framework\Controller\ResultFactory::TYPE_JSON)
    ->setData([
        'status'  => "ok",
        'message' => "form submitted correctly"
    ]);

return $response;
LucScu
źródło
1
O wiele lepsze rozwiązanie niż zaakceptowana odpowiedź. Dzięki człowieku
medyna