2012-11-20 35 views
8

这是我所得到的时候我打电话给我的Ajax请求的屏幕截图,一个Ajax请求:如何使的Joomla组件

enter image description here

我如何只运行任务,而不打印整个页面?这是我的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"); 
}); 

}); 
+1

你是什么意思“没有打印整个页面”?要不打印任何东西?另外,你不会显示完整的Ajax请求,它应该以})结束; 。 –

+0

看截图。我没有写完整的Ajax,因为我不认为这很重要 – Jonuux

+0

我没有看到预期的输出是什么?应该发生什么? –

回答

28

不要去退出或死亡是,Joomla!有处理这些东西的好方法。

下面的答案在Joomla! 2.5 & 3(对于1.5也可以工作)。


一般

URL的任务需要看起来像这样:

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

你不是创建将使用视图控制器,假设某,其中将包含文件view.raw.html(与普通视图文件相同)。

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

/controller.php

public function abc() 
{ 
    // Set view 
    JRequest::setVar('view', 'Abc'); 
    parent::display(); 
} 

/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); 
    } 
} 

/views/abc/tmpl/default.php

<?php 

echo "Hello World from /views/abc/tmpl/default.php"; 

注:这是解决办法,如果我不得不返回HTML(这是更清洁和遵循的Joomla逻辑)我会使用。要返回简单的JSON数据,请参阅下面的介绍如何将所有内容放入控制器。


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

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

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

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

如果返回JSON,它可能是有意义的使用format=jsonabc.json.php。在Joomla 2.5。我有一些问题得到这个选项的工作(不知何故输出已损坏),所以我用原始。


如果您需要生成有效的JSON响应,检查出的文档页面Generating JSON output

// 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); 

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


安全

现在Ajax请求正在工作,请不要关闭该页面还没有。参见下文。

不要忘记检查请求伪造。 JSession::checkToken()在这里派上用场。阅读关于如何添加CSRF anti-spoofing to forms


多语种网站文档

它可能发生,如果你没有在发送请求的语言的名称是,Joomla不会翻译所需的语言字符串。

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


Joomla 3.2中的新功能! - Joomla! Ajax Interface

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

+2

好帖子!有些事情要知道有时Joomla麻烦显示原始的AJAX ... http://forum.joomla.org/viewtopic.php?p=1915019。出于这个原因,我不得不从我的控制器输出我的ajax调用的输出,而不是将它传递给视图。 – Cleanshooter

+1

@Cleanshooter - 我已经添加了一些关于处理子控制器的信息。我在组件中使用了ajax,到目前为止我还没有遇到任何问题。如果您有任何问题,请随时在这里发布一些代码,那么我们可以收集关于Joomla!的更多高质量信息。作品。谢谢。 –

+0

@ValentinDespa - 您的view.raw.php代码中存在拼写错误。 parrent :: display($ tpl)应该是parent :: display($ tpl)。 – mozami

0

如果您只是想将响应输出包含在某个HTML元素中,请将format = raw追加到您的URL中,如上所述。然后,你可以有这样的控制器功能:

function abc(){ 

//... handle the request, read variables, whatever 
print "this is what I want to place in my html"; 

} 

Ajax响应,你会打印输出的一切/回荡在控制器。