2011-07-25 2 views
1

私が持っているのは、Drupalフォームです。もちろん、PHPで書かれています。セレクタは2つあります。最初のものはDrupalテーマのリストを持ち、2番目のものは利用可能な地域のリストです。 Drupalでは、特定のテーマにはブロックを入れるための領域があり、そのテーマを選択すると、選択されたテーマに関連付けられているオプションによってリージョンセレクタが設定されます。jQueryを使用してDrupal 6で動的フォームを作成するにはどうすればよいですか?

javascriptファイルでjQueryを使用してテーマセレクタを聴きたいので、変更するとリージョンセレクタが更新されます。

array ['theme'] = array()のような値の2D配列が存在するように、モジュールPHPを設定しました。

このコードによって行われます
Array 
(
[garland] => Array 
    (
     [left] => left 
     [] => 
     [right] => right 
    ) 

[zen] => Array 
    (
     [] => 
     [sidebar_first] => sidebar_first 
     [sidebar_second] => sidebar_second 
    ) 
) 

::私は本当にやらなければならないことは、2次元配列の$を得ることです

$form = array(); 
$form['title'] = array(
    '#type' => 'markup', 
    '#value' => '<br/><h4>Update block: <strong>'.$module.': '.$delta.'</strong></h4>' 
); 
$form['theme'] = array(
    '#title'   => 'Theme', 
    '#type'    => 'select', 
    '#options'   => drupal_map_assoc($themeOptions), 
    '#default_value'   => $currentTheme, 
); 
    $form['region'] = array(
    '#title'   => 'Region', 
    '#type'    => 'select', 
    '#options'   => array(''), 
    '#default_value' => $currentRegion, 
); 

$themeQuery = db_query('SELECT DISTINCT theme from {blocks}'); 
    while($row = db_fetch_object($themeQuery)){ 
     $regionQuery = db_query('SELECT DISTINCT region from {blocks} WHERE theme="%s"',$row->theme); 
    while($regions = db_fetch_object($regionQuery)){ 
     $regionOptions[$row->theme][$regions->region] = $regions->region; 
    } 
    $themeOptions[$row->theme] = $row->theme; 
    } 

そして、こちらのフォームである。このようなregionOptionsをjavascriptに追加する!私はdrupal_to_jsとdrupal_add_jsを試しましたが、うまくいかないでしょう!

javascriptのは、これまでのところ、この次のとおりです。ここで

$(document).ready(function(){ 
    $('#edit-theme').change(function(){ 
     alert(Drupal.settings.regions[$(this).val()]); 
    }); 
    }); 

は(PHPコード内)drupal_add_jsで私の試みです:

drupal_add_js(array('regions' => $regionOptions),'setting'); 

私がしようとすると、この機能は動作します:

drupal_add_js(array('regions' => 'test'),'setting'); 

そして、javascriptを呼び出してください:

alert(Drupal.settings.regions); 

警告メッセージは「テスト」です。

私はこの権利を頼んで欲しいと思います。

+0

これが役立つかどうか分かりませんが、Drupalには、あなたが活用できる組み込みのAjax機能がいくつかあります:http://drupal.org/node/752056 – nmc

+0

ありがとう!私はPHPとjQueryだけを使ってそれを行う方法を理解していました。私は以下のステップを説明しました – fishcx

答えて

0

よく分かりました。だから、知りたい人のために私の結果をここに分けたかったのです。

関数drupal_add_jsは、javacriptをページの出力に直接追加します。 javascriptでコーディングしている場合と同じように変数を設定するのにも使用できます。

私のモジュールには、同じディレクトリにある「simple_block_selector.js」という名前のJSファイルとともにjavascriptを追加するPHPコードがあります。

// creates outside array 
    drupal_add_js("var regions = new Array();",'inline'); 
    foreach($regionOptions as $t=>$theme){ 
     // creates new array for within regions array 
     drupal_add_js("var ".$t."= new Array();",'inline'); 
     drupal_add_js("regions['".$t."']=".$t.";",'inline'); 
     $counter = 0; 
     foreach($theme as $region){ 
      if($region != ''){ 
       drupal_add_js("regions['".$t."']['".$counter."'] = '".$region."';",'inline'); 
      } 
      else{ 
       drupal_add_js("regions['".$t."']['".$counter."'] = 'none';",'inline'); 
      } 
      $counter++; 
     } 
    } 
    drupal_add_js(drupal_get_path('module','simple_block').'/simple_block_selector.js'); 

あなたがコード内で見ることができるように、あなただけの「drupal_add_js」を使用して、あなたが正常にJavaScriptで引用符(「」)を使用してしまうどんなタイプ。 PHP変数を渡す必要があるときは、連結(文字列と変数の間に '。'を使用)を使用して連結します。それが空白の場合は、「none」を表示するように割り当てられたので、ユーザーはその選択肢をよりよく理解することができます。インラインでは、スクリプトをインラインに配置する必要があります。

私のjavascriptファイルでは、最初に2番目のセレクタのすべてのオプションを削除しています。次に、選択されたテーマに基づいて特定の領域配列を選択します。次に、その配列を解析して、各値を他のセレクタに追加します。

$(document).ready(function(){ 
$('#edit-theme').change(function(){ 
    $('#edit-region').find('option').remove(); 
    for(var i=0; i<regions[$(this).val()].length;i++) 
     { 
      $('#edit-region').append($('<option>').text(regions[$(this).val()][i])); 
     } 
}); 

});

セレクタのIDが分からない場合は、ページに移動して右クリックして[ソースを表示]を実行すると、IDとして与えられた内容を確認できます。

それだけです。私はモジュールのチェックをして、フォームの現在の値がブロックのIDに基づいているかどうかを確認し、フォームのデフォルトとして設定します。また、ブロックの既定のテーマに関連付けられている領域が検索され、ページが最初に表示されたときに領域が表示されます。私は完全なコードを貼り付けていましたが、これらのセクションで私の質問にどう答えたか説明しているので、必要ではないと感じました。

関連する問題