注:这里有很多细节,所以如果有人需要这样的精简版,我很高兴来概括。
我试图运行在我的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,或有任何想法,我将不胜感激。