Magento1.9后台自定义模块Adminhtml下Ajax URL失效求助
解决Magento 1.9 Adminhtml模块中Ajax URL传递控制器方法名的问题
你这是踩了服务器端与客户端代码混合调用的典型坑,我来帮你梳理清楚问题,再给出可行的解决方案:
你的代码核心问题
你把JS变量cat_id直接拼进了PHP的getUrl调用里——但PHP是服务器端先执行的,这时候客户端的cat_id还没被赋值,最终生成的URL里会出现?category_id=+cat_id这种无效字符串,自然无法正确传递参数。另外,Magento的getUrl有标准的参数传递方式,不需要手动拼接URL。
正确的Ajax写法
用PHP生成基础路由URL,参数通过Ajax的data属性传递,既保证控制器方法名被正确识别,又能正常传递cat_id:
function getsubcategories(cat_id){ $j.ajax({ type : 'GET', // 生成符合Magento规则的Adminhtml路由URL url: '<?php echo $this->getUrl('modulename/adminhtml_controllername/function_name'); ?>', // 通过data属性传递参数,避免混写服务器端与客户端代码 data: { category_id: cat_id }, success:function(data){ console.log(data); // 恢复你原本的业务逻辑 /* var returnedData = JSON.parse(data); var str=''; $j.each(returnedData, function(key, value) { str=str + '<option value='+key+'>'+value+'</option>'; }); $('#subcategory').html(str); */ } }); }
关键注意事项
控制器方法命名规则:Magento的控制器方法必须以
Action结尾,所以你的控制器里对应的方法应该是function_nameAction(),示例如下:class Namespace_Modulename_Adminhtml_ControllernameController extends Mage_Adminhtml_Controller_Action { public function function_nameAction() { $categoryId = $this->getRequest()->getParam('category_id'); // 这里写你的业务处理逻辑,返回对应数据 } }Adminhtml路由配置:确保你的模块在
etc/adminhtml.xml里正确配置了路由,让Magento能识别你的URL:<config> <admin> <routers> <modulename> <use>admin</use> <args> <module>Namespace_Modulename</module> <frontName>modulename</frontName> </args> </modulename> </routers> </admin> </config>权限验证:如果该控制器方法需要管理员权限,记得在
adminhtml.xml里添加对应的ACL规则,避免被Magento的权限系统拦截。URL有效性测试:你可以先在浏览器里直接访问生成的URL(比如
http://你的域名/index.php/modulename/adminhtml_controllername/function_name/?category_id=123),看看是否能返回预期数据,快速排查路由或控制器的问题。
内容的提问来源于stack exchange,提问作者pankaj
相关产品推荐
相关产品推荐

