Come effettuare una semplice chiamata Ajax in Magento 2.1.0


10

Ho aggiunto un semplice pulsante in uno dei miei file phtml.

<input type='button' name='emq_zip_btn' class='emq_zip_btn' value='Go'>

Ho aggiunto un file js personalizzato ("emq.js") da un modulo personalizzato (Ved_Mymodule):

require([
    "jquery",
    "jquery/ui"
], function($v){
//<![CDATA[
    $v = jQuery.noConflict();
    $v(document).ready(function() 
    {
        console.log('jquery loaded from emq.js');
        $v(".emq_zip_btn").on('click',function(e)
        {
            console.log('clicked');
        });
    });
//]]>
});

Quando faccio clic sul pulsante sopra, "console" viene stampato nella console, ovvero jQuery funziona correttamente.

Ecco un file controller da un modulo personalizzato Ved_Mymodule:

Ved \ mymodule \ Controller \ Index \ Index.php:

<?php

namespace Ved\Mymodule\Controller\Index;

use Ved\Mymodule\Model\NewsFactory;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;

class Index extends Action
{
    /**
     * @var \Tutorial\SimpleNews\Model\NewsFactory
     */
    protected $_modelNewsFactory;

    /**
     * @param Context $context
     * @param NewsFactory $modelNewsFactory
     */
    public function __construct(
        Context $context,
        NewsFactory $modelNewsFactory
    ) {
        parent::__construct($context);
        $this->_modelNewsFactory = $modelNewsFactory;
    }

    public function execute()
    {

    }
}

Ved / mymodule / etc / frontend / routes.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/
App/etc/routes.xsd">
    <router id="standard">
        <route id="news" frontName="news">
            <module name="Ved_Mymodule" />
        </route>
    </router>

La mia domanda è come restituire i dati da questo metodo del controller e quindi accedervi tramite jQuery, ovvero come effettuare una semplice chiamata Ajax dopo aver fatto clic sul pulsante.


vedu, per favore, puoi spiegare la zappa, dovrei aggiungere la casella di controllo cuctom nella pagina dei dettagli del prodotto.Quando selezionato voglio aggiungere $ 0,50 nel prezzo del prodotto che ottengono l'aggiornamento nel carrello a
Ashwini,

Risposte:


17

di seguito è riportato l'esempio come eseguire questa operazione, modificarlo in base alle proprie esigenze.

Ho usato il modello js per questo.

L'esempio seguente creerà il menu a discesa nel file phtml usando la funzionalità ajax.

Nel tuo JS

define([
        'jquery',
        'underscore',
        'mage/template',
        'jquery/list-filter'
        ], function (
            $,
            _,
            template
        ) {
            function main(config, element) {
                var $element = $(element);
var YOUR_URL_HERE = config.AjaxUrl;
                $(document).on('click','yourID_Or_Class',function() {
                        var param = 'ajax=1';
                            $.ajax({
                                showLoader: true,
                                url: YOUR_URL_HERE,
                                data: param,
                                type: "POST",
                                dataType: 'json'
                            }).done(function (data) {
                                $('#test').removeClass('hideme');
                                var html = template('#test', {posts:data}); 
                                $('#test').html(html);
                            });
                    });
            };
        return main;
    });

Nel controller

public function __construct(
        Context $context,
        \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
    ) {

        $this->resultJsonFactory = $resultJsonFactory;
        parent::__construct($context);
    }


    public function execute()
    {
        $result = $this->resultJsonFactory->create();
        if ($this->getRequest()->isAjax()) 
        {
            $test=Array
            (
                'Firstname' => 'What is your firstname',
                'Email' => 'What is your emailId',
                'Lastname' => 'What is your lastname',
                'Country' => 'Your Country'
            );
            return $result->setData($test);
        }
    }

Nel tuo file phtml

<style>  
.hideme{display:none;}
</style>
<script type="text/x-magento-init">
        {
            "*": {
                "[Namespace]_[Modulename]/js/YOURFILE": {
                    "AjaxUrl": "<?php echo $block->getAjaxUrl(); ?>",
                }
            }
        }
</script>
<div id='test' class="hideme">
    <select>
      <% _.each(posts, function(text,value) { %>
         <option value="<%= value %>"><%= text %></option>
      <% }) %> 
     </select>
</div>

getAjaxUrl dovrebbe funzionare nel tuo file di blocco, che ti restituirà l'URL

Spero che aiuti.


La ringrazio per la risposta. Puoi dirmi cosa dovrei menzionare nel parametro url del metodo $ .ajax. Il frontName del mio controller è una novità.
vedu,

modulefrontname / index / news che funzionerà se il percorso del controller è [namespace] / [modulename] /Controller/Index/News.php Preferisco passare l'URL dal file modello che crea l'URL dal blocco usando $ this-> getUrl
Ekta Puri,

si in magento 1, ho anche passato l'URL solo dal file modello. ma in magento 2 il codice jquery nel file modello non funziona.
vedu,

Ho aggiornato la mia risposta ha il codice nel file phtml per caricarti js, ma il tuo js dovrebbe essere nella cartella del modulo
Ekta Puri

puoi accedere a url in js usando config.AjaxUrl
Ekta Puri
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.