2011-07-25 41 views
1

我擁有的是一個Drupal表單,用PHP編寫,當然有兩個選擇器。第一個是Drupal主題列表,第二個是可用區域列表。在Drupal中,某些主題有一些區域可用於在選擇主題時放入塊,因此我希望區域選擇器由與選定主題關聯的可用選項填充。如何在使用jQuery的Drupal 6中創建一個動態表單?

我希望我的JavaScript文件使用jQuery來監聽主題選擇器,以便在更改時更新區域選擇器。

我有模塊PHP的設置,以便有一個值的二維數組,使數組[]主題'] =陣列()的可能的區域值。就像這樣:

Array 
(
[garland] => Array 
    (
     [left] => left 
     [] => 
     [right] => right 
    ) 

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

被此代碼完成的:

$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; 
    } 

這裏是形式:

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

我真正需要做的是讓二維數組$ regionOptions進入javascript!我嘗試了drupal_to_js和drupal_add_js,但它不起作用!

的JavaScript是這個至今:

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

這是我在drupal_add_js嘗試(在PHP代碼):

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將javascript直接添加到頁面的輸出中。您可以使用它來設置變量,就像您在JavaScript中編寫代碼時一樣。

這是我的模塊中的php代碼,它將javascript和我的JS文件「simple_block_selector.js」放在同一個目錄中。

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

正如你可以在代碼中看到,你無論你通常會在JavaScript中使用引號(「」),只要用「drupal_add_js」,然後鍵入。當你必須將PHP變量傳遞給它時,你可以使用串聯(在字符串和變量之間使用'。')來附加它。如果它是空白的,我將其分配爲顯示「無」,以便用戶可以更好地理解選擇。 'inline'表示腳本應該放在內聯中。

然後在我的JavaScript文件中,我首先刪除第二個選擇器中的所有選項。然後根據所選主題選擇特定區域數組。然後它解析通過該陣列添加每個值到另一個選擇器,如下所示:

$(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,並將它們設置爲窗體上的默認值。它還會查找與塊的默認主題相關聯的區域,並在頁面首次顯示時顯示它們。我會粘貼完整的代碼,但我覺得沒有必要,因爲這些部分解釋了我如何回答我的問題。

相關問題