2017-11-27 3 views
0

注:ここにはたくさんの詳細がありますので、要約すれば要約できます。phpBBテンプレート変数を更新するためにajaxを使用してphp関数を実行してください

私は自分の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); 
    } 
} 

<!-- BEGIN vehicle_makes --> 
     var option = document.createElement("option"); 
     option.text = ('{vehicle_makes.MAKE}'); 
     makeSelect.add(option); 
<!-- END vehicle_makes --> 

を...ブロック変数によるブロックループとなりますループであり、vehicle_makes PHP関数で設定します。これは、ロードするページがAjax呼び出しをしようとしているnew.phpであり、ロード時にすべてのPHPがそのファイルで実行されるため、ページのロード時に機能します。しかし、ブロック変数を更新するには、HTML内の選択変更に基づいて変更されるため、関数を再度実行してブロック変数を更新する必要があります。このタイプのブロックループが一般的であるかどうかはわかりません。私は私のサイトphpBBにインストールしたフォーラムで使用されているので、それらについて学んでいます。 (私はサポートフォーラムでこれについてのヘルプを見てきました)。私は別の可能な解決策は、配列を返すだろうと思うが、私は一貫性のために可能であればブロック変数に固執したいと思います。

これは、$ _POSTを読み、PHPのコードのビットで、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です:

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ファイルによってアクセスされます。これは、 'template'という名前のphpBBクラスと、 'assign_block_vars'という関数を通して動作します。私はその仕事の仕組みを正確には知らない。

もし誰かがphpBBのためにこれをやったことがある、または何か考えがあるなら、私はそれを感謝します。

+0

上記の投稿を読んでいなくても、タイトルを使って作業するだけで、私はPHPスクリプトが集中的に保存された値を更新するべきだと感じる。データベースまたはおそらくはテキスト、xml、jsonファイルに保存されます。その後、phpBBテンプレートの変数は、そのストレージからその値を取得する必要があります。 – coderodour

+0

私は関数 'assign_block_vars'を探して確認します。 – Jordan

+0

私はこの機能を見つけましたが、理解するのは難しいです。 phpBBはテンプレートパーサーを使用しており、関数内のどこかで演奏すると思います。 – Jordan

答えて

0

問題が見つかりました。私のPHPの冒頭では、includeステートメントを使用して、データベースに接続するためのクラスを含むPHPファイルをインクルードします。文$result = $db->sql_query($sql);には、この他のPHPファイルに$dbが設定されています。私は完全に理解できませんが、そのために$dbは私の機能の範囲外でしたget_vehicle_makes()。このことができます

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

希望を:私は私のPHPファイル内のクラスを作成し、使用して関数にパラメータとして$dbに合格しなければなりませんでした。

関連する問題