我有一个组件和一个模块。
该模块具有:
<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'
有什么想法吗?
答案 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
引起的。