HINWEIS: Es gibt eine Menge von Details hier, also wenn jemand eine verkürzte Version von diesem benötigt, ich bin glücklich, zusammenzufassen.PHP-Funktion mit Ajax zu aktualisieren phpBB Vorlage Variable
Ich versuche, eine Funktion in meiner PHP-Datei auszuführen, die wiederum eine Vorlagevariable aktualisieren wird. Als Beispiel, hier ist eine solche Funktion:
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);
}
Ich weiß, dass diese Funktion funktioniert. Ich versuche, diese Funktion in meinem Javascript für den Zugriff auf mit:
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);
}
}
Der Abschnitt in meinem Javascript ...
<!-- BEGIN vehicle_makes -->
var option = document.createElement("option");
option.text = ('{vehicle_makes.MAKE}');
makeSelect.add(option);
<!-- END vehicle_makes -->
... ist ein Block Schleife und schlingt sich durch die Blockvariable, vehicle_makes , eingestellt in der PHP-Funktion. Dies funktioniert beim Laden der Seite, weil die Seite, die geladen wird, die new.php ist, mit der ich versuche, einen Ajax-Aufruf auszuführen, und das gesamte PHP wird in dieser Datei beim Laden ausgeführt. Allerdings muss die Funktion erneut ausgeführt werden, um diese Blockvariable zu aktualisieren, da sie sich aufgrund einer Auswahländerung im HTML-Code ändert. Ich weiß nicht, ob diese Art von Blockschleife üblich ist. Ich lerne über sie, da sie mit einem Forum verwendet werden, das ich auf meiner Website phpBB installiert habe. (Ich habe in ihren Support-Foren nach Hilfe gesucht.). Ich denke, eine andere mögliche Lösung wäre, ein Array zurückzugeben, aber ich würde gerne an der Blockvariable bleiben, wenn es aus Konsistenzgründen möglich wäre.
Dies ist das Stück Code in PHP, die die $ _POST, und rufen Sie die PHP-Funktion lautet:
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...
}
}
Und das ist das Javascript, um die Ajax zu laufen:
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);
}
}
Die Javascript wird ausgeführt, und der Ajax wird erfolgreich sein. Ich habe die Registerkarte "Netzwerk" und die Registerkarte "Konsole" überprüft und mehrere Tests durchgeführt, um dies zu bestätigen. Es scheint, dass die Blockvariable nicht gesetzt ist. Ist das, was ich versuche, überhaupt möglich? Ich habe das Gefühl, dass wir, um diese Antwort zu erhalten, mehr über die Template-Engine von phpBB wissen müssen, und wie es mit dieser Template-Variable funktioniert. Außerdem, um es klarzustellen, denke ich, dass der Begriff "Template-Variable" spezifisch für phpBB ist. Es ist der Begriff, den sie für in PHP festgelegte Variablen verwenden, auf die HTML- und JavaScript-Dateien zugreifen. Dies funktioniert über eine phpBB-Klasse namens 'template' und eine Funktion namens 'assign_block_vars'. Ich weiß nicht genau, wie das funktioniert.
Wenn jemand dies für phpBB getan hat, oder irgendwelche Ideen hat, würde ich es begrüßen.
ohne Lesen der oben genannten Post und nur mit dem Titel arbeiten, bekomme ich das Gefühl, das PHP-Skript sollte einen Wert zentral gespeichert aktualisieren; in einer Datenbank oder vielleicht eine Text-, XML-, JSON-Datei. Die Variable in der phpBB-Vorlage sollte danach diesen Wert von diesem Speicher erhalten. – coderodour
Ich finde die Funktion 'assign_block_vars' und bestätige. – Jordan
Ich habe die Funktion gefunden, aber es ist schwer zu verstehen. phpBB verwendet einen Template-Parser, und ich denke, es braucht irgendwo in der Funktion spielen. – Jordan