2017-11-27 3 views
0

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.

+0

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

+0

Ich finde die Funktion 'assign_block_vars' und bestätige. – Jordan

+0

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

Antwort

0

Denken Sie, ich habe das Problem gefunden. Zu Beginn meiner PHP-Version habe ich eine include-Anweisung, die die PHP-Datei enthält, die die Klasse für die Verbindung zur Datenbank enthält. In der Anweisung $result = $db->sql_query($sql); ist $db in dieser anderen PHP-Datei festgelegt. Ich verstehe das nicht ganz, aber deswegen lag $db außerhalb des Bereichs meiner Funktion get_vehicle_makes(). Ich hatte eine Klasse in meinem PHP-Datei zu erstellen, und übergeben $db als Parameter an die Funktion:

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); 

Hoffnung, das hilft.