Как сделать простой вызов ajax в Magento 2.1.0

11

Я добавил простую кнопку в один из моих файлов phtml.

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

Я добавил один пользовательский файл js ("emq.js") из пользовательского модуля (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');
        });
    });
//]]>
});

Когда я нажимаю на вышеупомянутую кнопку, в консоли выводится «clicked», т.е. jQuery работает правильно.

Вот файл контроллера из пользовательского модуля Ved_Mymodule:

Вед \ MyModule \ Controller \ Индекс \ 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 / и т.д. / интерфейс / 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>

Мой вопрос заключается в том, как вернуть данные из этого метода контроллера, а затем получить к ним доступ через jQuery, т. Е. Как сделать простой вызов ajax после нажатия этой кнопки.

въеду
источник
Веду, пожалуйста, объясните, как я должен добавить флажок cuctom на странице сведений о продукте. При проверке я хочу добавить $ 0,50 в цене продукта, который будет обновлен в корзине до
Ashwini

Ответы:

19

Ниже приведен пример, как это сделать, пожалуйста, измените его в соответствии с вашими требованиями.

Я использовал шаблон JS для этого.

Следующий пример создаст выпадающий файл phtml с использованием функциональности ajax.

В вашем 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;
    });

В контроллере

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

В вашем файле 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 должен быть функцией в вашем файле блока, который возвращает вам URL

Надеюсь, это поможет.

Экта Пури
источник
Спасибо за ваш ответ. Можете ли вы сказать мне, что я должен упомянуть в параметре url метода $ .ajax. FrontName моего контроллера - это новости.
Веду
modulefrontname / индекс / Новости Thsi будет работать , если ваш путь контроллера [имена] / [имя_модуль] /Controller/Index/News.php Я предпочитаю передать URL из файла шаблона , который создает URL из блока с помощью $ this-> GetURL
Ekta Пури
да, в magento 1 я также передал URL только из файла шаблона. но в magento 2 jquery код в файле шаблона не работает.
Веду
Я обновил свой ответ, он содержит код в phtml-файле для загрузки js, но ваши js должны быть в папке вашего модуля
Ekta Puri
Вы можете получить доступ к URL в js с помощью config.AjaxUrl
Puri