我正在开发Joomla组件TTVideo的新版本。我正在尝试使用jQuery stars插件设置评分系统。我已经解决了jQuery noconflict问题,但是对于如何安全地将投票发送给使用投票值更新数据库的帮助器类,我有些困惑。
通常,这是通过一个外部脚本完成的,该脚本仅由ajax请求访问。我想这样做,以便将其合并到我的组件中,并以这种方式将std Joomla变量提供给帮助程序类,例如getDBO()和数据库引用#__table_name。
任何有关如何实现这一目标的评论将不胜感激。谢谢。
最佳答案
这很简单。
首先,您需要创建一个具有特定任务的控制器来处理您的评级更新。为了使其安全,请验证令牌!令牌将随AJAX请求一起提供。
考虑这个例子
function rate() {
// Check for request forgeries
JRequest::checkToken() or jexit('Invalid Token');
// Get ID of item
// update rating, etc...
}
其次,在视图中创建您的AJAX请求,这显然是由某些操作触发的。
请确保将请求发送为POST,因为您将要写入数据...
您可以让外部文档中的脚本从html文档中获取值(隐藏输入中的id,token,url等),也可以使用PHP生成javascript并将其包含在头部(如下例所示)。
<?php
//
$url = JRoute::_('index.php?option=my_component&controller=my_controller');
$token = JUtility::getToken(); // <- Session token
$id = 101; // <- YOUR ID
// This will add the request to the head of the document, instead of somewhere in the document
JFactory::getDocument()->addScriptDeclaration("
.ajax({
type: 'POST',
url: $url,
data: {
'$token': '1', // <-- THIS IS IMPORTANT
'task': 'rate',
'id': $id
},
success: youSuccessFunction
});
");
?>
您可能需要修改一些内容,但这是MVC中AJAX背后的思想。
注意:您也可以调用
JRequest::checkToken('get')
,它将检查URL中的令牌。这对于读取数据的AJAX调用很有用。