使用 Ajax 将数据加载到 Joomla 3.1 组件中的


Using Ajax to Load Data into a <div> In a Joomla 3.1 Component

中。

我一直在试图解决这个问题一段时间,尽管我在网上找到了各种例子,但还是设法完全混淆了,因为似乎没有一个与我想要做的事情完全匹配。

我有一个正在构建的Joomla组件,并且在前端只有一个视图。 在默认模板("默认.php")中,将创建两个divs。 一个包含项目列表,另一个为空白。 我有代码可以让我单击列出的项目之一并返回该项目独有的 ID。 然后,我想获取该 ID 并在 Ajax 调用中使用它,以从数据库中的表中检索数据项。

该组件称为"com_pub",它应该显示酒吧列表和每个酒吧的信息。

我有一个名为控制器的文件夹(即'com_pub/controllers'),其中我有一个名为'pubitems.php'的控制器,它只是扩展了JController类:

<?php
defined('_JEXEC') or die("Resricted Access!");
class PubControllerPubitems extends JController
{
}
?>

当我显示初始页面时,这工作正常

我在前端的"controllers"文件夹中创建了一个新的控制器,名为"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";
?>

在我的"默认.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"警报显示"已完成:未找到",HTTPFox显示这是一个404 error

所以我认为这意味着 Ajax 调用甚至没有到达"content_response"文件,并且 url 中的某些内容是错误的。 潜在的问题是我并没有真正了解 url 的构造(可能还有其他问题 - 我仍在学习)。 我尝试更改 url 中的各种元素,但没有任何成功。

我也不清楚我是否正确设置了控制器和其他文件。 似乎有许多不同的方法可以做到这一点,我所看到的很多内容都与其他帖子相矛盾,让我非常困惑。

我很抱歉这是一篇这么长的帖子,但我试图尽可能清楚地说明我正在做什么以及到目前为止我做了什么。 真正了解Joomla 3.1的人对此的任何指导将不胜感激。


这是基于我在 Lodder 的非常有用的评论之后所做的额外工作的更新,他在 URL 中发现了错误。 不确定我是否应该以这种方式这样做,但如果我不是,有人可能会告诉我。

更正 URL 后,我根据反复试验和更多网络搜索进行了其他一些更改:

1)我摆脱了对模板的引用(tmpl=content_response),因为我突然意识到我正在尝试使用jQuery将ajax调用的结果插入现有页面,因此不想加载不同的模板。

2)我更改了url的"task"元素,以包含控制器的名称以及我正在调用的函数(因此task=pubitems。检索内容,而不仅仅是任务=检索内容)。

3)我删除了网址的"dataType=json"部分,但保留了"format=raw"。

4)我创建了一个名为pubitems的新控制器.raw.php来保存RetrieveContent函数。

5)我在警报中添加了一些信息,以查看是否可以获得有关ajax进程的更多信息。

所以现在我只在默认的模板中.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="这是一个测试"行,我会得到从 ajax 调用返回的"这是一个测试",一切都运行良好。 如果我注释掉它,我什么也得不到,所以当 ajax 调用从默认.php模板发出时,或者在 pubitems.raw.php 控制器中的函数中发出时,它仍然存在问题。 我仍在努力弄清楚这一点,但欢迎任何额外的帮助。

我终于通过不断的反复试验和大量使用谷歌来解决这个问题。

控制器如下所示:

<?php
defined('_JEXEC') or die("Resricted Access!");
class PubControllerPubitems extends JControllerForm
{
public function RetrieveContent()
{
$input = JFactory::getApplication()->input;
$cont_num = $input->get('pub_num', '', 'post');
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__pub'); 
$query->where('pubid = ' . $pub_num); 

$db->setQuery($query); 
if ($db->getErrorNum()) {
     $return_Data = $db->getErrorMsg();
     $return_data = "Database Error";
     }
 else 
    {
    $list = $db->loadObjectList();
    foreach ($list as $item) {
    pub_txt = $item->info;
    $return_data = "Database Access Succeeded";
    $return_data = $pub_txt;
    }
    }
echo($return_data);
}
}
?>

我现在发现应该捕获数据库错误的方式在 Joomla 3.1 中被弃用,它们应该作为异常处理,但除此之外,这个版本工作正常。

我重复了模板中的整个脚本部分,以便清楚地了解是否有其他人想做同样的事情:

<script>
jQuery(".toc li").click(function(){
var data_to_send = {pub_num: this.id};
url = 'index.php?option=com_pub&controller=pubitems&task=pubitems.RetrieveContent&format=raw';
var jqxhr = jQuery.ajax(url,{
data: data_to_send
    })
    .done(function(result) {
    alert("Success: " + jqxhr.status + " " + jqxhr.statusCode() + " " + jqxhr.statusText);
    jQuery('#name-box').empty();
    $pub_txt = jqxhr.responseText;
    jQuery('#name-box').text($pub_txt);
    })
.fail(function(result) {
alert("Error: " + jqxhr.status + " " + jqxhr.statusCode() +" " + jqxhr.statusText);
})
.always(function(result) {
    alert("Finished: " + jqxhr.responseText);
});
});
</script>

留在警报中,因为我发现在我试图弄清楚发生了什么时,这些警报非常有用。

我改变了很多东西并尝试了它们,但最终我认为关键的事情是:

我在调用 RetrieveContent 函数时包含了控制器的名称,因此它是 task = pubitems。检索内容。

我改变了对数据进行编码的方式。 这很难从我在网上找到的信息中弄清楚,我最终通过反复试验到达了那里。

我停止尝试通过将其包含在 url 中来发送数据。相反,我将其单独包含在 ajax 调用 'data: data_to_send' 中。 在我想出一种为有效的 ajax 调用编码数据的方法之前,我就这样做了。

我希望这对其他人有所帮助。 我花了太长时间来完成这个,当然,现在我已经完成了它看起来很简单,但希望这将为其他人节省大量时间。

您应该指明 JInput 请求的数据类型。

$cont_num = $input->get('pub_num', 'INT', 'post');

永远不要信任输入,即使你使用 CSRF 令牌,你仍然应该强制使用类型。现在可能不需要它,但这是个好习惯(也是我的编码指南中的要求)。