Как использовать ajax для запроса функции хуков WHMCS и получения требуемых возвращаемых данных? - PullRequest
0 голосов
/ 29 сентября 2019

Я прочитал демонстрационный код WHMCS для разработки модуля обеспечения:

код интерфейса, review.tpl .

код сервера, модуль обеспечения. php .

, но мой код следует за верхним. Я хочу использовать ajax для запроса, поэтому вся страница не будет перерисовываться.


Мой внешний код ajax:

    jQuery.ajax({
        url: url,
        type: "POST",
        data: {
            ...
            qn_action: "bmc"

        },
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        success: function (data, textStatus){

            console.log('ldl:',data)  // pay attention I want to console.log the return data. I wish it be the PHP return data's `templateVariables`.
            jQuery('.powercontrol').removeClass('disabled');
            jQuery(i_id).css('display', 'none');

            jQuery('#powerstatus-spinner').css('display', 'none'); // Status loading
        },
        error: function(jqXHR, e) {
            var msg = '';
            if(jqXHR.status==0){
                msg = 'You are offline!!\n Please Check Your Network.';
            }else if(jqXHR.status==404){
                msg = 'Requested URL not found.';
            }else if(jqXHR.status==500){
                msg = 'Internal Server Error.<br/>'+jqXHR.responseText;
            }else if(e=='parsererror'){
                msg = 'Error: Parsing JSON Request failed.';
            }else if(e=='timeout'){
                msg = 'Request Time out.';
            }else {
                msg = 'Unknow Error.<br/>'+x.responseText;
            }

            console.log('error: '+jqXHR.responseText);  // I wil get the error logs
            console.log('Error msg: '+msg);
        }
    })

в моем бэкэнд-коде PHP:

function qidicatedserver_ClientArea(array $params)
{

    // Determine the requested action and set service call parameters based on
    // the action.

    $qn_action = isset($_REQUEST['qn_action']) ? $_REQUEST['qn_action'] : '';

    $tblclients_id = isset($_REQUEST['tblclients_id']) ? $_REQUEST['tblclients_id'] : '';  


    $bmc_action = "";
    $server_name = "";
    $templateFile = 'templates/overview.tpl';
    $bmc_result = "";


    if($qn_action == "bmc"){

        $resp = array(
            'tabOverviewReplacementTemplate' => $templateFile,
            'templateVariables' => array(
                "status"=>200,
                "data"=>"my test return data"
            )
        );



        return $resp;


    }


    try {
        // Call the service's function based on the request action, using the
        // values provided by WHMCS in `$params`.


        return array(
            'tabOverviewReplacementTemplate' => $templateFile,
            'templateVariables' => array(
                'data' => array(
                    "status"=>"200",
                    "data" => array(
                        "bmc_result" => null
                    )
                ),
            ),
        );


    } catch (Exception $e) {

        //echo $e;
        // Record the error in WHMCS's module log.
        logModuleCall(
            'qidedicatedserver',
            __FUNCTION__,
            $params,
            $e->getMessage(),
            $e->getTraceAsString()
        );
        // In an error condition, display an error page.
        return array(
            'tabOverviewReplacementTemplate' => 'templates/error.tpl',
            'templateVariables' => array(
                'usefulErrorHelper' => $e->getMessage(),
            ),
        );

    }

}

при выполнении запроса ajax возникнет ошибка, выполните приведенный ниже код:

console.log('error: '+jqXHR.responseText);  // I wil get the console log: `error: <!DOCTYPE html> \n<html lang="en">\n<head>\n    <meta char) ....` the html is the whole page's HTML
console.log('Error msg: '+msg);  // the console log: `Error msg: Error: Parsing JSON Request failed.`

Итак, там должна быть проблема, моя проблема заключается в том, как использовать ajax для HTTP-запроса в модуле пользовательской инициализации WHMCS, но я пытаюсь получить сбой, как верхний. (Я пытался использовать запрос формы PHP, там можно получить правильные данные, но там будет заново обновлять всю страницу, это не мое желание, я не знаю, какую страницу обновлять)

Кто может сказать мнеКак использовать AJAX для запроса функции подключения WHMCS и вернуть правильные данные, как мое желание?


Вы можете найти более подробную информацию о модуле обеспечения WHMCS там .


EDIT-01

Iпопытался изменить код возврата PHP следующим образом:

if($qn_action == "bmc"){

    $resp = array(
        'tabOverviewReplacementTemplate' => $templateFile,
        'templateVariables' => json_encode(array(
            "status"=>200,
            "data"=>"dasdas"
        ))
    );



    return $resp;


}

, но все равно эта ошибка.

1 Ответ

0 голосов
/ 30 сентября 2019

Поместите код Ajax / PHP в отдельный файл, а не в метод _ClientArea , предположим, что ваш модуль называется 'mail_service' , затем создайте файл в:

\ modules \ Servers \ mail_service \ for_json.php

for_json.php

<?php
#define("ADMINAREA", true);
define("CLIENTAREA", true);
#define("SHOPPING_CART", true);
require_once(__DIR__ . '/../../../init.php');
require_once(ROOTDIR . '/includes/dbfunctions.php');
#require(ROOTDIR . "/includes/orderfunctions.php");
#require(ROOTDIR . "/includes/domainfunctions.php");
#require(ROOTDIR . "/includes/configoptionsfunctions.php");
#require(ROOTDIR . "/includes/customfieldfunctions.php");
#require(ROOTDIR . "/includes/clientfunctions.php");
#require(ROOTDIR . "/includes/invoicefunctions.php");
#require(ROOTDIR . "/includes/processinvoices.php");
#require(ROOTDIR . "/includes/gatewayfunctions.php");
#require(ROOTDIR . "/includes/modulefunctions.php");
#require(ROOTDIR . "/includes/ccfunctions.php");
#require(ROOTDIR . "/includes/cartfunctions.php");
#include_once(ROOTDIR . '/includes/clientareafunctions.php');

#use WHMCS\ClientArea;
#use WHMCS\Database\Capsule;
#use WHMCS\Smarty ;
file_put_contents("C:/xampp_my/htdocs/my/sss.txt",var_export($_POST,true));
if(isset($_POST['qn_action']) && $_POST['qn_action']=="bmc")
{
    // do your job
    //header('Content-type: application/json; charset=utf-8');
    header("Content-Type: application/json", true);

    header('HTTP/1.0 200 OK');
    echo '{"menu": {"id": "file","value": "File","popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"},{"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}';
}
?>

и используйте следующийJS код:

jQuery.ajax({
    url: "/modules/servers/mail_service/for_json.php",
    type: 'POST',
    data: {qn_action: 'bmc'},
    cache: false,
    dataType: 'json',
    success: function (data, textStatus){console.log('ldl:',data)},
    error: function(jqXHR, e){
        var msg = '';
        if(jqXHR.status==0){
            msg = 'You are offline!!\n Please Check Your Network.';
        }else if(jqXHR.status==404){
            msg = 'Requested URL not found.';
        }else if(jqXHR.status==500){
            msg = 'Internal Server Error.<br/>'+jqXHR.responseText;
        }else if(e=='parsererror'){
            msg = 'Error: Parsing JSON Request failed.';
        }else if(e=='timeout'){
            msg = 'Request Time out.';
        }else {
            msg = 'Unknow Error.<br/>'+x.responseText;
        }
        console.log('error: '+jqXHR.responseText);  // I wil get the error logs
        console.log('Error msg: '+msg);
    }
})
...