【问题标题】:run php function using ajax to update phpBB template variable使用ajax运行php函数来更新phpBB模板变量
【发布时间】:2017-11-27 18:06:02
【问题描述】:

注意:这里有很多细节,所以如果有人需要精简版,我很乐意总结一下。

我正在尝试在我的 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 一起使用。 (我已经查看了他们的支持论坛以寻求帮助。)。我认为另一种可能的解决方案是返回一个数组,但为了保持一致性,如果可能的话,我想坚持使用 block 变量。

这是 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 文件访问的术语。这通过一个名为“模板”的 phpBB 类和一个名为“assign_block_vars”的函数来工作。我不知道它是如何工作的。

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

【问题讨论】:

  • 没有阅读上述任何帖子,只是使用标题,我觉得 php 脚本应该更新集中存储的值;在数据库或文本、xml、json 文件中。此后,phpBB 模板中的变量应该从该存储中获取该值。
  • 我会找到函数'assign_block_vars'并确认。
  • 我找到了这个功能,但是很难理解。 phpBB 使用模板解析器,我认为它可以在函数的某个地方发挥作用。
  • 我知道函数参数,并正确使用函数,但仍然不知道它存储变量的确切位置,正如 coderodour 所询问的那样,无论是在 txt、xml 还是 json 文件中.无论如何,它似乎并没有更新我的模板变量。

标签: javascript php jquery ajax phpbb3


【解决方案1】:

认为我找到了问题所在。在我的 PHP 开始时,我有一个 include 语句来包含 PHP 文件,该文件包含用于连接到数据库的类。在语句$result = $db-&gt;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);

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2019-11-14
    • 1970-01-01
    • 2015-04-21
    • 2020-08-05
    相关资源
    最近更新 更多