我一直在尝试解决这个问题,尽管我在网上找到了各种示例,但都设法完全混淆了,因为似乎没有一个与我想要做的完全匹配。
我有一个正在构建的 Joomla 组件,前端有一个视图。在默认模板('default.php')divs
中创建了两个。一个包含项目列表,另一个是空白的。我有代码可以让我单击列出的项目之一并返回该项目唯一的 ID。然后我想获取该 ID 并在 Ajax 调用中使用它来从数据库中的表中检索数据项。
该组件称为“com_pub”,它应该显示一个 pub 列表和每个 pub 的信息。
我有一个名为控制器的文件夹(即“ com_pub/controllers
”),其中我有一个名为“pubitems.php”的控制器,它只是扩展了 JController 类:
<?php
defined('_JEXEC') or die("Resricted Access!");
class PubControllerPubitems extends JController
{
}
?>
当我显示初始页面时,这可以正常工作
我在前端的“控制器”文件夹中创建了一个新控制器,名为“pubitems.json.php”,其中包含以下代码:
<?php
defined('_JEXEC') or die;
class ContentFetchPubitems extends JController
{
public function RetrieveContent()
{
echo(json_encode($data));
return;
}
}
我还在“tmpl”文件夹中创建了一个文件“content_response”:
<?php
echo "Dummy Response";
?>
在我的“default.php”文件(位于视图的“tmpl”文件夹中)中,我有一个脚本,它使用 JQuery 从列表中获取选定的 id,然后进行 Ajax 调用:
<script>
jQuery(".tocli").click(function(){
alert(this.id);
url = 'index.php&option=com_pub&controller=pubitems&task=RetrieveContent&tmpl=content_response&format=raw&dataType=json';
var jqxhr = jQuery.ajax(url,function(result){
alert("success");
})
.fail(function() {
alert( "Error: " );
})
.always(function() {
alert( "Finished: " + jqxhr.statusText);
});
});
</script>
Ajax 调用所指向的函数显然需要做的不仅仅是回显一条消息,并且当我让基本的东西正常工作时,它会从数据库中获取数据。
jQuery 确实返回了变量“this.id”,这在警报中正确显示,但我现在什至没有尝试在 Ajax 调用中发送它——我只是想在一个基本的水平(如果这有意义的话)。
其他警报有效,但 '.success' 没有被触发,而 '.always' 则显示 'Finished : Not Found' 并HTTPFox
显示它是一个404 error
.
所以我认为这意味着 Ajax 调用甚至没有到达“content_response”文件,并且 url 中的某些内容是错误的。根本的问题是我并没有真正了解 url 的构造(可能还有其他问题 - 我还在学习)。我尝试更改 url 中的各种元素,但没有任何成功。
我也不清楚我是否正确设置了控制器和其他文件。似乎有很多不同的方法可以做到这一点,而且我所看到的很多内容都与其他帖子相矛盾,让我很困惑。
对于这篇长篇文章,我深表歉意,但我试图尽可能清楚地说明我正在尝试做的事情以及到目前为止我所做的事情。非常感谢真正了解 Joomla 3.1 的人提供的任何指导。
这是基于我在发现 URL 中的错误的 Lodder 的非常有用的评论之后所做的额外工作的更新。不确定我是否应该以这种方式这样做,但如果我不是,可能有人会告诉我。
更正 URL 后,我根据反复试验和更多网络搜索进行了其他几项更改:
1) 我摆脱了对模板 (tmpl=content_response) 的引用,因为我突然意识到我正在尝试使用 jQuery 将 ajax 调用的结果插入到现有页面中,因此不想加载不同的模板。
2) 我更改了 url 的 'task' 元素以包含控制器的名称以及我正在调用的函数(因此 task=pubitems.RetrieveContent 而不仅仅是 task=RetrieveContent)。
3) 我去掉了 url 的 'dataType=json' 部分,但留下了 'format=raw' 。
4) 我创建了一个名为 pubitems.raw.php 的新控制器来保存 RetrieveContent 函数。
5) 我在警报中添加了一些信息,看看是否可以获得有关 ajax 进程的更多信息。
所以现在我只有 default.php 模板中的脚本,它看起来像:
<script>
jQuery(".toc,li").click(function(){
alert(this.id);
var data_to_send = {'id': this.id};
alert(data_to_send);
url = 'index.php?option=com_pub&controller=pubitems&task=pubitems.RetrieveContent&data=data_to_send&format=raw';
var jqxhr = jQuery.ajax(url)
.done(function(result) {
alert("Success: " + jqxhr.status + " " + jqxhr.statusCode() + " " + jqxhr.statusText);
})
.fail(function(result) {
alert("Error: " + jqxhr.status + " " + jqxhr.statusCode() +" " + jqxhr.statusText);
})
.always(function(result) {
alert("Finished: " + result);
});
});
</script>
新控制器如下所示:
<?php
defined('_JEXEC') or die("Resricted Access!");
class PubControllerPubitems extends JControllerForm
{
public function RetrieveContent()
{
$app = JFactory::getApplication();
$post_data = $app->input->get('id');
// $post_data="This is a test";
echo($post_data);
}
}
?>
如果我不注释掉 $post_data="This is a test" 行,我会从 ajax 调用返回“This is a test”,并且一切正常。如果我把它注释掉,我什么也得不到,所以无论是从 default.php 模板发出的,还是在 pubitems.raw.php 控制器的函数中,ajax 调用仍然有问题。我仍在努力解决这个问题,但欢迎任何额外的帮助。