0

我正在使用 Osclass 分类脚本,试图提醒 ajax 调用返回的消息。保存在我的主题文件夹中的 ajax-test.php 文件包含

<?php
$name = $_GET["name"];
echo "I am " . $name
?>

我的 JavaScript 函数代码是

function findName() {
    var name = "Jhon";
    $.ajax({
        method: "POST",
//        url: "oc-content/themes/bender/ajax-test.php",
        url: 'http://127.0.0.1/osclass/index.php?page=ajax&action=custom&ajaxfile=ajax-test.php',
        data: { name : name },
        success: function (data) {
            alert(data);
        },
    })
}

有人告诉我我做错了什么吗?它提醒 {"error" => "ajaxFile 不存在"}

注意:它适用于带注释的代码行

4

3 回答 3

0

不幸的是,这并不是 ajax.php 自定义操作的工作方式。

首先,page=ajax&action=custom 不适用于主题,仅适用于插件,因为它会ajaxfile通过执行以下操作在插件文件夹中搜索:

$filePath = osc_plugins_path() . $ajaxfile; // eg. /oc-content/plugins/$ajaxfile

然后,您必须传入ajaxfile插件的名称才能工作。如果您使用的是 Madhouse Messenger 插件,您可以执行以下操作:

page=ajax&action=custom&ajaxfile=madhouse_messenger/main.php

但是,从 3.3 开始,在使用 时page=ajax&action=custom,您不再使用ajaxfile参数,而是使用route参数。您可以在此处查看路线的工作原理以及此处一些路线示例

于 2016-06-25T07:40:47.503 回答
0

在你的主题中functions.php

添加如下内容:

//name of your custom ajax request
$my_custom_ajax_request_name = 'doSomethingCool';

osc_add_hook('ajax_' . $my_custom_ajax_request_name, $my_custom_ajax_request_name);

function doSomethingCool()
{
    // set default response
    $response = [
        'status' => false,
        'msg'    => 'Default Error Message...',
    ];

    // token protection
    // read more about csrf token:
    // https://dev.osclass.org/2013/02/19/make-your-plugins-more-secure-with-anti-csrf-functions/
    osc_csrf_check();

    // get request parameters
    $param1 = Params::getParam('param1');
    $param2 = Params::getParam('param2');

    // do some logic here ex: check if user is logged in
    if (osc_is_web_user_logged_in()) {
        $response['status'] = true;
        $response['msg']    = 'User is logged in. ;-) ' . $param1 . ' ' . $param2 . '! ' . osc_logged_user_name();
    } else {
        $response['status'] = false;
        $response['msg']    = 'User is not logged in. :-(';
    }

    // return json response
    header('Content-Type: application/json');
    echo json_encode($response);
    exit;
}

模板文件中的某些位置,例如header.phpfooter.php或者您需要的所有其他内容...

<a data-param1="hello" data-param2="world" href="#" id="make-an-ajax-request">
    Make an AJAX Request!
</a>
<script>
//here we hold some usefull info for easy access
    var mySite = window.mySite || {};
    mySite.base_url = '<?php echo osc_base_url(true); ?>';
    mySite.csrf_token = '<?php echo osc_csrf_token_url(); ?>';

    $(function(){

        $('#make-an-ajax-request').on('click', function(e){
                e.preventDefault();
            // name of our custom ajax hook 
            var ajax_hook = 'doSomethingCool';
            // get parameters
            var param1 = $(this).data('param1');
            var param2 = $(this).data('param2');
            // build axjxa url
            var url = mySite.base_url + '?page=ajax&action=runhook&hook='+ajax_hook+'&'+mySite.csrf_token;

            //build data 
            var data = {
                param1 : param1,
                param2 : param2
            };

            $.ajax({
                type: 'POST',
                dataType: 'json',
                data: data,
                url: url
            }).done(function (data) {
                console.log(data);
                if (data.status) {

                } else {

                }
            });
        });

        });
</script>

OSCLASS方式

请注意,当前从主题页面执行 ajax 请求的 osclass 方法是调用 http://example.com/?page=ajax&action=runhook&hook=MY_HOOK_FUNCTION_NAME 并注册它,就像osc_add_hook('ajax_MY_HOOK_FUNCTION_NAME', 'MY_HOOK_FUNCTION_NAME');可选但非常推荐使用csrf token您可以像我为 url 所做的那样实现的,或者osc_csrf_token_form()直接调用形式。

非 OSCLASS 方式

只需在您的主题或您想要的任何地方创建一个文件,并确保将其放入其中,<?php require_once __DIR__ . RELATIVE_PATH_TO_OC_LOAD_FILE . 'oc-load.php'; ?>然后将您的逻辑构建到其中。

于 2017-06-05T09:29:53.000 回答
0

您正在使用

>  method: "POST",

在 ajax 那么你为什么要使用 GET 呢?

$name = $_GET["name"];

使用 Post 获得价值。

$name = $_POST["name"];

于 2016-06-17T06:36:47.203 回答