So tätigen Sie einen einfachen Ajax-Aufruf in Magento 2.1.0


10

Ich habe eine einfache Schaltfläche in eine meiner HTML-Dateien eingefügt.

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

Ich habe eine benutzerdefinierte js-Datei ("emq.js") aus einem benutzerdefinierten Modul (Ved_Mymodule) hinzugefügt:

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');
        });
    });
//]]>
});

Wenn ich auf die obige Schaltfläche klicke, wird "geklickt" in der Konsole gedruckt, dh jQuery funktioniert ordnungsgemäß.

Hier ist eine Controller-Datei aus einem benutzerdefinierten Modul 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 / route.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>

Meine Frage ist, wie man Daten von dieser Controller-Methode zurückgibt und dann über jQuery darauf zugreift, dh wie man einen einfachen Ajax-Aufruf durchführt, nachdem diese Schaltfläche angeklickt wurde.


vedu können Sie bitte erklären, Hacke sollte ich cuctom Kontrollkästchen auf Produktdetail-Seite hinzufügen. Wenn aktiviert, möchte ich $ 0,50 in Produktpreis hinzufügen, die Update im Warenkorb zu
Ashwini

Antworten:


17

Im Folgenden finden Sie ein Beispiel dafür. Bitte ändern Sie es entsprechend Ihren Anforderungen.

Ich habe dafür die js-Vorlage verwendet.

Das folgende Beispiel erstellt ein Dropdown-Menü in Ihrer HTML-Datei mit der Ajax-Funktionalität.

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

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

IN Ihrer HTML-Datei

<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 sollte in Ihrer Blockdatei funktionieren, die Ihnen die URL zurückgibt

Hoffentlich hilft das.


Vielen Dank für Ihre Antwort. Können Sie mir sagen, was ich im URL- Parameter der $ .ajax-Methode erwähnen soll ? Der Frontname meines Controllers ist neu.
Vedu

Modulfrontname / Index / News Dies funktioniert, wenn Ihr Controller-Pfad [Namespace] / [Modulname] /Controller/Index/News.php lautet. Ich bevorzuge es, eine URL aus einer Vorlagendatei zu übergeben, die die URL aus Block mit $ this-> getUrl
Ekta erstellt Puri

Ja, in Magento 1 habe ich auch nur eine URL aus der Vorlagendatei übergeben. In Magento 2 funktioniert der Abfragecode in der Vorlagendatei jedoch nicht.
Vedu

Ich habe meine Antwort aktualisiert, sie enthält Code in der HTML-Datei, um Sie js zu laden, aber Ihre js sollten sich in Ihrem Modulordner befinden
Ekta Puri

Sie können auf URL in js zugreifen, indem Sie config.AjaxUrl
Ekta Puri
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.