Надеюсь это поможет.
ЧАНИЕ: здесь много деталей, поэтому, если кому-то понадобится сжатая версия, я с удовольствием подведу итоги.
Я пытаюсь запустить функцию в моем 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. Это работает при загрузке страницы, потому что загружаемая страница - это new.php, к которому я пытаюсь сделать Ajax-вызов, и весь 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...
}
}
И это JavaScript для запуска Ajax:
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 с именем 'template' и функцию 'assign_block_vars'. Я не знаю точно, как это работает.
Если кто-то сделал это для phpBB, или есть какие-либо идеи, я был бы признателен.