如何在Joomla组件中创建Ajax请求

Jon*_*uux 8 ajax joomla

这是我调用ajax请求时获得的屏幕截图:

在此输入图像描述

如何在不打印整个页面的情况下仅运行任务?这是我的ajax电话:

$.ajax
({
type: "POST",
url: "index.php?option=com_similar&task=abc",
    data: {
        id: id,
        name: name,
        similar_id: similar_id,
    },
cache: false,
success: function(html)
{
$("#flash").fadeOut("slow");
$("#content"+similar_id).html(html);
} 
});
});

$(".close").click(function()
{
$("#votebox").slideUp("slow");
});

});
Run Code Online (Sandbox Code Playgroud)

Val*_*spa 28

不要退出或死,Joomla!有它处理这些东西的好方法.

以下答案在Joomla中进行了测试!2.5和3(1.5.可能也有效).


一般

您的任务URL需要如下所示:

index.php?option=com_similar&task=abc&format=raw

你创建将使用视图的控制器,比方说Abc,它将包含文件view.raw.html(与普通视图文件相同).

下面是生成原始HTML响应的代码:

/controller.php

public function abc() 
{
    // Set view
    JRequest::setVar('view', 'Abc');
    parent::display();
}
Run Code Online (Sandbox Code Playgroud)

/views/abc/view.raw.php

<?php
defined('_JEXEC') or die;

jimport('joomla.application.component.view');

class SimilarViewAbc extends JView
{
    function display($tpl = null)
    {
        parent::display($tpl);
    }
}
Run Code Online (Sandbox Code Playgroud)

/views/abc/tmpl/default.php

<?php

echo "Hello World from /views/abc/tmpl/default.php";
Run Code Online (Sandbox Code Playgroud)

注意:如果我必须返回HTML(它更干净并遵循Joomla逻辑),这是我将使用的解决方案.要返回简单的JSON数据,请参阅下面的内容如何将所有内容放入控制器中.


如果你让你的Ajax请求的子控制器,如:

index.php?option=com_similar&controller=abc&format=raw

比你的子控制器名称(原始视图)需要abc.raw.php.

这也意味着您将/可能有2个名为Abc的子控制器.

如果你返回JSON,使用format=json和可能是有意义的abc.json.php.在Joomla 2.5.我有一些问题让这个选项工作(不知何故输出已损坏),所以我用raw.


如果需要生成有效的JSON响应,请查看文档页面生成JSON输出

// We assume that the whatver you do was a success.
$response = array("success" => true);
// You can also return something like:
$response = array("success" => false, "error"=> "Could not find ...");

// Get the document object.
$document = JFactory::getDocument();

// Set the MIME type for JSON output.
$document->setMimeEncoding('application/json');

// Change the suggested filename.
JResponse::setHeader('Content-Disposition','attachment;filename="result.json"');

echo json_encode($response);
Run Code Online (Sandbox Code Playgroud)

您通常会将此代码放在控制器中(您将调用一个模型,该模型将返回您编码的数据 - 这是一种非常常见的情况).如果需要进一步了解,还可以创建一个JSON视图(view.json.php),与原始示例类似.


安全

既然Ajax请求正在运行,请不要关闭页面.参见下文.

不要忘记检查伪造请求.JSession::checkToken()在这里派上用场.阅读有关如何向表单添加CSRF反欺骗的文档


多语言网站

如果您不在请求中发送语言名称,Joomla可能不会翻译您想要的语言字符串.

考虑以某种方式将lang param附加到您的请求中(例如&lang=de).


Joomla 3.2的新功能!- Joomla!Ajax接口

Joomla现在提供了一种在插件或模块中处理Ajax请求的轻量级方法.你可能想要使用Joomla!Ajax接口,如果您还没有组件,或者您需要从已有的模块发出请求.

  • 好帖子!需要注意的事情有时Joomla在ajax的显示器上遇到麻烦... http://forum.joomla.org/viewtopic.php?p=1915019.我必须从我的控制器回显我的ajax调用的输出,而不是因为这个原因将它传递给视图. (2认同)