Magento 2: ¿Cómo enviar datos usando el formulario Ajax en forma personalizada?

11

¿Alguien puede explicarme cómo puedo crear un formulario simple en la página Magento-2 para enviar datos usando Ajax? Ya tengo un formulario y una acción de controlador, que envían datos sin usar ajax.

Illia Arefyev
fuente
Creo que este enlace te ayudará a hacer clic aquí
Pankaj Sharma
mira mi respuesta, podría ayudar más que la aceptada
LucScu
Mostrando error de respuesta> Propiedad indefinida:> espacio de nombres \ nombre de módulo \ Controlador \ Índice \ Índice \ Interceptor :: $ _ jsonHelper Por favor, comparta para mejorar la respuesta
Rohit Chauhan

Respuestas:

15

Puede configurar el código a continuación en su archivo phtml para usar ajax, debe cambiar su customurl en el código a continuación,

<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>

dentro del método execute () de tu archivo controlador ,

<?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
fuente
44
puede obtener datos en el controlador usando $ this-> getRequest () -> getParam ('customdata1');
Rakesh Jesadiya
1
la respuesta es obtener la respuesta del script.
Rakesh Jesadiya
2
completa: función (respuesta) aquí tienes respuesta.
Rakesh Jesadiya
1
tienes que configurar la respuesta en $ this -> _ jsonHelper-> jsonEncode (['default_country' => $ country, 'state' => $ state,]) código en el controlador
Rakesh Jesadiya
1
en el caso anterior default_country y state son el retorno de la respuesta
Rakesh Jesadiya
12

La respuesta aceptada es buena, pero creo que podría ser útil, aproveche la validación js que ofrece magento core. Entonces, intente usar el script js a continuación:

<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>

No olvide que el controlador debe devolver la respuesta JSON como:

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

return $response;
LucScu
fuente
1
Mucho mejor solución que la respuesta aceptada. Gracias hombre
medina