ПРИМЕЧАНИЕ. Здесь много деталей, поэтому, если кому-то нужна сжатая версия, я с удовольствием подведу итог.
Я пытаюсь запустить функцию в моем 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 под названием «шаблон» и функцию «assign_block_vars». Я точно не знаю, как это работает.
Если бы кто-то сделал это для phpBB или имел какие-то идеи, я был бы признателен.
Думаю, я нашел проблему. В начале моего 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);
Надеюсь это поможет.