0

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

这个模块有:

<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 Object] has no method 'addEvent'

任何想法?

4

2 回答 2

1

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

如果是这样,基于“名称”的选择器,例如 $('signup') 将根本不起作用,添加诸如 form 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() 正在尝试加载模型“注册”并在其上调用方法 addUser();并且注册功能只是坐在那里,没有被您的代码调用。

Joomla 参数:

X &template=raw 

应该替换为

&format=raw 

或者

&tmpl=component 
于 2013-08-25T07:37:56.083 回答
0

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

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

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

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

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

于 2013-08-25T00:30:31.913 回答