Jak wykonać proste wywołanie ajax w Magento 2.1.0


11

Dodałem prosty przycisk w jednym z moich plików phtml.

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

Dodałem jeden niestandardowy plik js („emq.js”) z niestandardowego modułu (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');
        });
    });
//]]>
});

Po kliknięciu powyższego przycisku w konsoli drukowane jest „kliknięcie”, tzn. JQuery działa poprawnie.

Oto plik kontrolera z niestandardowego modułu 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 / tras.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>

Moje pytanie brzmi: jak zwrócić dane z tej metody kontrolera, a następnie uzyskać do nich dostęp za pośrednictwem jQuery, tj. Jak wykonać proste wywołanie ajax po kliknięciu tego przycisku.


vedu czy możesz wyjaśnić motykę, czy powinienem dodać pole wyboru cuctom na stronie szczegółów produktu. po zaznaczeniu chcę dodać 0,50 $ w cenie produktu, którą aktualizuję w koszyku do
Ashwini

Odpowiedzi:


19

poniżej znajduje się przykład, jak to zrobić. Zmień to zgodnie ze swoimi wymaganiami.

Użyłem do tego szablonu js.

Poniższy przykład utworzy listę rozwijaną w pliku phtml przy użyciu funkcji ajax.

W twoim 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;
    });

W kontrolerze

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

W twoim pliku 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 powinien być funkcją w pliku bloku, która zwraca adres URL

Mam nadzieję, że to pomaga.


Dziękuję za Twoją odpowiedź. Czy możesz mi powiedzieć, co powinienem wspomnieć w parametrze url metody $ .ajax. FrontName mojego kontrolera to wiadomości.
wedu

nazwa_modułu / indeks / news thsi będzie działać, jeśli twoja ścieżka kontrolera to [przestrzeń nazw] / [nazwa modułu] /Controller/Index/News.php Wolę przekazać adres URL z pliku szablonu, który tworzy adres URL z bloku za pomocą $ this-> getUrl
Ekta Puri

tak, w Magento 1, przekazałem również adres URL tylko z pliku szablonu. ale w magento 2 kod jquery w pliku szablonu nie działa.
wedu

Zaktualizowałem swoją odpowiedź, ma kod w pliku phtml, aby załadować ci js, ale twój js powinien znajdować się w folderze modułu
Ekta Puri

możesz uzyskać dostęp do adresu URL w js za pomocą config.AjaxUrl
Ekta Puri
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.