Magento 2: Comment envoyer des données en utilisant le formulaire Ajax sous forme personnalisée?


11

Quelqu'un peut-il m'expliquer comment créer un formulaire simple sur la page Magento-2 pour envoyer des données à l'aide d'Ajax? J'ai déjà une action de formulaire et de contrôleur, qui envoie des données sans utiliser ajax.


Je pense que ce lien vous aidera à cliquer ici
Pankaj Sharma

regardez ma réponse, cela pourrait aider plus que celui accepté
LucScu

Affichage de l'erreur de réponse> Propriété non définie:> namespace \ modulename \ Controller \ Index \ Index \ Interceptor :: $ _ jsonHelper Veuillez partager pour améliorer la réponse
Rohit Chauhan

Réponses:


15

Vous pouvez simplement définir le code ci-dessous dans votre fichier phtml pour utiliser ajax, vous devez changer votre customurl dans le code ci-dessous,

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

à l'intérieur de la méthode execute () de votre fichier contrôleur ,

<?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;
    } 

4
vous pouvez obtenir des données dans le contrôleur en utilisant $ this-> getRequest () -> getParam ('customdata1');
Rakesh Jesadiya

1
la réponse devient dans la réponse du script.
Rakesh Jesadiya

2
complete: fonction (réponse) ici vous avez une réponse.
Rakesh Jesadiya

1
vous devez définir la réponse au-dessus de $ this -> _ jsonHelper-> jsonEncode (['default_country' => $ country, 'state' => $ state,]) code dans le contrôleur
Rakesh Jesadiya

1
dans le cas ci-dessus, default_country et l'état reviennent de la réponse
Rakesh Jesadiya

12

La réponse acceptée est bonne, mais je pense qu'il pourrait être utile de profiter de la validation js offerte par le noyau magento. Donc, essayez d'utiliser le script js ci-dessous:

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

N'oubliez pas que le contrôleur doit retourner une réponse JSON comme:

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

return $response;

1
Meilleure solution que la réponse acceptée. Merci l'homme
médina
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.