繁体   English   中英

刷新Joomla模块中的Ajax按钮

[英]Refresh Ajax Button in Joomla module

我有一个组件和一个模块。

该模块具有:

<form action="#" method="post" name="signup">
  <input type="text" name="address" id="address" value="Enter email address" size="30" />
  <input type="submit" name="submit" value="Signup" />
  <div id="msg"></div>
</form>

<script type="text/javascript">

window.addEvent('domready', function(){
  $('signup').addEvent('submit', function(e) {
    //Prevent the submit event
    new Event(e).stop();
    var address = $('address').value; 
    // check email using regex
    var address_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    if(!address_regex.test(address)){ $('msg').innerHTML = 'Please enter a valid email address.'; return; }
    new Ajax('index.php?option=com_traincomponent&task=adduser&template=raw', { 
      method: 'get', 
      data: { 'address' : address }, 
      onRequest: function() { $('msg').innerHTML = 'Please wait...'; }, 
      onComplete: function(response) { 
        if (response != '') $('msg').innerHTML = response;
        else msg.html('Please enter your email address.');
      } 
    }).request();
  });
});
</script>

组件com_traincomponent具有/controller/ajax.raw.php

    function adduser() {
  $app = JFactory::getApplication(); 
  $model = $this->getModel('signup'); 
  $data = $model->addUser(); 
  echo $data; 
  $app->close(); 
}

    function signup() {
  $address = JRequest::getVar('address', '');
  $msg = 'Thank you for registering!';
  if ($address != '') {
    $db = &JFactory::getDBO();
    $address = $db->getEscaped($address); // escape the email string to prevent sql injection
    $db->setQuery("SELECT * FROM `#__users` WHERE `email`='$address'");
    $db->Query();
    if ($db->getNumRows() != 0) $msg = 'You are already registered, thank you.';
    else {
      $db->setQuery("INSERT INTO `#__users` (`name`, `username`, `email`, `usertype`, `block`, `gid`, `registerDate`) VALUES ('default', '$address', '$address', 'Registered', 0, 18, '".date('Y-m-d H:i:s')."')");
      $db->query();
      $user_id = $db->insertid();
      $db->setQuery("INSERT INTO `#__core_acl_aro` (`section_value`, `value`, `name`) VALUES ('users', $user_id, '$address')");
      $db->query();
      $aro_id = $db->insertid();
      $db->setQuery("INSERT INTO `#__core_acl_groups_aro_map` (`group_id`, `aro_id`) VALUES (18, $aro_id)");
      $db->query();
    }
  } else {
    $msg = 'Please enter an email address.';
  }
  return $msg;
}

但是问题是,当我单击提交按钮时,它仍然刷新页面并且不执行ajax功能。

我实际上收到了错误Uncaught TypeError:对象[object Object]没有方法'addEvent'

任何想法?

在Joomla 3.1中,我们可以假定您的模板已加载jQuery,而$实际上是jQuery吗? 而代码肯定是来自基于mootools的1.5实现吗?

如果是这样的话,基于$(例如$('signup'))之类的选择器将根本无法工作,并且添加诸如id =“ fsignup”形式的id绝对有帮助。 我在下面列出了一些建议,您确实需要重构整个过程。 我可能错过了很多东西需要修复:为了使它更具可读性,我在错误的行前面加上了X

Mootools到jQuery:

X window.addEvent('domready')

可能成为

jQuery(function() { 
  // code that will be run after dom tree is initialized
});

X $('signup').addEvent('submit', function(e) { ...

会成为

$('#fsignup').submit(function(e) { ...

在交流方面

X new Ajax

可以替换为

$.get(

Joomla 1.5至3

功能 :

X $address = $db->getEscaped($address)

已弃用,应

$address = $db->quote($address);

查询是从字符串构建的,我没有检查,但是可能存在一些未转义的值,请记住

$db->quote() for values
$db->quoteName() for column names

输入解析为

X JRequest::getVar()

也不推荐使用; 但是除了不推荐使用之外,它在J2.5中的实现还不完整,因此您应该使用

JFactory::getApplication()->input->get...

功能

X $db->Query()

违抗了我的记忆,它曾经是$ db-> query,但现在应该是:

$db->execute() 

当您运行插入或更新时; 而如果要检索数据,则在$ db-> setQuery()之后,您应该

$db->loadResult()

要么

$db->loadObjectList()

或公开用于以数组等形式返回数据的其他实用程序方法之一。

最后,控制器正在调用一个您尚未提供的模型,并且控制器中有一个同名的方法(注册),也许那里也有一些混淆:

函数addUser()试图加载模型“ signup”并在其上调用方法addUser(); 而注册功能只是坐在那里,不会被您的代码调用。

Joomla参数:

X &template=raw 

应该替换为

&format=raw 

要么

&tmpl=component 

如果确实是Joomla! 1.5扩展,最有可能使用MooTools1.1.x。

在这种情况下,适当的选择器将是:

$$('form[name=signup]')

您的其余代码可能应该工作。

造成您的错误的原因是原始选择器返回null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM