-->

使用Ajax更新phpBB的模板变量运行PHP函数(run php function using a

2019-10-29 08:45发布

注:这里有很多细节,所以如果有人需要这样的精简版,我很高兴来概括。

我试图运行在我的PHP文件中的函数,这将反过来,更新模板变量。 作为一个例子,在这里是一个这样的功能:

function get_vehicle_makes()
{
$sql = 'SELECT DISTINCT make FROM phpbb_vehicles
        WHERE year = ' . $select_vehicle_year;

$result = $db->sql_query($sql);

while($row = $db->sql_fetchrow($result))
{
    $template->assign_block_vars('vehicle_makes', array(
        'MAKE'    => $row['make'],
    ));
}
$db->sql_freeresult($result);
}

我知道,这个功能工作。 我试图访问该功能在我的Javascript:

function updateMakes(pageLoaded) {
    var yearSelect = document.getElementById("vehicle_year");
    var makeSelect = document.getElementById("vehicle_make");
    var modelSelect = document.getElementById("vehicle_model");

    $('#vehicle_make').html('');

    $.ajax({ url: '/posting.php',
            data: {action: 'get_vehicle_makes'},
            type: 'post',
            success:function(result)//we got the response
            {
            alert(result);
            },
            error:function(exception){alert('Exception:'+exception);}
    });
    <!-- BEGIN vehicle_makes -->
        var option = document.createElement("option");
        option.text = ('{vehicle_makes.MAKE}');
        makeSelect.add(option);
    <!-- END vehicle_makes -->

    if(pageLoaded){
        makeSelect.value='{VEHICLE_MAKE}{DRAFT_VEHICLE_MAKE}';
        updateModels(true);
    }else{
        makeSelect.selectedIndex = -1;
        updateModels(false);
    }
}

在我的JavaScript的部分...

<!-- BEGIN vehicle_makes -->
        var option = document.createElement("option");
        option.text = ('{vehicle_makes.MAKE}');
        makeSelect.add(option);
<!-- END vehicle_makes -->

...是一个块循环,将循环通过块变量,vehicle_makes,在PHP功能设置。 这个工程在加载页面,因为加载的页面,就是我试图做一个Ajax调用new.php,所有的PHP在加载时该文件运行。 不过,我需要的功能再次运行,以更新块变量,因为它会改变基于HTML的选择变化。 我不知道这种类型的块循环是常见的。 我了解他们,因为他们与我已经安装在我的网站,phpBB的论坛使用。 (我看在这个帮助他们的支持论坛)。 我认为另一种可能的解决办法是将返回一个数组,但我想如果可能粘到块变量为一致起见。

这是在读$ _ POST的PHP代码位,并调用PHP函数:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];

    //Get vehicle vars - $select_vehicle_model is used right now, but what the heck.
    $select_vehicle_year = utf8_normalize_nfc(request_var('vehicle_year', '', true));
    $select_vehicle_make = utf8_normalize_nfc(request_var('vehicle_make', '', true));
    $select_vehicle_model = utf8_normalize_nfc(request_var('vehicle_model', '', true));

    switch($action) {
    case 'get_vehicle_makes' :
        get_vehicle_makes();
        break;
    case 'get_vehicle_models' :
        get_vehicle_models();
        break;
    // ...etc...
    }
}

这是运行在阿贾克斯的JavaScript:

function updateMakes(pageLoaded) {
    var yearSelect = document.getElementById("vehicle_year");
    var makeSelect = document.getElementById("vehicle_make");
    var modelSelect = document.getElementById("vehicle_model");

    $('#vehicle_make').html('');

    $.ajax({ url: '/posting.php',
            data: {action: 'get_vehicle_makes'},
            type: 'post',
            success:function(result)//we got the response
            {
            alert(result);
            },
            error:function(exception){alert('Exception:'+exception);}
    });
    <!-- BEGIN vehicle_makes -->
        var option = document.createElement("option");
        option.text = ('{vehicle_makes.MAKE}');
        makeSelect.add(option);
    <!-- END vehicle_makes -->

    if(pageLoaded){
        makeSelect.value='{VEHICLE_MAKE}{DRAFT_VEHICLE_MAKE}';
        updateModels(true);
    }else{
        makeSelect.selectedIndex = -1;
        updateModels(false);
    }
}

JavaScript的运行,并且AJAX会成功。 我检查网络选项卡和控制台选项卡,并做了多项测试,以确认。 看来,块变量没有被设置。 就是我尝试做甚至可能吗? 我有一种感觉,得到这个答案,我们需要知道更多关于phpBB的模板引擎,以及它如何与这些模板变量工作。 而且,我只想澄清,我觉得术语“模板变量”是特定的phpBB。 这是他们使用的PHP设置,通过HTML访问的变量和JavaScript文件术语。 这是通过所谓的“模板”一类的phpBB,和一个名为“assign_block_vars”功能。 我不知道究竟是如何的工作。

如果有人这样做了的phpBB,或有任何想法,我将不胜感激。

Answer 1:

想我找到了问题。 在我的PHP的开始,我有一个include语句包括含有连接到数据库类的PHP文件。 在声明$result = $db->sql_query($sql);$db在这个其他PHP文件中设置。 我并不完全明白,但正因为如此, $db是我的功能范围之外的get_vehicle_makes() 我不得不创建一个类我的PHP文件中,并通过$db作为参数来使用功能:

class vehicle {

    public function __construct($db)
    {
        $this->db = $db;
    }

function get_vehicle_makes()
{
    $sql = 'SELECT make FROM phpbb_vehicles
            WHERE year = ' . $select_vehicle_year;  
    $result = $this->db->sql_query($sql);

希望这可以帮助。



文章来源: run php function using ajax to update phpBB template variable