Magento 2.1.0에서 간단한 아약스 호출을 만드는 방법


11

내 phtml 파일 중 하나에 간단한 버튼을 추가했습니다.

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

사용자 정의 모듈 (Ved_Mymodule)에서 하나의 사용자 정의 js 파일 ( "emq.js")을 추가했습니다.

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의 컨트롤러 파일입니다.

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>

내 질문은이 컨트롤러 메소드에서 데이터를 반환 한 다음 jQuery를 통해 액세스하는 방법입니다. 즉, 버튼을 클릭 한 후 간단한 아약스 호출을 만드는 방법입니다.


vedu 당신은 제품 세부 사항 페이지에 cuctom 확인란을 추가해야 괭이를 설명 할 수 있습니까? 체크했을 때 장바구니에 업데이트 할 prodct 가격에 $ 0.50를 추가하고 싶습니다
— Ashwini

답변:


19

아래는이를 수행하는 방법의 예입니다. 요구 사항에 따라 수정하십시오.

나는 이것을 위해 js 템플릿을 사용했다.

다음 예제는 ajax 기능을 사용하여 phtml 파일에 드롭 다운을 작성합니다.

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을 반환합니다.

희망이 도움이됩니다.


답변 주셔서 감사합니다. $ .ajax 메소드 의 url 매개 변수 에서 언급해야 할 사항을 말씀해 주시겠습니까? 내 컨트롤러의 frontName은 뉴스입니다.
— vedu

컨트롤러 경로가 [namespace] / [modulename] /Controller/Index/News.php이면 modulefrontname / index / news thsi가 작동합니다. $ this-> getUrl
— Ekta를

예, magento 1에서는 템플릿 파일에서만 URL을 전달했습니다. 그러나 magento 2에서는 템플릿 파일의 jquery 코드가 작동하지 않습니다.
— vedu

나는 js를로드하기 위해 phtml 파일에 코드가있는 대답을 업데이트했지만 js는 모듈 폴더에 있어야합니다
— Ekta Puri

config.AjaxUrl을 사용하여 js의 URL에 액세스 할 수 있습니다
— Ekta Puri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.