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

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

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

 coderodour27 нояб. 2017 г., 19:09
не читая ни одного из вышеприведенных постов и просто работая с заголовком, я чувствую, что скрипт php должен обновлять значение, сохраненное в центральном хранилище; в базе данных или, возможно, текстовый, XML, JSON-файл. После этого переменная в шаблоне phpBB должна получить это значение из хранилища.
 Jordan27 нояб. 2017 г., 19:29
Я нашел функцию, но это трудно понять. phpBB использует синтаксический анализатор шаблонов, и я думаю, что он занимает место где-то в функции.
 Jordan27 нояб. 2017 г., 19:16
Я найду функцию assign_block_vars и подтвердю.
 Jordan27 нояб. 2017 г., 19:39
Я знаю о параметрах функции и правильно использую функцию, но до сих пор не знаю точно, где она хранит переменную, как спрашивал coderodour, в файле txt, xml или json. Несмотря на это, он не обновляет мою переменную шаблона.

Ответы на вопрос(1)

я нашел проблему. В начале моего 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);

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

Ваш ответ на вопрос