使用jQuery通过Joomla MVC组件更新数据库

Posted

技术标签:

【中文标题】使用jQuery通过Joomla MVC组件更新数据库【英文标题】:Use jQuery to update database through Joomla MVC component 【发布时间】:2011-04-28 13:59:13 【问题描述】:

我正在开发我的 Joomla 组件 TTVideo 的新版本。我正在尝试使用 jQuery stars 插件设置评分系统。我已经解决了 jQuery 无冲突问题,但是对于如何将投票 安全地 发送到使用投票值更新数据库的帮助程序类,我有点困惑。

通常这是通过一个外部脚本来完成的,该脚本只能由 ajax 请求访问。我想这样做,以便将它合并到我的组件中,并且以 std Joomla 变量可用于帮助程序类的方式,例如getDBO() 和数据库引用#__table_name。

任何有关如何实现此目的的 cmets 将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

这很简单。

首先,您需要创建一个具有特定任务的控制器来处理您的评分更新。为了确保安全,请验证令牌!该令牌将随 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 调用很有用。

【讨论】:

谢谢亚历克斯,我昨天已经按照你上面的描述实现了这个。我唯一遗漏的是令牌,我一定会包括在内。如果您想收到来自 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 - 原始 html (view.raw.php)、json - json 响应 (view.json.php) 等... format=raw 调用视图。 view=raw 会调用一个视图,format 是一个标准 Joomla 选项,除了组件返回的内容之外不返回任何其他 html。这在返回 JSON 时很有帮助,因为您根本不希望其中包含任何其他 html/文本,否则 jQuery 将无法识别它。 你是对的,我没有表达自己的权利。但是,如果您的控制器属于display(),则会调用相应的视图。而不是 view.html.php -> view.raw.php 将被加载。我没有看到你的格式使用逻辑,如果你返回 JSON,调用 format=json... 是合乎逻辑的,但每个人都有自己的实践和约定。祝你好运

以上是关于使用jQuery通过Joomla MVC组件更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 组件中的 PHP MVC

Joomla 组件自动更新

Joomla 3 MVC 平台 12.1 自定义组件模板覆盖

设计一个新的 Joomla 组件

Joomla:如何显示非 MVC 组件的菜单特定参数

Joomla 2.5 组件更新