当前位置: 首页 > 知识库问答 >
问题:

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

陶朝明
2023-03-14

一段时间以来,我一直在试图弄明白这一点,尽管我在网上发现了各种各样的例子,但我还是完全弄糊涂了,因为似乎没有一个能完全符合我的意图。

我有一个Joomla组件,我正在构建,前端有一个单一的视图。在默认模板('default.php')中创建了两个div。一个包含项目列表,另一个为空白。我有代码,让我点击列出的项目之一,并返回该项目唯一的ID。然后,我想在Ajax调用中使用该ID,从数据库中的表中检索数据项。

该组件称为“com_pub”,它应该显示一个pub列表和每个pub的信息。

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

<?php
defined('_JEXEC') or die("Resricted Access!");

class PubControllerPubitems extends JController
{
}
?>

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

我在前端的“controllers”文件夹中创建了一个名为“pubitems”的新控制器。json。其中包含以下代码:

<?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调用中发送它——我只是尝试在基本级别上调用函数(如果这有意义的话)。

其他警报可以工作,但“警报”无效。成功“一个不会被触发,另一个不会被触发”。始终“一个显示”已完成:未找到,并且HTTPFox显示这是404错误。

因此,我认为这意味着Ajax调用甚至无法访问“content\u response”文件,并且url中出现了一些错误。潜在的问题是我没有真正了解url的构造(可能还有其他问题——我还在学习)。我尝试过更改url中的各种元素,但没有成功。

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

我为这篇文章太长而道歉,但我试图尽可能清楚地说明我正在努力做什么,以及到目前为止我已经做了什么。非常感谢真正了解Joomla 3.1的人在这方面的任何指导。

这是一个更新,基于我在Lodder发现网址错误后所做的额外工作。不确定我是否应该这样做,但如果我不是,可能会有人告诉我。

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

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

2) 我更改了url的“task”元素,以包含控制器的名称以及我正在调用的函数(因此task=pubitems.RetrieveContent,而不仅仅是task=RetrieveContent)。

3)我摆脱了'dataType=json'部分的url,但离开了格式=原始。

4)我创建了一个名为pubitems.raw.php的新控制器来保存检索内容功能。

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=“This is a test”行,我会从ajax调用中得到“This is a test”,并且一切都运行得很好。如果我把它注释掉,我什么也得不到,所以ajax调用在默认情况下发出时仍然有问题。php模板,或在pubitems中的函数中。未经加工的php控制器。我仍在努力想办法解决这个问题,但我欢迎任何额外的帮助。


共有2个答案

鲜于子琪
2023-03-14

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

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

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

苏淇
2023-03-14

通过不断的尝试和错误以及大量使用谷歌,我最终实现了这一目标。

控制器如下所示:

<?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函数时,我包含了控制器的名称,因此它是任务=pubitem。检索内容。

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

我不再试图通过在url中包含它来发送数据。相反,我将其单独包含在ajax调用data:data_to_send中。我这样做之前,我想出了编码数据的ajax调用工作的方法

我希望这对其他人有一些帮助。我花了很长时间才完成这个,当然,现在我已经完成了,看起来很简单,但希望这能为别人节省很多时间。

 类似资料:
  • 问题内容: 我正在尝试通过JQUERY AJAX调用来更新页面加载和选择菜单更改时的高图表。有以[[10,1228800000],[10,1228800000]]格式返回的数据。图表为空白,不对任何数据进行图形处理。 尝试了此处发布的几种解决方案,但没有一个有效。 有什么错误吗?提前致谢。编辑: 最新的代码仍然无法正常工作: 问题答案: 您必须使用文档中描述的系列对象的setData方法。你的情况

  • 问题内容: 我想在数据库中使用csv文件 问题答案: 由于SQLAlchemy的强大功能,我还在项目中使用了它。它的强大功能来自于与数据库“对话”的面向对象的方式,而不是硬编码难以管理的SQL语句。更不用说,它也快很多。 坦率地回答您的问题,是的!使用SQLAlchemy将数据从CSV存储到数据库中简直是小菜一碟。这是一个完整的工作示例(我使用了SQLAlchemy 1.0.6和Python 2.

  • 我刚接触Cassandra Spark,并尝试使用Spark主集群将数据从文件加载到Cassandra表。我遵循以下链接中给出的步骤 http://docs.datastax.com/en/datastax_enterprise/4.7/datastax_enterprise/spark/sparkImportTxtCQL.html 在第8步,数据显示为整数数组,但当我使用相同的命令时,结果显示为

  • 我在这里找过类似的帖子,但是我找不到符合我要求的帖子。我试图显示jQuery数据。在UI上,我得到日期参数,并对servlet进行ajax调用。servlet将处理并返回json数据。一旦我得到的数据,我想显示在数据表的结果。但是我的代码不起作用。我是新的数据。这是我的代码: servlet返回的json数据:

  • 问题内容: 我正在尝试通过一种称为的方法设置项目,到目前为止还可以。但是后来我从中创建了一个arrayList,但我不知何故找不到将这些信息存储到JTable中的方法。问题是我找不到设置固定行数的方法 这是我的代码: 上课开始联赛: 足球俱乐部课程: SportsClub课程(摘要): 最后是LeagueManager,它是一个接口: 有人能帮帮我吗?我已经尝试了好几天。谢谢。 问题答案: “问题

  • 我试图从一个名为的方法中设置项目,到目前为止还不错。但后来我从它创建了一个arrayList,不知何故,我找不到将这些信息存储到JTable中的方法。问题是我找不到设置固定行数的方法 下面是我的代码: