Надеюсь это поможет.

ЧАНИЕ: здесь много деталей, поэтому, если кому-то понадобится сжатая версия, я с удовольствием подведу итоги.

Я пытаюсь запустить функцию в моем 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, или есть какие-либо идеи, я был бы признателен.