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.

Illia Arefyev
la source
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;
    } 
Rakesh Jesadiya
la source
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;
LucScu
la source
1
Meilleure solution que la réponse acceptée. Merci l'homme
médina