使用ajax运行php函数来更新phpBB模板变量

时间:2017-11-27 18:06:02

标签: javascript php jquery ajax phpbb3

注意:这里有很多细节,所以如果有人需要这个的浓缩版本,我很高兴总结一下。

我正在尝试在我的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 -->

...是一个块循环,将循环遍历在PHP函数中设置的块变量vehicle_makes。这在加载页面时起作用,因为加载的页面是我正在尝试对其进行Ajax调用的new.php,并且在加载时所有PHP都在该文件中运行。但是,我需要再次运行该函数来更新该块变量,因为它将根据HTML中的选择更改而更改。我不知道这种类型的块循环是否常见。我正在了解它们,因为它们与我在我的网站上安装的论坛一起使用,phpBB。 (我已经在他们的支持论坛上寻求帮助了。)。我认为另一个可能的解决方案是返回一个数组,但是为了保持一致,我想坚持使用块变量。

这是php中的一些代码,它读取$ _POST,并调用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...
    }
}

这是运行Ajax的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文件访问。这通过一个名为'template'的phpBB类和一个名为'assign_block_vars'的函数来工作。我不知道究竟是怎么做的。

如果有人为phpBB做过这个,或者有任何想法,我会很感激。

1 个答案:

答案 0 :(得分:0)

认为我发现了问题。在我的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);

希望这有帮助。