获取未捕获的类型错误:当在 magento 中使用 ajax 调用控制器函数时,undefined 不是一个函数


getting Uncaught TypeError: undefined is not a function when call controller function with ajax in magento

我在admin中创建了名为createadmincontroller模块的自定义模块,它配置了config.xml.我想使用ajax从.phtml调用控制器索引函数,但它抛出错误"未捕获的类型错误:未定义不是一个函数"谁能告诉我我哪里出错了?以下是我的完整模块详细信息:

我的代码是:

JR->CreateAdminController->controllers->Adminhtml->CustomController.php

<?php
class JR_CreateAdminController_Adminhtml_CustomController extends Mage_Adminhtml_Controller_Action
{
public function indexAction()
{
if(isset($_POST['data'])){
echo 'successful';
//exit;
}
    $this->loadLayout()
        ->_setActiveMenu('mycustomtab')
        ->_title($this->__('Index Action'));

    $this->renderLayout();
}
?>

JR->CreateAdminController->etc->config.xml

<?xml version="1.0"?>
<config>
<modules>
    <JR_CreateAdminController>
        <version>1.0.0</version>
    </JR_CreateAdminController>
</modules>
<global>
    <helpers>
        <jr_createadmincontroller>
            <!-- Helper definition needed by Magento -->
            <class>Mage_Core_Helper</class>
        </jr_createadmincontroller>
    </helpers>
</global>
<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <jr_createadmincontroller before="Mage_Adminhtml">JR_CreateAdminController_Adminhtml</jr_createadmincontroller>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>
<adminhtml>
<layout>
    <updates>
  <petra>
      <file>createadmincontroller.xml</file>
     </petra>
 </updates>   
</layout>
</adminhtml>

app->design->adminhtml->default->default->layout->createadmincontroller.xml

<?xml version="1.0"?>
<layout version="0.1.0">
<adminhtml_custom_index>
    <reference name="content">
        <block type="adminhtml/template" name="createadmincontroller" template="createadmincontroller/index.phtml" />
    </reference>
</adminhtml_custom_index>
</layout>

app->design->adminhtml->default->default->template->createadmincontroller->index.phtml

<button type="button" class="scalable" onclick="test()">Click Me!</button>
<script>
function test(){
alert("wao");   
var t = '<?php echo Mage::getUrl('*/custom');   ?>';
$.ajax({
        url: "<?php echo $this->getUrl('*/custom/'); ?>"
        }).done(function() {
            alert("Hey");
        });
}
</script>

JR->CreateAdminController->Helper->Data.php

<?php
class JR_CreateAdminController_Helper_Data extends Mage_Core_Helper_Abstract
{} 
?>

您是否尝试过使用 jQuery.ajax() 而不是 $.ajax()

Magento使用Prototype JS,它已经声明了$全局变量。因此,您需要在无冲突模式下使用 jQuery,并改用jQuery

选择

    使用
  1. var $j = jQuery.noConflict();应用无冲突模式后使用$j.ajax()(感谢@b.enoit.be)
  2. 将 jQuery 代码包装在闭包中:(function($){ .... $.ajax() .... })(jQuery);(另请参阅此处 JavaScript/jQuery 闭包函数语法)

将 jQuery 添加到 Magento

更改布局 XML 文件createadmincontroller.xml

<?xml version="1.0"?>
<layout version="0.1.0">
    <adminhtml_custom_index>
        <reference name="head">
            <action method="addItem">
                <type>skin_js</type>
                <script>js/jquery-1.x.x.js</script>
            </action>
            <block type="core/text" name="jquery.noconflict">
                <action method="setText">
                    <text><![CDATA[<script type="text/javascript">var $j = jQuery.noConflict();</script>]]>
                    </text>
                </action>
            </block>
        </reference>
        <reference name="content">
            <block type="adminhtml/template" name="createadmincontroller" template="createadmincontroller/index.phtml" />
        </reference>
    </adminhtml_custom_index>
</layout>

另请参阅:https://magento.stackexchange.com/a/53905/3326