尝试在 Slim 3 中使用数据表什么是最好的 way/structure 来进行 ajax 调用

Trying to use datatables in Slim 3 what is the best way/structure to make the ajax call

我正在尝试在 Slim 3 的视图中使用数据表。对我来说,使用数据表最简单的方法是调用 ajax,因为我不知道如何传递 json 对象到来自控制器的数据表。我不确定在哪里打 ajax 电话。我应该在我的 App 文件夹中创建另一个文件夹并将其命名为 ajax 吗?还是我对这个数据表的处理全错了?

这是我的控制器

<?php


namespace App\Controllers\Dashboards;

use App\Controllers\Controller;

class AdminDashboardController extends Controller
{
    public function listAction($request, $response)
    {
        return $this->view->render($response,'dashboards/admin.html.twig');
    }
}

这是我的观点

{% extends 'base.html.twig' %}

{% block body %}
    <h1>this will be the admin dash</h1>

{% endblock %}

{% block javascripts %}
    {{parent()}}
    <script>
        $(document).ready(function() {
            $.ajax({
                url: "../src/App/ajax/getAll.php",
                type: "GET",
                dataType: 'json',
            }).done(function (result) {
                console.log(result);
            }).fail(function (jqXHR, textStatus, error) {
                console.log("getArchivedPo: " + error);
            });
        });
        </script>
{% endblock %}

这是我的 ajax

<?php

$conn = $container['db'];
//$conn = $container->get('db');

$admin = array();

if ($conn) {
    $sql = "SELECT trannum, 
                   trantype, 
                   tranbatch, 
                   trandate, 
                   username, 
                   trvnum, 
                   tranaccount, 
                   tranamt, 
                   transtatus, 
                   trannumdocs 
            FROM   BD.BDPTV 
                   INNER JOIN BD.BDUSERS 
                           ON BD.BDUSERS.usernumber = BD.BDPTV.tranuser 
            WHERE  transtatus NOT IN ( 3, 7, 5 )";

    $stmt = db2_prepare($conn, $sql);

    if ($stmt) {
        $result = db2_execute($stmt);
        if ($result) {
            while ($row = db2_fetch_array($stmt)) {
                $admin[] = array(
                    'trnum' => $row[0],
                    'trtyp' => $row[1],
                    'trbatch' => $row[2],
                    'trdate' => $row[3],
                    'usrnam' => $row[4],
                    'trvnum' => $row[5],
                    'tracct' => $row[6],
                    'tramt' => $row[7],
                    'trvsts' => $row[8],
                    'numdoc' => $row[9]
                );
            }
        } else {
            error_log(db2_stmt_errormsg($stmt));
        }
    } else {
        error_log(db2_stmt_errormsg($stmt));
    }
} else {
    error_log(db2_conn_errormsg());
}

$admin['data'] = $admin;
echo json_encode($admin);

另外,我现在收到这个错误 <b>Notice</b>: Undefined variable: container in <b>/www/slim/htdocs/bd/src/App/ajax/getAll.php</b> on line <b>3</b><br /> {"data":[]}

所以我应该把我的 ajax 放在别的地方吗?

我的路线

<?php

$app->get('/', 'HomeController:indexAction')->setName('home');
$app->get('/admindash', 'AdminDashboardController:listAction')->setName('admindash');
$app->get('/ajaxrequest', [AdminDashboardController::class, 'ajax'])->setName('myAjaxRequest');
$app->get('/poentry', 'PoController:entryAction')->setName('poentry');
$app->get('/poedit', 'PoController:editAction')->setName('poedit');
$app->get('/poarchive', 'PoController:archiveAction')->setName('poarchive');
$app->get('/voucherwithpo', 'VoucherController:entryWithPoAction')->setName('voucherwithpo');
$app->get('/voucherwithoutpo', 'VoucherController:entryWithOutPoAction')->setName('voucherwithoutpo');
$app->get('/edituser', 'UserController:editAction')->setName('edituser');
$app->get('/adduser', 'UserController:addAction')->setName('adduser');
$app->get('/poarchivedash', 'ArchivePoDashboardController:listAction')->setName('poarchivedash');
$app->get('/voucherarchivedash', 'ArchiveVoucherDashboardController:listAction')->setName('voucherarchivedash');
$app->get('/notedash', 'NoteDashboardController:listAction')->setName('notedash');

首先是关于您收到的错误消息:您需要在定义容器的地方包括 slim 启动的部分,$container['db'] 否则无法找到。

但是现在没有额外 php 文件的解决方案:

您应该为 ajax 请求添加路由,您也可以在 AdminDashboardController 中添加路由

class AdminDashboardController {
    // listAction function

    function ajax($request, $response) {
        // copy from your ajax file 
        return $response->withJson($admin);
    }
}

然后添加路由:

$app->get('/ajaxrequest', 'AdminDashboardController:ajax')->setName('myAjaxRequest');

然后您可以在您的 twig 文件中引用该路由

$(document).ready(function() {
    $.ajax({
        url: "{{ path_for('myAjaxRequest') }}",
        type: "GET",
        dataType: 'json',
    }).done(function (result) {
        console.log(result);
    }).fail(function (jqXHR, textStatus, error) {
        console.log("getArchivedPo: " + error);
    });
});