使用jQuery通过Joomla MVC组件更新数据库
我正在开发Joomla组件TTVideo的新版本。我正在尝试使用jquerystars插件设置一个评级系统。我已经解决了jQuery noconflict问题,但是对于如何安全地将投票发送到使用投票值更新数据库的助手类,我有点困惑 通常这是通过一个外部脚本完成的,只有ajax请求才能访问该脚本。我希望这样做,以便将它合并到我的组件中,并且以这样一种方式使std Joomla变量可用于helper类,例如getDBO()和数据库引用#uu table_name使用jQuery通过Joomla MVC组件更新数据库,jquery,ajax,joomla,components,Jquery,Ajax,Joomla,Components,我正在开发Joomla组件TTVideo的新版本。我正在尝试使用jquerystars插件设置一个评级系统。我已经解决了jQuery noconflict问题,但是对于如何安全地将投票发送到使用投票值更新数据库的助手类,我有点困惑 通常这是通过一个外部脚本完成的,只有ajax请求才能访问该脚本。我希望这样做,以便将它合并到我的组件中,并且以这样一种方式使std Joomla变量可用于helper类,例如getDBO()和数据库引用#uu 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、令牌、url等),也可以使用PHP生成javascript并将其包含在头部(如下面的示例所示)
谢谢Alex,我昨天已经按照您上面描述的方式实现了这个。我唯一遗漏的是代币,我一定要包括在内。如果您希望从ajax请求(例如json、xml、html)接收响应,另一件需要注意的事情是,您应该将&format=raw添加到您的请求url(例如index.php?option=my_component&controller=my_controller&format=raw)中,这一点非常重要。如果您不这样做,您将在响应中使用Joomla模板html。如果添加format=raw
,将调用view.raw.php
。这是AJAX调用不需要的,将导致额外的负载和不必要的视图负载(控制器和模型对于AJAX来说已经足够了)。更好地输出任务,并使用jexit()
防止脚本进一步执行。但是,如果仍要使用该视图。。。制作与输出相关的格式。raw-raw html(view.raw.php
),json-json响应(view.json.php
),等等…format=raw不调用视图。view=raw将调用一个view,format是一个std Joomla选项,除了组件返回的内容之外,不返回任何其他html。这在返回JSON时非常有用,因为您根本不想在其中包含任何其他html/文本,否则jQuery将无法识别它。但是,如果控制器落入display()
,则会调用相应的视图。而不是view.html.php
->view.raw.php
将被加载。我看不到您的格式使用逻辑,如果您返回JSON,那么调用format=JSON
..是合乎逻辑的,但是每个人都有自己的实践和约定。祝你好运
<?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
});
");
?>