【问题标题】:jQuery Ajax using PHP function returns HTML codejQuery Ajax 使用 PHP 函数返回 HTML 代码
【发布时间】:2014-04-09 16:34:09
【问题描述】:

我正在使用Joomla,我打算通过代码检查Joomla用户表的数据库,以便执行注册。

好吧,3 天前我正在尝试使用调用 php 函数的 ajax 函数。 发生的情况是,当我尝试从服务器(php 函数)读取响应时,只能获取 HTML 页面。不知道发生了什么。看了几篇文章和问题,还是不知道怎么回事。

我正在做的是当在给定字段中检测到写入时,执行检查代码是否存在于数据库中的功能

我不确定我是否可以正确访问我的 validatePartner.php

这是我的脚本:

<script language="javascript" type="text/javascript">
jQuery(document).ready(
    function($){
        $('#jform_username').bind('input', function() {
            alert("FINE");

            var data =" hello world";
            var data2=" hello all";
            $.ajax({
                url: 'validatePartner.php',
                data: {'q': data,'z':data2},
                type: "POST",
                success: function(data) {
                    alert("Here: " + data);
                }

            });
        });
    });
</script>

这是我的 validatePartner.php:

<?php
 function myfunction() {
    $myvar = $_POST['q']." how are you?";
    $myvar2 = $_POST['z'];
    echo $myvar."\n".$myvar2;

 }

myfunction();
?>

我在同一个目录中有这个 teo 文件。

感谢您的帮助!

解决方案:

使用@jonasfh 提示,我得到了我需要的东西! 我用他告诉我的两个文件和我使用的 ajax 函数创建了一个组件:

<script language="javascript" type="text/javascript">
. . .
$.ajax({
    url: '?option=com_validatepartner&format=raw',
    . . .
</script>

改为:

<script language="javascript" type="text/javascript">
. . .
$.ajax({
    url: '?option=com_validatepartner&tmpl=json',
    . . .
</script>

感谢您的帮助!

【问题讨论】:

  • 你得到的输出是什么?
  • 我得到 HTML 代码页:

标签: javascript php jquery ajax joomla


【解决方案1】:

您可能应该制作一个组件来返回 @MrCode 所概述的 ajax 调用。组件可以超级简单,但至少需要 2 个文件(可能更多?):一个 xml 定义文件和入口点,如下所示:

/administrator/components/com_validatepartner/validatepartner.xml 和 /components/com_validatepartner/validatepartner.php

xml 文件的语法和格式描述为here。文件 validatepartner.php 可以很简单:

defined('_JEXEC') or die;
#get a database object
$db=JFactory::getDbo(); 
$db->setQuery('select * from #__thetable'); 
$list=$db->loadAssocList(); 
# you probably want to return some json-data or something: 
echo json_encode($list);

现在还有一个技巧:在您的模板文件夹中添加以下文件: json.php

包含:

defined('_JEXEC') or die;
<jdoc:include type="component" />

现在您可以通过以下方式测试您的组件:

index.php?option=com_validatepartner #result 在普通 tmpl 文件中

index.php?option=com_validatepartner&tmpl=json # 使用你的 json.php tmpl 文件

最后调用类似于@MrCode 建议的文件,稍作改动

$.ajax({
    url: 'index.php?option=com_validatepartner&tmpl=json',
    data: {'q': data,'z':data2},
    type: "POST",
    success: function(data) {
        alert("Here: " + data);
    }

});

还记得在 joomla 后端注册组件,方法是转到 extensions->extension-manager,然后是 Discovery。

问候乔纳斯

编辑:将上述代码和示例中的布局更改为 tmpl。还更改了一些文件布局等。

【讨论】:

  • 感谢您的详细回复。我会尝试你和@MrCode 的建议,然后我会说它是否有效。
  • 对不起这个问题......在 xml 文件中,由于我没有使用“开发 MVC 组件/开发基本组件”中建议的所有文件,所以我有点困惑我需要输入什么: index.htmlhelloworld.php
  • 我认为您只需将一个 php 文件放入站点部分。你可以试试。使用发现功能安装时,我认为 xml 文件并不重要,因为文件已经在正确的位置。
  • 好的!我得到了我的结果,但似乎它被封装在 HTML 中。在 ajax 函数中,我使用了 url: index.php?option=com_validatepartnerindex.php?option=com_validatepartner&tmpl=json 不返回任何内容)。对于回复的数量,我深表歉意。
  • 嗯,不知道为什么当你使用 tmpl=json 时什么都没有显示。试试 tmpl=component.这应该使用 /templates/system 中的 component.php 文件(或者在你的模板中被覆盖,如果你有一个 component.php - 文件)。 component.php 显示用最少 html 包裹的组件。
【解决方案2】:

您对 validatePartner.php 的请求可能正在重写到 Joomla!索引.php。在任何情况下,您都应该创建一个原生 Joomla!可以通过 Joomla! 调用的组件! index.php,而不是创建一个单独的脚本文件。您单独的 PHP 脚本将无法访问 Joomla!数据库或会话等。

然后它会被称为:

$.ajax({
    url: 'index.php?option=com_myComponent&task=validatePartner',
    data: {'q': data,'z':data2},
    type: "POST",
    success: function(data) {
        alert("Here: " + data);
    }

});

【讨论】:

  • 嗨!感谢您的回复。我的 validatePartner.php 位于模板文件中(index.php 和其他文件在哪里)并且可以访问数据库,因为我之前对其进行了测试。我在创建表单的注册文件(Joomla 的基本文件)中使用脚本,但可能在数据交换中出现了一些故障。
  • 你好。所以你的建议是创建一个组件,我把我的 php 函数,我的脚本保留在当前的表单文件中?而这个php文件可以访问数据库吗?谢谢!
  • 是的,您的组件将拥有对框架的完全访问权限,并且您可以在任何视图或模板上的任何位置通过 ajax 调用它。
  • 在 joomla 中发出一个简单的 ajax 请求并返回 1 真的很难吗?
【解决方案3】:

我遇到了同样的问题。我正在使用 joomla 组件中的 jQuery 处理依赖下拉列表。作为调用结果的第二个下拉列表显示为空并加载 html 页面。最后我找到了解决方案:必要的文件应该放在 components 目录之外。结果,我们将无法获取整个 html 页面,但在该页面上,我们必须在外部包含库。

这里是库:

define( '_JEXEC', 1 );    
define('JPATH_BASE', dirname(__FILE__));   
define( 'DS', DIRECTORY_SEPARATOR );   
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );   
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );  
$mainframe =& JFactory::getApplication('site');  
$mainframe->initialise();   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2017-05-27
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多