【发布时间】: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