3

I need to retrieve some information from my custom admin controller using AJAX. But when AJAX is used I get current page's entire HTML !

I simply want to get some JSON data from my custom controller. That I will implement later on.

I'm calling my custom controller from a block in this

URL .../admin/admin/order_shipment/new/order_id/...

Here is my ajax call

 var param = 'form_key='+window.FORM_KEY;
         $.ajax({
                 showLoader: true,
                 url: "admin/PostaPlus/PostaPlusShipping/HSCodes",
                 data: param,
                 type: "POST",
                // dataType: 'json'
                }).done(function (data) {                        
                    alert(data);                        
                    console.log(data);
                 });

Here is my custom controller codes,

<?php
 namespace PostaPlus\PostaPlusShipping\Controller\Adminhtml;
 use Magento\Backend\App\Action;

 class HSCodes extends \Magento\Backend\App\Action
{

   protected $resultJsonFactory;

   public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory 
        )
  {
    parent::__construct($context);
    $this->resultFactory = $resultJsonFactory;
  }

  public function execute()
  {
    //return $this->resultJsonFactory->create()->setData(['a' => 'b']);
    return 'test string';
  }

  public function indexAction(){

    //echo 'test string';
  }
}

Here is my route file,

<?xml version="1.0"?>
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
     <router id="admin_hs_codes">
      <route id="PostaPlus" frontName="PostaPlus">
        <module name="PostaPlus_PostaPlusShipping"/>
      </route>
    </router>
 </config>
  • Any reason why you have admin_hs_codes instead of admin for your router id? Try changing it and clearing cache. – Aaron Allen Mar 10 '18 at 23:27
0

Add your controller file at

PostaPlus\PostaPlusShipping\Controller\Adminhtml\PostaPlusShipping\HSCodes.php

Now your ajax url is routname\controller\action

PostaPlus\PostaPlusShipping\HSCodes

add ajax code

var param = 'ajax=1';
     $.ajax({
       showLoader: true,
       url: YOUR_URL_HERE,
       data: param,
       type: "POST",
       dataType: 'json'
         }).done(function (data) {
            console.log(data);
      });

Change controller execute method

public function execute()
  {
    return $this->resultJsonFactory->create()->setData(['a' => 'b']);
  }
  • I created PostaPlusShipping folder and moved HSCodes class file in it. I tried with same ajax URL but still I get html codes. I think something to do with my routes.xml file? Otherwise how could it returns html values even if I dont specify a URL? any suggestions on how to resolve this routes.xml? – Roshan ruzaik Feb 8 '17 at 9:22
  • update answer please check it – Prashant Valanda Feb 8 '17 at 9:30
  • After doing all these changes I'm getting html response of admin home page. My request is redirected to home page from server and getting it as html codes – Roshan ruzaik Feb 8 '17 at 9:58
0

You need to include jquery first. Use this to code to do it:

require([
    "jquery"
], function ($) {
     //your code to send ajax request here
    $.ajax({
        showLoader: true, 
        url: "admin/PostaPlus/PostaPlusShipping/HSCodes", 
        data: param,
        type: "POST", 
        dataType: 'json'
    }).done(function (data) { 
        alert(data); console.log(data); 
    });
});
  • I did added like that and functions are working fine. Only AJAX return has the problem, <script> require([ "jquery", "jquery/ui" ], function($){ hscodes= { ............... ............... }); </script> – Roshan ruzaik Feb 8 '17 at 8:34
  • Try echoing the value in controller action and use .success() function instead of .done() in your ajax call – magento noob Feb 8 '17 at 8:40
  • Tested as below but still same. changed in controller, public function execute() { //return $this->resultJsonFactory->create()->setData(['a' => 'b']); echo 'test string'; changed in JS, .success(function (data){ alert(data); console.log(data); }) But same results – Roshan ruzaik Feb 8 '17 at 8:49
  • Do you get any error ?? Try to use firebug in Firefox it will show you error – magento noob Feb 8 '17 at 8:50
  • No errors. I get output as entire current page as html codes. I check in Chrome developer tool only. – Roshan ruzaik Feb 8 '17 at 8:54
0

I don't know why but the admin Ajax requests only pass in GET anyway for me.

I had the same problem as you and I solved my problem with passing the request in GET and it works properly.

Another very important thing is to disable the admin secret key in URL otherwise you can't access to your controller.

You can remove it in : Stores > Configuration > Advanced > Admin > security > Add Secret Key to URLs > No.

Also You should use dataType: 'json' to not return the html code response.

Admin AJAX exemple :

adminhtml/templates/file.phtml

    require(['jquery', 'jquery/ui'], function($){
        var ajaxRequest;
        ajaxRequest = jQuery.ajax({
            url: "<?php echo $this->getUrl('adminrouter/folder/index'); ?>",
            type: 'GET',
            data: {id : 1}, //exemple
            dataType: 'json',
            beforeSend: function () {
                jQuery('#loader').show();
            }
        });
            //Show successfully for submit message
        ajaxRequest.done(function (response, textStatus, jqXHR) {
            jQuery("#ajaxResponse").html(response);
            jQuery('#loader').hide();
        });

            //On failure of request this function will be called
        ajaxRequest.fail(function () {
            //show error
            jQuery("#ajaxResponse").html('Oops, An error occured, please try again later!');
            jQuery('#loader').hide();
        });
    });

app/code/{Vendor}/{Module}/Controller/Adminhtml/Folder/Index.php

<?php
namespace Vendor\Module\Controller\Adminhtml\Folder;

use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Backend\App\Action;
use Magento\Framework\Controller\ResultFactory;

class Index extends Action
{
    protected $logger;

    public function __construct(
        \Magento\Backend\App\Action\Context $context
        ,\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
        \Psr\Log\LoggerInterface $logger
    ) {
        parent::__construct($context);
        $this->resultJsonFactory = $resultJsonFactory;
        $this->logger = $logger;
    }

    /**
     * @return \Magento\Framework\Controller\Result\Json
     */
    public function execute() {

        //get AjaxQuery params, GET method !
        $params = $this->getRequest()->getParams();
        $this->logger->info($params); // For debug
        \Zend_Debug::dump($params);   // For debug

        //Send response to Ajax query
        $data = 200;
        $result = $this->resultJsonFactory->create();
        return $result->setData($data);
    }
}

I hope it helps you or someone else.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.