2011-01-27 85 views
0

使用Drupal 6.20。將表單元素作爲Drupal中的數組使用Drupal

我們可以建立某種形式的內容是這樣的: -

<input type="select" name="somename[]"><option>ohai</option></select> 

,然後循環通過他們在PHP與

foreach ($somename as $name) { ... } 

我試圖做同樣在Drupal。我有一個樣式相同的select-elements列表。元素的數量可能會在將來發生變化,因此表單處理必須是動態的。

如果我使用上面的方法,每個元素將覆蓋前面的元素,這樣最終只有一個元素被打印到屏幕上。我不能寫name="somename[$someid]",因爲這不會將$somename解釋爲一個數組。
Drupal支持這個還是我在做worng?

此外,有沒有其他的選擇來實現相同的?

回答

5

下面是一個實現你正在嘗試做的事情的例子。


function test_form(&$form_state) 
{ 
    $form = array(); 
    $delta = 0; 
    $form["test_field"]["#tree"] = TRUE; 
    $form["test_field"][$delta++] = array(
     "#type" => "textfield", 
     "#title" => "Title", 
    ); 
    $form["test_field"][$delta++] = array(
     "#type" => "textfield", 
     "#title" => "Title", 
    ); 
    $form["test_field"][$delta++] = array(
     "#type" => "textfield", 
     "#title" => "Title", 
    ); 
    $form["submit"] = array(
     "#type" => "submit", 
     "#value" => "Submit", 
    ); 
    return $form; 
} 

在你提交&驗證功能,您將獲得價值在你的字段名的數組。

請記住,在您的元素上啓用#tree是此方法的關鍵。另外Drupal的表單API是我使用過的最好的表單框架之一。

希望這會有所幫助。

+0

我希望我把_1初始以前見過這個表單字段名稱,然後增加新的JavaScript創建的通過字符串操作... bleh ... – 2013-10-04 03:45:13

2

我知道這個問題得到了答案,但我認爲有一個更簡單的方法是不那麼冗長,你只需要改變字段的數量(或在獲取表單時將它作爲參數傳遞)。

function test_form() 
{ 
    $form['#tree'] = TRUE; // This is to prevent flattening the form value 
    $no_of_fields = 5;  // The number of fields you wish to have in the form 

    // Start adding the fields to the form 
    for ($i=1; $i<=$no_of_fields; $i++) 
    { 
     $form['somename'][$i] = array(
      '#title' => t('Test field no. '.$i), 
      '#type' => 'textfield', 
     );  
    } 
    // Add the submit button 
    $form["submit"] = array(
     "#type" => "submit", 
     "#value" => "Submit", 
    ); 
} 

當提交你的$ form_state [「值」]將包含(除其他事項外)你的表單元素值作爲數組:

'somename' => 
    array 
     1 => string '' (length=0) 
     2 => string '' (length=0) 
     3 => string '' (length=0) 
     4 => string '' (length=0) 
     5 => string '' (length=0) 
相關問題