刷新Joomla模块中的Ajax按钮

时间:2013-08-24 20:53:38

标签: php ajax joomla

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

该模块具有:

<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功能。

我实际上收到的错误未捕获TypeError:对象[object Object]没有方法'addEvent'

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

如果是这样,基于“名称”的选择器(例如$('signup'))根本不起作用,添加诸如form id =“fsignup”之类的id肯定会有所帮助。下面我列出几个建议,你真的需要重构整个事情;我可能已经错过了很多东西需要解决的问题:为了使这个更具可读性我在前面添加了错误的行 X

Mootools to 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-&gt;查询,但现在它应该是:

$db->execute() 

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

$db->loadResult()

$db->loadObjectList()

或公开的其他实用程序方法之一,用于将数据作为数组等返回。

最后,控制器正在调用你没有提供的模型,并且控制器中有一个同名的名字(注册),也许你也有一点混淆:

函数addUser()正在尝试加载模型“注册”并在其上调用方法addUser();注册函数只是坐在那里,而不是你的代码调用。

Joomla参数:

X &template=raw 

应替换为

&format=raw 

&tmpl=component 

答案 1 :(得分:0)

如果这确实是Joomla! 1.5扩展,很可能使用MooTools 1.1.x。

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

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

其余的代码应该可以正常工作。

您的错误是由原始选择器返回null引起的。