注意:这里有很多细节,所以如果有人需要这个的浓缩版本,我很高兴总结一下。
我正在尝试在我的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做过这个,或者有任何想法,我会很感激。
答案 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);
希望这有帮助。