2009-10-08 49 views
1

以下數組是通過將xml轉換爲數組(使用xml2array)生成的。然而,它並不是我需要在Drupal 6表單中使用optgroup的正確格式。Drupal 6窗體和optgroup數組

Array (
    [root] => Array ([attr] => Array ([id] => 1) [label] => Array ([value] => My Root) 
     [node] => Array (
     [0] => Array ([attr] => Array([id] => 2) [label] => Array([value] => Category 1) 
      [node] => Array(
       [0] => Array ([attr] => Array ([id] => 14) [label] => Array ([value] => Sub-Category 1)) 
       [1] => Array([attr] => Array ([id] => 15) [label] => Array([value] => Sub-Category2)) 

我認爲該陣列已過於降低到這種格式與ID值完整的子類別。然而,我不能確認這與drupal文檔,因爲他們沒有提及任何有關將值分配給選項。

Array (
    [Category 1] => Array(
     [14] => Sub-Category 1 
     [15] => Sub-Category 2 
    ) 
) 

所以我的問題是:1)是什麼,是爲Drupal optgroups正確的陣列格式與我指定的值和2)我怎麼降低我的陣列相匹配?

回答

7

1) 一個選項組陣列的正確格式爲(我將使用作爲一個例子狀態的列表):

$state_list = array(
    'AL'=>"Alabama", 
    'AK'=>"Alaska", 
    'AZ'=>"Arizona", 
    'AR'=>"Arkansas", 
    ... 
); 

這將顯示狀態名稱的列表,可以通過狀態首字母作爲鍵訪問。

爲了使用亞羣,你會修改上面的一樣:

$state_list = array(
    'A'=> array(
    'AL'=>"Alabama", 
    'AK'=>"Alaska", 
    'AZ'=>"Arizona", 
    'AR'=>"Arkansas", 
    ... 
), 
    'C'=> array(
    'CA'=>'California', 
    'CO'=>'Colorado', 
    ... 
), 
    ... 
); 

所以,你需要以下格式的轉換數據給出:

$options = array(
    'My Root' => array(
    'Category 1' => array(
     '14' => 'Sub-Category 1', 
     '15' => 'Sub-Category 2' 
    ) 
) 
) 

但是,如果' My Root'是選擇元素的名稱,請使用此名稱(我會告訴您下面每個元素的表單定義):

$options = array(
    'Category 1' => array(
    '14' => 'Sub-Category 1', 
    '15' => 'Sub-Category 2' 
    ) 
) 

您的形式API定義是這樣的:

function mymodule_form() { 
    $options = array(
    'My Root' => array(
     'Category 1' => array(
     '14' => 'Sub-Category 1', 
     '15' => 'Sub-Category 2' 
    ) 
    ) 
); 
    ... 
    $form['Select Box Name'] = array(
    '#type' => 'select', 
    '#title' => 'Select a Category', 
    '#options'=> $options, 
); 
    ... 
    return $form; 
} 

或者這樣,如果「我的根」是選擇元素的名稱,而不是它的一個類別:

function mymodule_form() { 
    $options = array(
    'Category 1' => array(
     '14' => 'Sub-Category 1', 
     '15' => 'Sub-Category 2' 
    ) 
); 
    ... 
    $form['My Root'] = array(
    '#type' => 'select', 
    '#title' => 'Select a Category', 
    '#options'=> $options, 
); 
    ... 
    return $form; 
} 

在這定義,你的子類別使用整數鍵控 - 我不確定這是你想要的。很多時候Drupal開發人員使用具有相同鍵和值的數組(例如'[CA] => [CA]')來使事情變得更容易。

這種格式的一個副作用是'類別1'本身不是可選的(因爲你的XML源擁有「根」和「類別1」的鍵,在我看來他們可以在他們的先前我不確定是否HTML選項組子類別標籤甚至是,所以我不知道這是否是一個問題。

+1

+1 - 很好。 – 2009-10-08 18:12:17

+0

優秀 - 我收到的最簡潔的答案之一! – EddyR 2009-10-09 06:15:17

0

我不相信CCK可以開箱即可做分層選項。你可能會減少到具有字段和選項的組,但我不知道這是否足夠通用。

至於分配值更容易的選項。

the docs

值:在陣列的形式(噸( '顯示值1')中,t( '顯示值2'))或陣列( 'return_value1'=>噸的陣列('Display Value 1'),'return_value2'=> t('Display Value 2'))(如果需要特定的返回值)。

所以你上面的代碼段會是這樣的:

$form['Category 1'] = array(
    '#type' => 'radios', 
    '#title' => t('Category 1'), 
    '#options' => array(
         '14' => t('Sub-Category 1'), 
         '15' => t('Sub-Category 2') 
        ), 
); 
+0

我不使用CCK只是一個直的_form掛鉤它確實接受表單我想我應該考慮一個jQuery解決方案... – EddyR 2009-10-08 09:36:56

+0

如果通過「指定值」的意思是「輸入表單」,[分層選擇](http:// drupal.org/project/hierarchical_select)具有魔力,但CCK集成僅限於內容分類。提供整合將有助於社區和無效複製該模塊中的jQuery工作。 – Grayside 2009-10-08 16:02:19